Hardware Description Language (HDL)
•
Para que precisamos de uma Linguagem de Descrição de
Hardware ?
•
Modelar, Representar e simular hardware digital
– Concorrência
– Paralelismo
– Valores de sinais no tempo
•
Construções especiais
– Transições (bordas) de valores de sinais
– Atrasos de propagação de sinais
– Verificação de condições temporais
Hardware Description Language (HDL)
•
A linguagem Verilog foi introduzida em 1985 pela Gateway Design Automation.
•
A Gateway foi comprada pela empresa Cadence Design Systems, em 1989,
que tornou a linguagem de domínio público em maio de 1990 com a formação
da Open Verilog International (OVI).
•
Hoje o Verilog é um padrão IEEE, já tendo duas extensões ou modificações:
Verilog-95 (padrão IEEE 1364-1995), Verilog 2001 (IEEE 1364-2001) e Verilog
2005 (IEEE 1364-2005).
•
O Verilog tem uma grande semelhança com a linguagem de programação C.
VERILOG HDL
unidade básica – o módulo
Módulo (module)
• Define terminais (pinos, portas) de entrada e saída
• Descreve a funcionalidade do circuito
VERILOG HDL
Módulo – Definição Geral
module <nome do módulo>
(declaração das portas);
…
declaração de variáveis;
…
descrição do comportamento
endmodule
VERILOG HDL
Módulo – Definição Geral
Exemplo:
module <nome do módulo>
( declaração das portas );
…
declaração de variáveis;
…
descrição do comportamento
endmodule
module meu_and
(output reg C,
input A, B);
always @ (A, B) begin
C = A & B; // & operador AND
end
endmodule
VERILOG HDL
Identificadores
A ... Z
a ... z
0 ... 9
Underscore
• O primeiro caractere do identificador não pode ser um dígito
Verilog diferencia letras maiúsculas de minúsculas
VERILOG HDL
Comentários em Verilog
// comentário de uma linha só
/* outra forma de comentário de uma linha */
/* inicio de comentário com múltiplas linhas
todo text é ignorado
termina com a linha abaixo
*/
Números
decimal, hexadecimal, octal, binario
Decimal sem sinal
Decimal com sinal
Cadeias de caracteres
"Delimite usando aspas numa mesma linha"
limitados a 1024 caracteres
VERILOG HDL
Modelos de Descrição
• Estrutural: descreve um circuito lógico através
da interligação dos componentes que os compõe.
• Fluxo de dados: descreve um circuito através
das funções booleanas que os compõe.
• Comportamental: descreve o circuito através
do comportamento do mesmo, na forma de um
algoritmo.
• RTL (Register Transfer Level): descreve o
circuito através do que acontece a cada transição
ativa do sinal de relogio
VERILOG HDL
Modelo estrutural
• Execução: Concorrente
• Formato: portas lógicas primitivas
Exemplo:
VERILOG HDL
f1
Exemplo somador completo:
module somador_completo_estrutural
(output Cout, S,
input A, B, Cin);
f2
f3
A
B
Cin
and
g1(f1, A, Cin), // saída sempre o primeiro parâmetro da instância (f1))
g2(f2, A, B),
g3(f3, B, Cin);
or
g4(Cout, f1, f2, f3);
xor
g5(S, A, B, Cin);
endmodule
VERILOG HDL
Modelo fluxo de dados
• Execução: Concorrente.
• Formato: assign net = expressão;
• A ordem das atribuições dentro do arquivo Verilog não tem efeito sobre a
execução.
Exemplo:
VERILOG HDL
Exemplo somador completo (fluxo de dados):
module soma_fluxo_de_dados
(output S, Cout,
input A, B, Cin);
assign S = A ^ B ^ Cin; // Soma
assign Cout = (A & B) | (A & Cin) | (B & Cin); // Cout
endmodule
VERILOG HDL
Modelo comportamental:
• Uso de instruções alto nível da linguagem (if, case, while, for)
• Uso do comando always
• Comandos dentro do procedimento always são executados sequencialmente
• O comando always é executado quando há uma mudança no valor lógico de um
sinal da lista de sensibilidade
• Formato do comando always:
always @ (a, b, c...)
begin
<comandos>
end
lista de sensibilidade (todas as entradas do circuito)
• Os comandos always são concorrentes
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
Tabela Verdade do Multiplexador
sel
out
0
a
1
b
a
b
Multiplexador
2X1
Algoritmo dp Comportamento do MUX
Se sel = 0 então out = a
Senão out = b
sel
out
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
Tabela Verdade do Multiplexador
sel
out
0
a
1
b
Descrição Verilog:
module comportamental_mux
(output reg out,
input a, b, sel);
always @(a,b, sel) begin
if (sel == 0)
out = a;
else
out = b;
end
endmodule
Símbolo do Mux:
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
Tabela Verdade do Multiplexador
sel
out
0
a
1
b
Equação booleana do Mux (2x1):
out = (~ sel & a) | (sel & b)
a
b
Multiplexador
2X1
sel
out
VERILOG HDL
Exemplo: Modelo Comportamental do Multiplexador
Tabela Verdade do Multiplexador
sel
out
0
a
1
b
Descrição Verilog:
module comportamental2_mux
(output reg out,
input a, b, sel);
Substitui a lista de sensibilidade
always @(*) begin
out = (~ sel & a) | (sel & b);
end
endmodule
VERILOG HDL
Exemplo:
Tabela Verdade do Somador Completo
A
B
Cin
S
Cout
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
VERILOG HDL
Instruções Condicionais (Instrução IF)
Formato:
if (condição)
// obs: usar BEGIN e END quando existir mais de um comando
comando;
else if (condição)
comando;
else
comando;
Exemplo:
if (reset)
Q = 0;
else
Q = D;
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Formato:
case (sinal)
// obs: usar BEGIN e END quando existir mais de um comando
<número de bits>’<sistema de numeração><alvo1>: comando;
...
<número de bits>’<sistema de numeração><valor2>: comando;
end case
<sistema de numeração>  d – decimal; h – hexadecimal, b - binário
<alvo1>, <alvo2>...  será executado o comando cujo alvo for igual ao sinal
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
module exemplo_case
(output reg[1:0] Y,
input [1:0] A, B, X);
always @ (*) begin
case (X)
2'b00: Y = A+B;
2'b01: Y = A-B;
2'b10: Y = A/B;
default: Y = 00;
endcase
end
endmodule
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
Formato:
case (sinal)
module exemplo_case
(output reg[1:0] Y,
input [1:0] A, B, X);
always @ (*) begin
case (X)
2'b00: Y = A+B;
2'b01: Y = A-B;
2'b10: Y = A/B;
default: Y = 00;
endcase
end
endmodule
<número de bits>’<sistema de
numeração><alvo1>: comando;
...
<número de bits>’<sistema de
numeração><valor2>: comando;
end case
<sistema de numeração>  d – decimal; h –
hexadecimal, b - binário
<alvo1>, <alvo2>...  será executado o comando cujo
alvo for igual ao sinal
VERILOG HDL
Instruções Condicionais (Instrução CASE)
Exemplo:
module exemplo_case
(output reg[1:0] Y,
input [1:0] A, B, X);
always @ (*) begin
case (X)
2'b00: Y = A+B;
2'b01: Y = A-B;
2'b10: Y = A/B;
default: Y = 00;
endcase
end
endmodule
VERILOG HDL
Tipos de Dados:
• Net (wire) – usado para modelar uma conexão elétrica
wire [msb:lsb] msb: most significant bit; lsb: least significant bit
Exemplo:
wire Reset; // 1-bit wire
wire [6:0] Clear; // 7-bit wire
VERILOG HDL
Exempo de NET do tipo wire:
module somador_completo_estrutural
(output Cout, S,
input A, B, Cin);
wire f1, f2, f3;
and
g1(f1, A, Cin),
g2(f2, A, B),
g3(f3, B, Cin);
or
g4(Cout, f1, f2, f3);
xor
g5(S, A, B, Cin);
endmodule
wire
f1
f2
f3
A
B
Cin
wire
VERILOG HDL
Tipos de Dados:
• Register (reg) tipo de dado que armazena o valor de um sinal, até o mesmo ser
alterado (não representa um registrador de fato).
reg [msb:lsb] msb: most significant bit; lsb: least significant bit
Exemplo:
reg [ 3: 0 ] cla; // 4-bit register
reg cla; // A 1-bit register
VERILOG HDL
Exempo de Register do tipo reg:
module comportamental2_mux
(output reg out,
input a, b, sel);
always @(*) begin
out = (~ sel & a) | (sel & b);
end
endmodule
VERILOG HDL
Uso dos tipos de dados:
• Nos modelos de descrição Estrutural e Fluxo de dados são usados o tipo
wire, não se usa o tipo reg
• Nos modelos de descrição Comportamental e RTL são usados o tipo reg,
não se usa o tipo wire
VERILOG HDL
Mais exemplos:
1) Fazer o modelo Verilog Fluxo de Dados de um circuito comparador com
as características:
•
O circuito possui duas entradas de 8 bits (a, b)
•
O circuito possui três saídas de 1bit, denominadas (maior, menor e
igual)
•
O circuito possui a seguinte função: se a >b; maior = 1;
se a< b ; menor = 1;
se a = b; igual = 1
VERILOG HDL
Descrição Verilog
module comparador
(output igual,maior,menor,
input [7:0] a, b);
assign igual = (a==b);
assign maior = (a>b);
assign menor = (a<b);
endmodule
Simulação
VERILOG HDL
Mais exemplos:
2) Fazer o modelo Verilog Comportamental de um circuito comparador com
as características:
•
O circuito possui duas entradas de 8 bits (a, b)
•
O circuito possui três saídas de 1bit, denominadas (maior, menor e
igual)
•
O circuito possui a seguinte função: se a >b; maior = 1;
se a< b ; menor = 1;
se a = b; igual = 1
VERILOG HDL
Descrição Verilog
module comparador_comportamental
(output reg igual,maior,menor,
input [7:0] a, b);
always @(*) begin
if (a==b)
begin
igual=1;
maior=0;
menor=0;
end
else if (a>b)
begin
menor=0;
maior=1;
igual=0;
end
else
begin
menor=1;
maior=0;
igual=0;
end
end
endmodule
Simulação
VERILOG HDL
Descrição Verilog
module comparador_comportamental
(output reg igual,maior,menor,
input [7:0] a, b);
always @(*) begin
maior=0;
menor = 0;
igual = 0;
if (a==b)
begin
igual=1;
end
else if (a>b)
begin
maior=1;;
end
else
begin
menor=1;
end
end
endmodule
Descrição RTL
VERILOG HDL
Descrição Verilog
module comparador
(output igual,maior,menor,
input [7:0] a, b);
assign igual = (a==b);
assign maior = (a>b);
assign menor = (a<b);
endmodule
Descrição RTL
VERILOG HDL
Operadores Lógicos:
and  &
or  |
xor  ^
not  ~
nand  ~&
nor  ~|
right shift  >>
left shift  <<
concatenacao  { }
condicional  ?
VERILOG HDL
Exemplo Concatenação:
Tabela Verdade do Somador Completo
A
B
Cin
S
Cout
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
Concatena as entradas:
{A, B, Cin }
VERILOG HDL
module exemplo_concatena
(output reg S, Cout,
input A, B, Cin);
Exemplo Concatenação:
Tabela Verdade do Somador Completo
A
B
Cin
S
Cout
0
0
0
0
0
0
0
1
1
0
0
1
0
1
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
1
1
1
Concatena as entradas:
{A, B, Cin
always @ (*) begin // procedimento resolve a soma
case ({A, B, Cin}) // concatena A, B, Cin, numa única variável
3'b001: S = 1;
3'b010: S = 1;
3'b100: S = 1;
3'b111: S = 1;
default: S = 0;
endcase
end
always @ (*) begin // procedimento resolve o Cary (Cout)
case ({A, B, Cin}) // concatena A, B, Cin, numa única variável
3'b011: Cout = 1;
3'b101: Cout = 1;
3'b110: Cout = 1;
3'b111: Cout = 1;
default: Cout = 0;
endcase
} end
endmodule
VERILOG HDL
Simulação
VERILOG HDL
Síntese
module buffer_terceiro_estado
(output out,
input enable, dado);
assign out = (enable) ? dado : 1'bz;
endmodule
VERILOG HDL
Síntese
Descrição Verilog
module buffer_terceiro_estado
(output out,
input enable, dado);
assign out = (enable) ? dado : 1'bz;
endmodule
Simulação
terceiro estado
(tri-state)
terceiro estado (tri-state)
VERILOG HDL
Operações Aritméticas :
adicao
+
subtracao
multiplicacao  *
divisao
/
modulo
%
VERILOG HDL
Instruções de Laço
• Repeat
• While
• For
• O laço Repeat não é usado para síntese de circuitos
• O laço While é usado para síntese de circuitos
sequenciais
• O laço For é usado para síntese de circuitos
combinacionais