1
Projecto de Sistemas Digitais
Setembro de 2007Antó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 isport(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 isbeginY1 <= 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_MUXESend 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 isport(a,b:in std_logic;
sum,carry:out std_logic);end entity HALF_ADDER;
architecture STRUCT of HALF_ADDER is
component xor2port(a,b:in std_logic; c:out std_logic);
end component;
component and2port(a,b:in std_logic; c:out std_logic);
end component;
beginX1: 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 blocoentradas
saídas
primitivaslógicas
nomes dasinstâncias
saídaentradas
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
• Estruturalmodelo descrito pela interligação de blocos que compõem o circuito (como no exemplo anterior, mux2_1)
• Comportamentalmodelo 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 que se 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;...initialbegina = 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 BCiCo
S
A
B
Ci
Co
S11111
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 somadorcompleto: 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 somadorcompleto: simulação
15
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 30
Projecto de um somador de 4 bits: especificação
A3
CiCoA B
CiCoS
A BCiCo
S
A BCiCo
S
A BCiCo
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/100psmodule 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));
initialbegin$monitor($time, “ ci=%b, a=%d, b=%d, s=%d, co=%b”, cin, a, b, s, cout);cin=0; a=2; b=4; #30b=12; #30 cin=1; #30a=4'b1110; b=4'b0110; #30 $stop;
endendmodule
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 ligadospor posição
sinais ligadospor 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);
initialbegin$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;endendmodule
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 - testbenchesmodule 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 bitoutput [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 bitsRb; // 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çãogenérica
module FCP(a, b, out);// Largura do operandoparameter 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 maxand #(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);endendmodule
modela blocoscombinacionais
sempre que ...
o sinal s está“ligado” à expressão
operadoreslógicos
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 41
Modelos comportamentaisModelo 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];
endendmodule
sempre que...
concatenaçãode 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;endendmodule
modela um blocosí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íncronosEx: 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
processosíncrono com clk
sempre que clkreg_sum “segura”um valor lógico
reg_suma
D Q
clk0
reset
circuito inferido
reset síncronocom clk
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 45
Contador up/downmodule 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)beginif ( reset )
dout <= 0 elsebegin
if ( enable )if ( down )
dout <= dout – 1;else
dout <= dout + 1;end
endendmodule
processo síncronocom o flanco
ascendente de clk e reset (assíncrono)
processocombinacional
a avaliação do sinal de reset tem de ocorrer
no início do blocobegin...end
23
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 46
Testbench para o contador up/down
`timescale 1ns/100psmodule 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);
initialbegindown = 0; reset = 0; enable = 1;#2 reset = 1; // apply reset#6 reset = 0; // release reset#300 // count up 300nsenable = 0; #40 // disable counterdown = 1; #100 // count downenable = 1; #300 // enable counter, wait 300ns$stop; // stop simulation
endinitial clk = 1’b0;always #5 clk = ~clk; // 10ns clock period
endmodule
estímulos
instância do contador
sinal dereló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:
clockgenc16Dff 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
operadoresló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 bitsGerador 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=050 505
unidades de tempo reais: ‘timescale 1ns/100ps
unidade de atraso
arredondamentodos 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
circuitoa
fabricar
geraçãode
estímulos
análisede
respostas
modelo sintetizável(vai ser um circuito digital)
modelo não sintetizável(testbench)
clockreset
memóriasA/D e D/Ainterfaces
ficheiros...
simula o comportamento dedispositivos externos
analisa respostas para verificar a correcção do modelo
registos de textowaveformsficheiros...
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
begina1<=in0+in1-acc;y1<=a1+b1;z1<=y1+a1;
end
Admitindo que in0=4,in1=4,acc=1a1=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;
begina1=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/nonblockingmodule shiftReg(clk, rst, E, A);input clk, rst, E;output A;reg A, B, C, D;
always @(posedge clk or posedge rst)beginif (rst) begin A=0; B=0; C=0; D=0; endelse begin
A=B;B=C;C=D;D=E;
endendendmodule
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 )beginreg = datain;ack = 1;
endend
28
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 56
Blocos sequenciais e paralelos
begin // sequencialx = k;#10 y = a + b;#5 z = y * x;
end
beginx = k;fork#10 y = a + b;#5 z = y * x;
joinend
avaliadas em paralelo
inicia bloco paralelo
termina bloco paralelo
xyz
10 5
xyz
10
5
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 57
Latches em blocos combinacionaisNum 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)beginif ( sel )y = a;
elsey = b;
end
always @(a or b or sel)beginif ( sel )y = a;
end
um multiplexador 2÷1uma 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)statement1elsestatement2
• 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: ...
endcasecasex (ir[7:4])
4’bxx01: ...4’bxx10: ...default: ...
endcaseacc=(ir[7:0]==4’b0011) ? 0 : 255;
if (done && init) {out, play}=2’b011;elseif (ready) beginout=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)begina[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óximoestado
registo deestado
entradassaídas Mealy
reset(assíncrono)
reset(síncrono)
clock
saídas Mooresaída
estadoactual
próximoestado
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
s3s3
s4
i1
i3
condição de transição de estado
i3
i4
valores dassaí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
01X/0
1
1
X1/0X0/1
XX/1
S0 S1
S2
i1/Ymei1/Yme
Ymo
Ymo
i2/Yme
Ymei2/Yme
entradas estado próximo saídasi1 i2 corrente estado Yme Ymo0 X 00 (S0) 00 (S0) 1 01 X 00 (S0) 01 (S1) 0 0X 1 01 (S1) 00 (S0) 0 1X 0 01 (S1) 10 (S2) 1 1X X 10 (S2) 00 (S0) 1 1
saídas Mealysaídas Moore
i1 i2/Yme
Ymo
32
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 64
Modelação de máquinas de estadosem 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: beginYmo<=0;if (i1)begin
state<=2’b01; Yme<=0;endelse
Yme<=1;end
2’b01: beginYmo<=1;if (i2)begin
state<=2’b00; Yme<=0;endelse
beginstate<=2’b10; Yme<=1;
endend
2’b10: beginYmo<=1; state<=2’b00; Yme<=1;
endendmodule
00 01
10
0X/1
01X/0
1
1
X1/0X0/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
01X/0
1
1
X1/0X0/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;endelse
Yme=1;end
2’b01: beginYmo=1;if (i2)begin
nextstate=2’b00; Yme=0;endelse
beginnextstate=2’b10; Yme=1;
endend
2’b10: beginYmo=1; nextstate=2’b00; Yme=1;
enddefault: begin
Ymo=0; nextstate=2’b00; Yme=1;end
endendmodule
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 estadosem Verilog
33
AJA, FEUP PSDI - Linguagens de descrição de hardware - Verilog 66
Alternativa 1: separação da lógica do próximoestado das saídas
always @(state or i1 or i2)begincase (state)2’b00: if (i1)
nextstate=2’b01;elsenextstate=2’b00;
2’b01: beginif (i2)
nextstate=2’b00;else
nextstate=2’b10;end
2’b10: nextstate=2’b00;
default: nextstate=2’b00;
endendmodule
always @(state or i1 or i2)begin
case (state)2’b00: begin
Ymo=0;if (i1)
Yme=0;else
Yme=1;end
2’b01: beginYmo=1;if (i2)
Yme=0;else
Yme=1;end
2’b10: beginYmo=1; Yme=1;
enddefault: begin
Ymo=0; Yme=1;end
endendmodule
Modelação de máquinas de estadosem 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)beginif (!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;
end2’b10: begin
state<=2’b00;end
default: beginstate<=2’b00;
endendendmodule
Modelação de máquinas de estadosem 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)beginif (!reset)
beginYmo<=0;state <= 2’b00;
endelse
case (state)2’b00: if (i1)
beginYmo<=1;state<=2’b01;
endelsebegin
Ymo<=0;state<=2’b00;
end...
Modelação de máquinas de estadosem Verilog
… (saída Yme)