Buscar

slidesPSDI200708_HDLVerilog

Prévia do material em texto

1
Projecto de Sistemas Digitais
Setembro de 2007
António José Duarte Araújo
Linguagens de descrição de hardware - Verilog
1
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 2
Linguagens de descrição de 
hardware
• HDL - Hardware Description Language
• HDL ≠ linguagem de programação
– linguagem de programação (software): pode ser traduzida em 
instruções máquina e executada num computador
– HDL: linguagem com suporte semântico e sintáctico para 
modelação do comportamento temporal e estrutura espacial do 
hardware
• Modelação de um circuito digital com uma HDL
– descrições comportamentais permitem nível elevado de 
abstracção
– metodologia top-down: ferramentas de síntese automática
– representação textual: portabilidade, edição e documentação
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 3
• Modelação de um circuito digital com uma HDL
– a favor do esquemático: “uma figura diz mais do que mil 
palavras”
• um esquema transmite melhor a ideia estrutural
• ferramentas gráficas front-end produzem descrições em HDLs
– editores de esquemático: netlist em HDL (estrutural, gate-level ou RTL)
– editores de diagramas de estados: descrições sintetizáveis
– construção de um modelo: duas perspectivas
• descrever o seu funcionamento apenas para simulação
• construir uma descrição sintetizável
– um modelo sintetizável deve descrever “bem” o seu funcionamento
– subsets das linguagens e regras de modelação podem depender das ferramentas
Linguagens de descrição de 
hardware
2
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 4
Modelação em HDLs: sintetizável/não 
sintetizável
• Ferramentas de síntese automática inferem uma estrutura 
– o modelo (comportamental ou estrutural) vai ser hardware
– regras, restrições e recomendações das ferramentas de síntese
• como é interpretada e traduzida a descrição em HDL
• simulação e implementação devem concordar
• construções específicas da tecnologia de implementação
• Modelos não sintetizáveis
– não são traduzidos para hardware
– exemplos: definição de estímulos para simulação; monitorização de 
sinais
– modelam o comportamento de outros circuitos só para simulação
• circuito de relógio
• memórias ou CPUs
• circuitos de interface (por exemplo conversores A/D ou D/A)
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 5
Modelação em HDLs: 
recomendações gerais
• Antes de iniciar a construção do modelo
– definir a arquitectura e estruturar o projecto (particionamento)
– ferramentas de síntese não processam bem circuitos muito 
grandes!
• Problemas de optimização são NP-completos
• Escrever o código de modo a reflectir a arquitectura
– estruturado em módulos e funções, ter em mente a reutilização
– favorecer a legibilidade: nomes, comentários, parêntesis, 
parâmetros
• Garantir a precisão da simulação
– deve traduzir fielmente o comportamento do hardware gerado
– modelar correctamente o comportamento das partes não 
sintetizáveis
3
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 6
VHDL e Verilog: comparação
– Capacidade de modelação
• semelhante para modelos estruturais
• VHDL oferece melhor suporte para modelos abstractos e modelos de atrasos
• Verilog tem melhores construções para modelar ao nível lógico e primitivas de 
bibliotecas de ASICs e FPGAs
– Tipos de dados
• VHDL suporta tipos de dados abstractos criados pelo utilizador
• em Verilog os tipos são muito simples e mais próximos do hardware (wire e reg)
– Aprendizagem
• VHDL é fortemente tipada, menos intuitiva, mais verbosa (baseada em ADA)
• Verilog é mais simples e menos verbosa (baseada em C)
– Parametrização
• VHDL tem construções para parametrizar número de bits, replicar estruturas e 
configurar modelos
• Verilog suporta apenas modelos com parâmetros, instanciação com redefinição 
de parâmetros
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 7
VHDL e Verilog: exemplo 
(comportamental)
library IEEE;
use IEEE.STD_Logic_1164.all;
entity MUX_2_1 is
port(S1,A1,B1,S2,A2,B2,S3,A3,B3:in std_logic;
Y1,Y2,Y3:out std_logic);
end entity MUX_2_1;
architecture COND_DATA_FLOW of MUX_2_1 is
begin
Y1 <= A1 when S1=‘1’ else B1;
TWO_2_1_MUXES:
process(S2,A2,B2,S3,A3,B3)
begin
Y2<=B2;
if (S2=‘1’) then
Y2<=A2;
endif;
if (S3=‘1’) then
Y3<=A3;
else
Y3<=B3;
endif; 
end process TWO_2_1_MUXES
end architecture COND_DATA_FLOW;
module MUX_2_1(S1,A1,B1,Y1,
S2,A2,B2,Y2,
S3,A3,B3,Y3);
input S1,A1,B1,S2,A2,B2,S3,A3,B3;
output Y1,Y2,Y3;
reg Y2,Y3;
assign Y1=S1?A1:B1;
always
@(S2 or A2 or B2 or S3 or A3 or B3)
begin
Y2=B2;
if (S2)
Y2=A2;
if (S3)
Y3=A3;
else
Y3=B3;
end
endmodule
VHDL Verilog
4
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 8
VHDL e Verilog: exemplo 
(estrutural)
library IEEE;
use IEEE.STD_Logic_1164.all;
entity HALF_ADDER is
port(a,b:in std_logic;
sum,carry:out std_logic);
end entity HALF_ADDER;
architecture STRUCT of HALF_ADDER is
component xor2
port(a,b:in std_logic; c:out std_logic);
end component;
component and2
port(a,b:in std_logic; c:out std_logic);
end component;
begin
X1: xor2 port map(a=>a,b=>b,c=>sum);
A1: and2 port map(a=>a,b=>b,c=>carry);
end STRUCT;
module HALF_ADDER(a,b,sum,carry);
input a,b;
output sum,carry;
xor X1(sum,a,b);
and A1(carry,a,b);
endmodule
VHDL Verilog
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 9
Verilog HDL
• Modelação e simulação de circuitos digitais
• Suporta modelação em diferentes níveis de abstracção
• Possibilidade de inferir automaticamente hardware
com outras ferramentas
• Largamente difundida na comunidade de projecto de 
circuitos e sistemas digitais
• Suporta organização hierárquica com uma sintaxe 
simples e com fortes semelhanças à linguagem C
• Permite que o projectista descreva o que o hardware
deve fazer sem o implementar, i.e., permite separar 
‘comportamento’ e ‘implementação’
5
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 10
Exemplo de um modelo em Verilog
Entradas Saída
O(D1, D0, S0) = D1·S0 + D0·S0
AND_1
AND_2
OR_1
mux2_1
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 11
Elementos do modelo 
exemplificado
interface
implementação
nome do bloco
entradas
saídas
primitivas
lógicas
nomes das
instâncias
saída
entradas
ligações (“fios”)
comentário
operador de negação
6
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 12
Formas de modelação de circuitos
• Estrutural
modelo descrito pela interligação de blocos que compõem o 
circuito (como no exemplo anterior, mux2_1)
• Comportamental
modelo descrito pelo comportamento funcional que o circuito 
deve possuir (como nos exemplos seguintes)
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 13
Exemplos de modelos 
comportamentais
‘assign’ ‘always’
O mesmo mux de 2 para 1, agora com:
próximo da ‘equação’ próximo do ‘algoritmo’
7
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 14
Modelação de circuitos 
combinacionais com ‘assign’
• A expressão exp pode conter operadores aritméticos, booleanos, 
relacionais, lógicos (bit a bit), etc.
• Consiste na forma mais simples e natural de modelar circuitos 
combinacionais
• Introduz maior abstracção que a abordagem estrutural baseada na 
utilização de portas lógicas
traduz uma atribuição contínua: a expressão exp é
permanentemente avaliada e o resultado é
continuamente atribuído a O
exp
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 15
Modelação de circuitos 
combinacionais com ‘always’
lista de sensibilidades
consiste num bloco de instruções que é executado 
sempre que qualquer sinal presente na lista de 
sensibilidades sofra alteração do valor lógico
• Num bloco ‘always’ qualquer atribuição deve ser feita a variáveis 
declaradas como ‘reg’ (conceito de “segurar” o valor lógico)
• Um bloco ‘always’ pode conter estruturas de controlo como as usadas 
num programa (ciclos ‘for’, ‘while’ e ‘repeat’, ‘if-else’ e ‘case’)
• Construção essencial em quese fundamenta a modelação 
comportamental
8
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 16
Modelação de circuitos 
combinacionais com ‘always’
• Que acontece se um sinal não estiver na lista de sensibilidades?
• O simulador ignora qualquer transição desse sinal, pelo que, pode 
produzir erros nas saídas que dele dependem
Formas da lista de sensibilidades
(admissíveis no Verilog-2001)
(equivale a indicar na lista 
todos os sinais lidos no bloco 
‘always’)
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 17
Algumas primitivas lógicas
• Podem ser usadas com mais 
entradas
• Primeiro sinal é a saída e os 
restantes são as entradas
• São os blocos básicos (primitivas) 
de uma descrição estrutural
inv
a1 na1
o1 no1
x1 xn1
9
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 18
Constantes numéricas
8’b1011_0100
o underscore é ignorado
formato de representação (d, b, o, h)
decimal que indica o número de bits
Exemplos:
0100
1111111100010001
Por omissão, uma constante é um decimal (compl. para 2) com 32 
bits (se atribuída a sinais com menos bits é truncada a parte mais 
significativa!) 
4’d4
16’hff_11
reg [3:0] a;
...
initial
begin
a = 28; // 28=11100 -> a fica com 1100=1210...
end
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 19
Tipos de operadores
• Aritméticos
• Lógicos
• Relacionais
• Bitwise
• Redução
• Deslocamento
• Outros
Nos exemplos seguintes: 
A = 4’b0110, B = 4’b0010, C = 4’b0101 e D = 4’b0000
10
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 20
Operadores aritméticos
B**B → 0100potência**
C%B → 0001divisão (resto)%
C/B → 0010divisão (quociente)/
A*B → 1100multiplicação*
A-B → 0100subtracção-
A+B → 1000adição+
exemplooperaçãosímbolo
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 21
Operadores lógicos
A||B → 1, A||D → 1ou
||
A&&B → 1, A&&D → 0e
&&
!A → 0, !D → 1negação
!
exemplosoperaçãosímbolo
11
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 22
Operadores relacionais
B<=C → 1, B<=D → 0menor ou igual a<=
A>=C → 0, B>=B → 1maior ou igual a>=
A<C → 0, B<D → 0menor que<
A>B → 1, B>C → 0maior que>
B!=D → 1desigualdade!=
A==B → 0igualdade==
exemplosoperaçãosímbolo
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 23
Operadores bitwise
A~^C → 1100não ou exclusivo~^
A^C → 0011ou exclusivo^
A|C → 0111ou|
A&C → 0100e&
~A → 1001negação~
exemplooperaçãosímbolo
12
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 24
Operadores de redução
~^A → 1, ~^D → 1não ou exclusivo~^
^A → 0, ^D → 0ou exclusivo^
~|A → 1, ~|D → 1não ou~|
|A → 1, |D → 0ou|
~ &A → 0, ~ &D → 1não e~ &
&A → 0, &D → 0e&
exemplosoperaçãosímbolo
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 25
Operadores de deslocamento
A<<1 → 1100, C<<2 →
0100
deslocamento para a 
esquerda<<
A>>1 → 0011, C>>2 →
0001
deslocamento para a 
direita>>
exemplosoperaçãosímbolo
13
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 26
Outros operadores
A==B ? C : D → 0000condicional? :
{2{A}} → 01100110replicação{ { } }
{A,B} → 01100010concatenação{ }
exemplooperaçãosímbolo
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 27
Projecto de um somador completo
A B
CiCo
S
A
B
Ci
Co
S
11111
01011
01101
10001
01110
10010
10100
00000
SCoCiBA
Co = A·B + B·Ci + A·Ci
S = A B Ci+ +
circuito lógico
símbolo do 
full-adder
14
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 28
Projecto de um somador
completo: Verilog
Como verificar que um 
modelo realiza a função 
pretendida?
Elaboração de um 
testbench para o full-adder
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 29
Projecto de um somador
completo: simulação
15
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 30
Projecto de um somador de 4 bits: 
especificação
A3
CiCo
A B
CiCo
S
A B
CiCo
S
A B
CiCo
S
A B
CiCo
S
B3
S3
A2 B2 A1 B1 A0 B0
S2 S1 S0
w1w2w3
ou, mais simplesmente
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 31
Projecto de um somador de 4 
bits: verificação funcional
Testbench: instância o módulo a testar (adder4)
`timescale 1ns/100ps
module adder4_testbench;
reg [3:0] a, b;
reg cin;
wire [3:0] s;
wire cout;
adder4 DeviceUnderTest(a, b, cin, s, cout);
// adder4 DeviceUnderTest(.Ci(cin), .Co(cout), .A(a), .B(b), .S(s));
initial
begin
$monitor($time, “ ci=%b, a=%d, b=%d, s=%d, co=%b”, cin, a, b, s, cout);
cin=0; a=2; b=4; #30
b=12; #30 
cin=1; #30
a=4'b1110; b=4'b0110; #30 
$stop;
end
endmodule
o circuito 
a testar
monitor 
de sinais
estímulos 
de 
simulação
registos (seguram valores !)
fios (propagam valores !)
controlo do simulador (pára)
espera 30 unidades de tempo (30ns)
módulo sem interface
quando o simulador inicia ...
sinais ligados
por posição
sinais ligados
por nome
16
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 32
Projecto de um somador de 4 bits: 
resultados da simulação (texto)
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 33
Projecto de um somador de 4 bits: 
resultados da simulação (formas de onda)
17
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 34
Projecto de um somador de 4 bits: 
verificação funcional (cont)
Verificação exaustiva do somador de 4 bits
• e se fosse de 32 bits ? (com 1ns por vector seriam necessários 1170 anos!)
module adder4_testbench;
reg [3:0] a, b; reg cin;
wire [3:0] s; wire cout;
adder4 DeviceUnderTest(a, b, cin, s, cout);
initial
begin
$monitor($time, “ ci=%b, a=%d, b=%d, s=%d, co=%b", cin, a, b, s, cout);
cin = 0; $display(“Verificacao com carry-in = %b”, cin);
for(a=0;a<15;a=a+1) for(b=0;b<15;b=b+1) #40;
cin = 1; $display(“Verificacao com carry-in = %b”, cin);
for(a=0;a<15;a=a+1) for(b=0;b<15;b=b+1) #40;
$display(“Fim da simulação”); $stop;
end
endmodule
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 35
Declaração do interface
• Um módulo pode não ter interface 
– em módulos usados para teste de outros - testbenches
module myadder_testbench; // sem entradas nem saídas
• Declaração de portos de interface
– unidireccionais:
input [7:0] din_a, din_b; // din_a, din_b são entradas de 8 bits
// onde o MSB é din_a[7] e o LSB é din_a[0]
input clock, reset; // clock, reset são entradas de 1 bit
output [0:8] res; // result é uma saída de 9 bits, onde o 
// MSB é res[0] e o LSB é res[8]
– bidireccionais:
inout [7:0] databus; // databus é um sinal bidireccional de 8 bits:
// pode forçar um nível lógico ou receber um
// sinal do exterior
• Todos os sinais declarados como portos de entrada/saída são do tipo 
wire (fio)
– fios (wires) apenas “propagam” valores lógicos entre uma origem e um destino
– as saídas que “seguram” valores lógicos devem ser declaradas como sinais do tipo reg
• Valores lógicos: 1, 0, x (desconhecido) e z (estado de alta impedância)
18
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 36
Declaração de sinais
• Sinais do tipo wire representam fios ou barramentos (vários bits)
– servem para transportar um valor lógico desde uma origem que o produz
– um identificador não declarado é considerado um wire de 1 bit
wire en_clock, sel_reg; // fios simples (um bit)
wire [15:0] opr_a, opr_b; // dois barramentos de 16 bits
• Sinais do tipo reg representam “registos” (um ou mais bits)
– seguram valores lógicos
reg clock, reset; // registos de 1 bit
reg [7:0] Ra, Rb; // registos de 8 bits
reg [15:0] regfile[0:31]; // vector de 32 registos com 16 bits cada
• Campos de vectores de bits
Rb; // todo o registo Rb de 8 bits 
opr_a[15:8]; // os 8 bits mais significativos de opr_a
Rb[3]; // o bit 3 do registo Rb
regfile[6]; // o elemento no endereço 6 do vector regfile;
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 37
Parametrização
• Aumentar a legibilidade
module my_multiply(...);parameter size=16, delay=5;
...
endmodule
my_multiply #(8,2) mult1(...);
valores por omissão
valores atribuídos
à instância mult1
// Codificaçao de estados:
parameter INIT = 2’b00;
parameter S0=2’b01, S1=2’b11;
...
if (state==INIT) //if (state==2’b00)
nextstate=S1;
...
• Tornar a descrição
genérica
module FCP(a, b, out);
// Largura do operando
parameter WIDTH = 32;
input [WIDTH-1:0] a, b;
...
19
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 38
Tempos de propagação
• Não suportados em modelos sintetizáveis
• Na instanciação de primitivas são especificados com o operador #
and #3 and_1(o1, x1, x2, x3; // tp = 3 unidades de tempo
and #(3,5) and_2(out2, a, b); // tplh=3, tphl=5
bufif1 #(3,2,5) buf_1(out, in, en) // tplh=3, tphl=2, tpHiZ=5
• Para cada tempo podem ser especificados valores min, typ e max
and #(3:4:5) myand(out2, a, b); // tpmin=3, tptyp=4, tpmax=5
bufif1 #(1:2:3,2:3:4,3:4:6) buf_1(out, in, en) //atrasos min:typ:max
• O valor da unidade de tempo é definido pela directiva `timescale
`timescale 1ns/100ps // uma unidade=1ns; precisão de simulação=0.1ns
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 39
Verilog system tasks
Algumas funções internas do simulador (system tasks)
– $monitor()
• imprime um registo de texto formatado quando um sinal muda de estado
• a sintaxe é semelhante à função printf() da linguagem C
• num projecto só pode existir activo um monitor de sinais
– $time
• devolve o tempo actual do simulador (um inteiro)
– $display()
• quando invocado imprime um registo de texto formatado
– $stop
• interrompe a simulação mas pode ser retomada (breakpoint)
– $finish
• termina a execução do simulador (em alguns simuladores...)
20
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 40
Modelos comportamentais
• Um modelo comportamental é formado por:
– um ou mais processos que operam concorrentemente
• assign: blocos combinacionais
• always: blocos combinacionais, sequenciais ou síncronos
• Modelo de um full-adder (combinacional)
module full_adder_comp(a, b, cin, s, cout);
input a, b, cin;
output s, cout;
reg cout;
assign s = a ^ b ^ cin;
always @( a or b or cin )
begin
cout = (a & b) | (a & cin) | (b & cin);
end
endmodule
modela blocos
combinacionais
sempre que ...
o sinal s está
“ligado” à expressão
operadores
lógicos
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 41
Modelos comportamentais
Modelo comportamental do somador de 4 bits
module four_bit_adder_c(a, b, cin, s, cout);
input [3:0] a, b;
input cin;
output [3:0] s;
output cout;
reg cout, s;
reg [5:0] ta, tb, ts; // “registos” temps.
always @( a or b or cin or ta or tb or ts )
begin
ta = { 1’b0, a, 1’b1 };
tb = { 1’b0, b, cin };
ts = ta + tb;
cout = ts[5];
s = ts[4:1];
end
endmodule
sempre que...
concatenação
de bits
somador
extração de 
resultados
21
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 42
Modelos comportamentais
• task
– equivalente a um procedimento
– pode chamar-se a si próprio
usando os mesmos registos locais
• function
– equivalente a uma função
– retorna um valor
– não pode conter instruções
com temporizações ou eventos
Estruturação em “subrotinas”
multiply(a,b,acc);
...
task multiplyinput [15:0] a, b;output [31:0] prod;begin
...endendtask
if (testDF(d1,d2)==2’b00)
...
function [1:0] testDF;input [1:0] Duab, Dvab;begin
...
testDF=2’b01;endendfunction
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 43
Circuitos síncronos
O elemento mais simples: um flip-flop tipo D
module my_DFF(clk, d, q);
input clk, d;
output q;
reg q;
always @( negedge clk )
begin
q <= d;
end
endmodule
modela um bloco
síncrono com clk
sempre que clk
q “segura” um 
valor lógico
22
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 44
Modelação de circuitos síncronos
Ex: acumulador de 8 bits
module acc(clk, reset, a, reg_sum);
input clk, reset;
input [7:0] a;
output [7:0] reg_sum;
reg [7:0] reg_sum;
always @( negedge clk )
if ( reset )
reg_sum <= 8’d0;
else
reg_sum <= a + reg_sum;
endmodule
processo
síncrono com clk
sempre que clkreg_sum “segura”
um valor lógico
reg_sum
a
D Q
clk
0
reset
circuito inferido
reset síncrono
com clk
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 45
Contador up/down
module updown_counter(clk, reset, enable, down, dout, end_count);
input clk, reset, enable, down;
output [3:0] dout;
reg [3:0] dout;
output end_count;
assign end_count = enable & (down ? (dout==0) : (dout==15) );
always @( posedge clk or posedge reset)
begin
if ( reset ) 
dout <= 0 
else
begin
if ( enable )
if ( down )
dout <= dout – 1;
else
dout <= dout + 1;
end
end
endmodule
processo síncrono
com o flanco
ascendente de clk e 
reset (assíncrono)
processo
combinacional
a avaliação do sinal de 
reset tem de ocorrer
no início do bloco
begin...end
23
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 46
Testbench para o contador 
up/down
`timescale 1ns/100ps
module updown_counter_testbench;
reg clk, reset, enable, down;
wire [3:0] dout;
wire end_count;
updown_counter count_1(clk, reset, enable, down, dout, end_count);
initial
begin
down = 0; reset = 0; enable = 1;
#2 reset = 1; // apply reset
#6 reset = 0; // release reset
#300 // count up 300ns
enable = 0; #40 // disable counter
down = 1; #100 // count down
enable = 1; #300 // enable counter, wait 300ns
$stop; // stop simulation
end
initial clk = 1’b0;
always #5 clk = ~clk; // 10ns clock period
endmodule
estímulos
instância do 
contador
sinal de
relógio
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 47
Projecto de um contador de 4 bits
Modularidade e hierarquia de counter
– estruturado em 3 módulos: c16, Dff e clockgen
– clockgen produz o sinal de relógio
– contador c16 usa instâncias do módulo Dff (flip-flops tipo D)
– hierarquia do modelo:
clockgenc16
Dff Dff Dff Dff
counter
24
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 48
Projecto de um contador de 4 bits
Modelo do contador c16
module c16(value, clock, fifteen, ten);
input clock;
output [3:0] value;
output fifteen, ten;
Dff D1(value[0], clock, ~value[0]),
D2(value[1], clock, value[1] ^ value[0]),
D3(value[2], clock, value[2] ^ &value[1:0]),
D4(value[3], clock, value[3] ^ &value[2:0]);
assign fifteen = &value;
assign ten = value[3] & ~value[2] & value[1] & ~value[0];
endmodule
vector de bits
operadores
lógicos
saída ten vale 1 quando value = 1010
saídas de 1 bit
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 49
Projecto de um contador de 4 bits
Modelo (comportamental) do flip-flop tipo D (Dff)
module Dff(q, clock, d);
input clock, d;
output q;
reg q;
initial
q = 0;
always
@ (negedge clock)
#10 q = d;
endmodule
q é reg porque “segura” um valor
no início da simulação (t=0)
sempre que clock
25
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 50
Projecto de um contador de 4 bits
Gerador de relógio (clockgen)
module clockgen(clock);
output clock;
reg clock;
initial
#5 clock = 1;
always
#50 clock = ~clock;
endmodule
para sempre...
sinal clock gerado:
t=0
50 505
unidades de tempo reais: ‘timescale 1ns/100ps
unidade de atraso
arredondamento
dos cálculos
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 51
Projecto de um contador de 4 bits
O circuito completo (módulo counter)
module counter;
wire [3:0] count;
wire clock, ten, fifteen;
c16 contador( count, clock, fifteen, ten);
clockgen clock( clock );
initial
$monitor($time, “ Clk=%b, Count=%d, is_10=%b, is_15=%b”,
clock, count, ten, fifteen);
endmodule
26
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 52
Testbench
circuito
a
fabricar
geração
de
estímulos
análise
de
respostas
modelo sintetizável
(vai ser um circuito digital)
modelo não sintetizável
(testbench)
clock
reset
memórias
A/D e D/A
interfaces 
ficheiros
...
simula o comportamento de
dispositivos externos
analisarespostas para 
verificar a correcção do modelo
registos de texto
waveforms
ficheiros
...
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 53
Atribuições blocking/nonblocking
• Atribuições procedimentais (blocking) – avaliadas em sequência
• Atribuições non-blocking – avaliadas em paralelo
begin
a1<=in0+in1-acc;
y1<=a1+b1;
z1<=y1+a1;
end
Admitindo que in0=4,in1=4,acc=1
a1=4, b1=4, y1=8
a1 = 4+4-1 = 7;
y1 = 7+4 = 11;
z1 = 11+7 = 18;
a1 = 7;
y1 = 4+4 = 8;
z1 = 8+4 = 12;
begin
a1=in0+in1-acc;
y1=a1+b1;
z1=y1+a1;
end
27
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 54
Atribuições blocking/nonblocking
module shiftReg(clk, rst, E, A);
input clk, rst, E;
output A;
reg A, B, C, D;
always @(posedge clk or posedge rst)
begin
if (rst) begin A=0; B=0; C=0; D=0; end
else begin
A=B;
B=C;
C=D;
D=E;
end
end
endmodule
D=E;
C=D;
B=C;
A=B;
A<=B; // D<=E;
B<=C; // C<=D;
C<=D; // B<=C;
D<=E; // A<=B;
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 55
Atribuições blocking/nonblocking
Quando usar a=b ou a<=b ?
– em processos combinacionais podem-se usar os dois tipos
– em processos síncronos deve-se usar apenas non-blocking
• evita a ocorrência de race conditions que podem “encravar” o simulador
always @(posedge clk)
begin
...
if ( dataready )
rdy = 1;
...
end
always @(posedge clk)
begin
...
if ( rdy )
begin
reg = datain;
ack = 1;
end
end
28
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 56
Blocos sequenciais e paralelos
begin // sequencial
x = k;
#10 y = a + b;
#5 z = y * x;
end
begin
x = k;
fork
#10 y = a + b;
#5 z = y * x;
join
end
avaliadas em paralelo
inicia bloco paralelo
termina bloco paralelo
x
y
z
10 5
x
y
z
10
5
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 57
Latches em blocos combinacionais
Num modelo de um circuito combinacional
– as saídas devem ter um valor atribuído para todas as condições das 
entradas
– se esta condição não for satisfeita são criadas latches transparentes
– a ocorrência de latches num bloco que se pretendia combinacional
é geralmente fatal
always @(a or b or sel)
begin
if ( sel )
y = a;
else
y = b;
end
always @(a or b or sel)
begin
if ( sel )
y = a;
end
um multiplexador 2÷1
uma latch transparente
29
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 58
(z e x são don’t care)
Construções condicionais
• if (condition)
statement1else
statement2
• case (expression)
expr1: statement1;
expr2: statement2;default: statement3;endcase;
• (expression)?(true):(false)
if (a[2:0]==3’b010 && cy)
...
casez
casex
(z é don’t care)
case (ir[7:4])
4’b0001: ...
4’b0010: ...
default: ...
endcase
casex (ir[7:4])
4’bxx01: ...
4’bxx10: ...
default: ...
endcase
acc=(ir[7:0]==4’b0011) ? 0 : 255;
if (done && init) 
{out, play}=2’b011;elseif (ready) 
begin
out=2’b10; play=1;
endelse
{out, play}=3’b110;
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 59
Ciclos
• for(start; end_expr; update)
statement;
• forever statement;
for(i=0; i<8; i=i+1)
x[i] = x[i+1];
• repeat(fixed_loop_count)
statement;
repeat(10)
begin
a[i]=a[i+1];
i=i+1;
end;
forever #10 clock = ~clock;
while(i<8)
begin
...
i=i+1;
end
• while(condition)
statement;
(têm utilização restrita em modelos sintetizáveis)
30
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 60
Modelação de máquinas de estados
FSM (Finite State Machine)
– sequência determinada de estados, sincronizada com relógio
– estrutura geral
(saídas Moore)
saída
próximo
estado
registo de
estado
entradas
saídas Mealy
reset
(assíncrono)
reset
(síncrono)
clock
saídas Mooresaída
estado
actual
próximo
estado
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 61
Modelação de máquinas de estados
Codificação de estados (feita manualmente)
– atribuição de padrões de bits a cada estado
– o tipo de codificação influencia
• dimensão do registo de estado
• complexidade dos circuitos lógicos combinacionais
– codificações mais usadas
• sequencial
– 0000 0001 0010 0011 0100 … 1101 1110 1111
• código Gray
– 0000 0001 0011 0010 0110 … 1011 1001 1000
• código Johnson
– 00000000 00000001 00000011 00000111 00001111 … 11100000 11000000
• one-hot
– 0000000000000001 0000000000000010 0000000000000100 ...
31
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 62
Modelação de máquinas de estados
• Mealy
– as saídas dependem do estado corrente e das entradas
– o valor das saídas é associado às transições entre estados
• Moore
– as saídas dependem apenas do estado corrente
– o valor das saídas é associado aos estados
A B
C
i1/s1
i2/s2
D E
F
s3
s3
s4
i1
i3
condição de 
transição de estado
i3
i4
valores das
saídas
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 63
Máquinas de estados: especificação
• Tabela de transição de estados
• Diagrama de transição de estados
00 01
10
0X/1
0
1X/0
1
1
X1/0
X0/1
XX/1
S0 S1
S2
i1/Yme
i1/Yme
Ymo
Ymo
i2/Yme
Yme
i2/Yme
entradas estado próximo saídas
i1 i2 corrente estado Yme Ymo
0 X 00 (S0) 00 (S0) 1 0
1 X 00 (S0) 01 (S1) 0 0
X 1 01 (S1) 00 (S0) 0 1
X 0 01 (S1) 10 (S2) 1 1
X X 10 (S2) 00 (S0) 1 1 
saídas Mealy
saídas Moore 
i1 i2/Yme
Ymo
32
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 64
Modelação de máquinas de estados
em Verilog
Modelo incorrecto!
module FSM_mal(clock, i1, i2, Yme, Ymo);
input clock, i1, i2;
output Yme, Ymo;
reg Yme, Ymo;
reg [1:0] state;
always @(posedge clock)
case (state)
2’b00: begin
Ymo<=0;
if (i1)
begin
state<=2’b01; Yme<=0;
end
else
Yme<=1;
end
2’b01: begin
Ymo<=1;
if (i2)
begin
state<=2’b00; Yme<=0;
end
else 
begin
state<=2’b10; Yme<=1;
end
end
2’b10: begin
Ymo<=1; state<=2’b00; Yme<=1; 
end
endmodule
00 01
10
0X/1
0
1X/0
1
1
X1/0
X0/1
XX/1
i1 i2/Yme
Ymo
Onde estão os erros ?
• falta de reset (síncrono e/ou assíncrono)
• todas as saídas são registadas
• Yme não é saída de Mealy
• não é definido o estado inicial
• falta o estado 2’b11
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 65
Modelo correcto
00 01
10
0X/1
0
1X/0
1
1
X1/0
X0/1
XX/1
i1 i2/Yme
Ymo
always @(state or i1 or i2)
begin
case (state)
2’b00: begin
nextstate=2’b00;
Ymo=0;
if (i1)
begin
nextstate=2’b01; Yme=0;
end
else
Yme=1;
end
2’b01: begin
Ymo=1;
if (i2)
begin
nextstate=2’b00; Yme=0;
end
else 
begin
nextstate=2’b10; Yme=1;
end
end
2’b10: begin
Ymo=1; nextstate=2’b00; Yme=1; 
end
default: begin
Ymo=0; nextstate=2’b00; Yme=1;
end
end
endmodule
module FSM_bem(reset, clock, 
i1, i2, Yme, Ymo);
input reset, clock, i1, i2;
output Yme, Ymo;
reg Yme, Ymo;
reg [1:0] state, nextstate;
always @(posedge clock)
if (reset)
state<=2’b00;
else
state<=nextstate;
Modelação de máquinas de estados
em Verilog
33
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 66
Alternativa 1: separação da lógica do próximo
estado das saídas
always @(state or i1 or i2)
begin
case (state)
2’b00: if (i1)
nextstate=2’b01;
else
nextstate=2’b00;
2’b01: begin
if (i2)
nextstate=2’b00;
else 
nextstate=2’b10;
end
2’b10: nextstate=2’b00;
default: nextstate=2’b00;
end
endmodule
always @(state or i1 or i2)
begin
case (state)
2’b00: begin
Ymo=0;
if (i1)
Yme=0;
else
Yme=1;
end
2’b01: begin
Ymo=1;
if (i2)
Yme=0;
else 
Yme=1;
end
2’b10: begin
Ymo=1; Yme=1; 
end
default: begin
Ymo=0; Yme=1;
end
end
endmodule
Modelação de máquinas de estados
em Verilog
… (registo de estado)
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 67
Alternativa 2: combinando estado corrente e próximo estado
always @(posedge clock or negedge reset)
begin
if (!reset)
state <= 2’b00;
else
case (state)
2’b00: if (i1)
state<=2’b01;
else
state<=2’b00;
2’b01: begin
if (i2)
state<=2’b00;
else 
state<=2’b10;
end
2’b10: begin
state<=2’b00;
end
default: begin
state<=2’b00;
end
end
endmodule
Modelação de máquinas de estados
em Verilog… (saídas Ymo e Yme)
34
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 68
Alternativa 3: combinando estado corrente com próximo estado e 
modelando Ymo como saída síncrona
always @(posedge clock or negedge reset)
begin
if (!reset)
begin
Ymo<=0;
state <= 2’b00;
end
else
case (state)
2’b00: if (i1)
begin
Ymo<=1;
state<=2’b01;
end
else
begin
Ymo<=0;
state<=2’b00;
end
...
Modelação de máquinas de estados
em Verilog
… (saída Yme)

Continue navegando