Baixe o app para aproveitar ainda mais
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)
Compartilhar