36
VERILOG HDL Training PROGRAMMA DEL CORSO PROGRAMMA DEL CORSO Introduzione Concetti di base Sintassi del linguaggio Modelli comportamentali (behavioral) orientati alla sintesi logica Verifica (simulazione) Sintesi logica di FPGA Sintesi logica di FPGA Demo board Paolo Musico INFN Genova Febbraio 2017 1

VERILOG HDL Training - ge.infn.itmusico/DownloadFiles/Dottorato/Verilog... · ppg pend function [3:0] add1; input [3:0] a; begin endtask add1 = a + 1; end ... imposto con un segnale

Embed Size (px)

Citation preview

VERILOG HDL Training

PROGRAMMA DEL CORSOPROGRAMMA DEL CORSO

Introduzione Concetti di base Sintassi del linguaggiog ggModelli comportamentali (behavioral) orientati alla sintesi logica Verifica (simulazione) Sintesi logica di FPGASintesi logica di FPGA Demo board

Paolo Musico INFN GenovaFebbraio 2017 1

INTRODUZIONE (1)

Verilog e’ un linguaggio di programmazione orientato alla descrizionedi strutture hardware (HDL) digitali.di strutture hardware (HDL) digitali.Viene usato per descrivere sistemi digitali a differenti livelli:

switch level: transistor levelgate level: porte logiche elementarigate level: porte logiche elementariRegister Transfer Level (RTL): scambio dati tra registri

Verilog e’ stato introdotto nel 1985 da Gateway Design System Corporationi i li t d C d V il XLe poi commercializzato da Cadence come Verilog-XL.

Dal 1990 esiste la Open Verilog International che ha permesso la standardizzazione IEEE del linguaggio nel 1995 e la realizzazionedi altri simulatori (VeriWell, VCS, VeriBest, …).

Questo corso e’ orientato all’ introduzione della modellazione RTL.

Paolo Musico INFN GenovaFebbraio 2017 2

INTRODUZIONE (2)

Esistono altri HDL: il piu’ importante e’ VHDL che e’ standard IEEE dal 1987.Il mercato e’ suddiviso abbastanza equamente tra Verilog e VHDL.Il mercato e suddiviso abbastanza equamente tra Verilog e VHDL.Verilog ha la sintassi C-like ed e’ meno formale di VHDL che ha una sintassiADA-like ed e’ molto formale.

Perche’ si usa un HDL?La complessita’ odierna dei circuiti non permette piu’ la semplice rappresentazione

h tischematica.E’ piu’ efficace descrivere il comportamento del circuito tramite un HDL,verificarne la correttezza tramite un simulatore e geneare la netlist “gate level”con strumenti automatici (sintetizzatori logici).In tal modo e’ possibile anche verificare la funzionalita’ di possibili implementazionialternative dello stesso circuito e scegliere la piu’ performante.

Paolo Musico INFN GenovaFebbraio 2017 3

CONCETTI BASE (1)

Metodologia Bottom-Up: usando componenti esistenti si sviluppa il progettoe si sale nella gerarchia (realizzo un registro con DFF, poi un banco di registri,poi la decodifica, ecc.)

Metodologia Top-Down: il problema viene decomposto in blocchi e ognig p p p gblocco viene decomposto a sua volta fino ad limite (un banco di registri ha bisognooltre che dei registri stessi di una decodifica, il singolo registro sara’ poiimplementato con dei DFF ecc )implementato con dei DFF, ecc.)

Metodologia mista: si decompone il problema top-down fino ad un certo limite;i livelli piu’ bassi della gerarchia si implementano bottom up (descrivo ii livelli piu bassi della gerarchia si implementano bottom-up (descrivo i sottoblocchi con HDL e uso la sintesi per implementarli, utilizzando librerie digates).

Paolo Musico INFN GenovaFebbraio 2017 4

CONCETTI BASE (2)

Un intero progetto viene contenuto in piu’ files HDL: ogni file puo’contenere uno o piu’ moduli.contenere uno o piu moduli.Per poter simulare il progetto c’e’ bisogno di un modulo di test chepermetta di applicare gli stimoli al circuito e che ne verifichi il comportamento(con stampe salvando segnali grafici )(con stampe, salvando segnali grafici, …).Dopo la sintesi e’ possibile utilizzare la netlist gate level, applicare glistimoli e verificare che il risultato della sintesi soddisfi i requisiti del problema(li iti di l it ’ )(limiti di velocita’, …).Strumenti necessari e disponibili su piattaforma Sun-Solaris:editor di testo (VI, EMACS, …),simulatore (Verilog-XL, VCS),visualizzatore di seganli (Signalscan, Virsim),sintetizzatore (Synopsys design_compiler o fpga_compiler).

Paolo Musico INFN GenovaFebbraio 2017 5

SINTASSI (1)

module MUX2_1(out, a, b, sel);output out;

Esempio completo di modulo: mux 2 -> 1.output out;input a, b, sel;

reg out; // Commento

Definizione del modulo con i segnalidi I/O.D fi i i d l ti

always @(sel or a or b)begin

if( sel == 0 )

Definizione del tipo regBlocco procedurale alwaysUso di begin-end

if( sel 0 )out <= a;

elseout <= b;

Statement decisionale if-elseAssegnazione <=Commenti // e /* */

end/* Altro commento */endmodule

Statement di chiusura del modulo

Paolo Musico INFN GenovaFebbraio 2017 6

SINTASSI (2)

Spazi bianchi: utilizzare blanks, tab e linee vuote per migliorare la leggibilita’del codice. Vengono ignorati dal parser.Commenti: usarli per descrivere cio’ che il codice deve fare. Vengono ignoratidal parser del simulatore. E’ possibile usare commenti particolari come direttiveper il sintetizzatore (synopsys).p ( y p y )Numeri: interi e reali (non usati per la sintesi). Formato generico di un intero:

<size>’<base><value>

Esempi:p12 // decimale (base 10)8’h5F // esadecimale a 8 bit6’b11_0010 // binario a 6 bit’ 576 // tt l di i’o576 // ottale senza dimensione32’bz // binario a 32 bit Hi-Z

Il carattere ‘ ’ viene ignorato e puo’ essere usato come separatore

Paolo Musico INFN GenovaFebbraio 2017 7

Il carattere _ viene ignorato e puo essere usato come separatore

SINTASSI (3)

Identificatori: iniziano con un carattere alfabetico (a-z, A-Z), possono contenerenumeri (0-9), “ ” e “$”. Devono essere diversi dalle parole riservate.numeri (0 9), _ e $ . Devono essere diversi dalle parole riservate.Possono essere lunghi fino a 1023 caratteri.Sono identificatori i nomi dei moduli, le porte di I/O, le istanze, le variabili.Usare identificatori che abbiano significato per la funzione in cui sonoUsare identificatori che abbiano significato per la funzione in cui sonousati.Crearsi una convenzione sugli identificatori; per esempio:

i d li i i i i li moduli iniziano con una maiuscolale porte sono sempre tutte maiuscolei segnali interni al modulo sono sempre tutti minuscolii segnali attivi bassi terminano con “b” oppure con “_”

Verilog e’ “case sensitive” (per default) quindi “pippo” e’ diverso da “Pippo”.

Paolo Musico INFN GenovaFebbraio 2017 8

SINTASSI (4)

Variabili di tipo fisico.Tipo reg : memorizza il valore dell’ ultimo assegnamento in un blocco proceduraleTipo reg : memorizza il valore dell ultimo assegnamento in un blocco proceduraleTipo wire: rappresenta la connessione tra porte di varie entita’. Puo’ venire assegnatotramite “continuous assignment”.Esistono altri tipi di wires: wand (wired and) wor (wired or) tri (tristate)Esistono altri tipi di wires: wand (wired and), wor (wired or), tri (tristate).Le variabili possono essere scalari e vettoriali. Esempi:

reg out; // scalarereg [7:0] data bus; // 8 bit busg [ ] _ ; //wire [1:0] select; // 2 bit buswire enabled; // scalare

E’ possibile dichiarare una memoria come: reg [7:0] data_mem[1023:0]Notare che la dimensione dei vettori e’ [<start bit>:<end bit>].Il fatto che si metta prima MSB e poi LSB e’ solo una convenzione.Possibili valori: 0 (logic zero, false), 1 (logic one, true), x (unknown), z (Hi-Z).

Paolo Musico INFN GenovaFebbraio 2017 9

( g , ), ( g , ), ( ), ( )

SINTASSI (5)

Altri tipi di variabili (usate di solito nei moduli di test).Tipo integer: intero a 32 bit con segno. Solitamente usato come contatore nei loop.Ti i i 64 biTipo time: intero a 64 bit senza segno.

Operatori aritmetici.+ addizione- sottrazione e negazione unaria* moltiplicazionep/ divisione% modulo

Operatori logiciOperatori logici.! negazione logica&& AND logico|| OR logico

Paolo Musico INFN GenovaFebbraio 2017 10

|| OR logico

SINTASSI (6)

Operatori logici relazionari.> maggiore>= maggiore o ugualemaggiore o uguale< minore<= minore o uguale== uguaglianza logica (NON assegnazione)== uguaglianza logica (NON assegnazione)!= diseguaglianza logica

Operatori bitwise (operano sui singoli bit di un vettore).i~ negazione

& AND| OR^ XOR~& NAND~| NOR

Paolo Musico INFN GenovaFebbraio 2017 11

~^ XNOR

SINTASSI (7)

Altri operatori.>> Shift a destra. A = A >> 2; // Shifta A di 2 bit a destra<< Shift a sinistra.? : Condizionale. A = (B == 0) ? 1 : 0; // Se B=0 A=1 else A=0{,} Concatenazione. A = {4’b0011, 2’b01}; // A = 6’b001101{,} { , };

Assegnamento blockingA = 3;

A = 3;#1 A = A+1;

B = A+1;A = 3;

Assegnamento NON blockingA <= A + 1;

B A+1;// A = 4, B = 5

#1 A <= A+1;B <= A+1;

//Continuous assignment

assign A = in1 & in2; // A e’ di tipo wire

// A = 5, B = 5

Paolo Musico INFN GenovaFebbraio 2017 12

SINTASSI (8)

Strutture di controllo.if-else e case (casex e casez): esecuzione condizionata semplice e multiplafor, while, repeat e forever: ripetizione multipla

if( A == B )begin

case (sel)2’b00 o t 0

for(i=0; i<10; i=i+1)beginbegin

C = 0;endelse

2’b00: out = 0;2’b01: out = 1;default: out = x;

endcase

begin$display(”i = %0d”, i);

end

beginC = 1;

endwhile(i < 10)begin

i = i + 1;

repeat( 5 )begin

i = i + 1;end

i = i + 1;$display(”i = %0d”, i);

endforever

Paolo Musico INFN GenovaFebbraio 2017 13

#10 CK = ~CK;

SINTASSI (9)

Controllo temporale.Ritardo ‘#’: l’ esecuzione e’ ritardata delle unita’ temporali indicate.L’ unita’ temporale e’ identificata dalla direttiva `timescale <unit>/<precision>.Evento ‘@’: l’ esecuzione e’ sospesa fino a che non si verifica l’ evento indicato.

`timescale 1ns/10ps // unita’ di 1 nsec, con precisione di 10 psecinitialbegin

#10 A = 0; // dopo 10 nsec A = 0#10 A 0; // dopo 10 nsec A 0@(posedge CK); // aspetta il fornte di salita di CKA = 1;@( B ); // aspetta una variazione di BA = 0;

end

Paolo Musico INFN GenovaFebbraio 2017 14

SINTASSI (10)

Altre parole chiave.parameter x = 2; // definisce il parametro x con valore 2parameter x 2; // definisce il parametro x con valore 2

Direttive.`include <nomefile> // include il file indicato`define <macro> <valore> // definisce una macro: richiamata con `<macro>

System tasks.$ //$finish // termina la simulazione$time // ritorna l’ istante corrente di simulazione (per stampe)$display$monitor$monitor$shm_open $shm_probe $shm_close // interfaccia verso signalscan$vcdpluson // interfaccia verso virsim

Paolo Musico INFN GenovaFebbraio 2017 15

SINTASSI (11)

Task.Equivalente (circa) ad una procedura in un comune linguaggio di programmazione.P ’ i i l iPuo’ avere argomenti, non ritorna valori.Puo’ impiegare statement di controllo temporale. task sleep;

input [31:0] period;begin

Funzioni.Puo’ avere argomenti e deve ritornare un valore.Non puo’ impiegare statement di controllo temporale.

beginrepeat( period )

#10;endp p g p

function [3:0] add1;input [3:0] a;begin

endtask

beginadd1 = a + 1;

endendfunction

…sleep(10); // aspetta 10 * 10 unita’ temporalic = add1(b); // c = b + 1…

Paolo Musico INFN GenovaFebbraio 2017 16

MODELLI BEHAVIORAL (1)

Seguire il metodo top-down. Separare il problema in blocchi elementari,implementarli e collegarli gerarchicamente, istanziandoli.

ll d i d liCollegamento dei moduli:per posizioneper nome

module MUX2_1(out, a, b, sel);…endmoduleendmodule

module top_level;…

2 iMUX2_1 first_mux(out1, a1, b1, sel1);MUX2_1 second_mux(.out(out2), .sel(sel2), .b(b1), .a(a1));

…endmodule

Paolo Musico INFN GenovaFebbraio 2017 17

endmodule

MODELLI BEHAVIORAL (2)

Blocchi procedurali initial e always.I blocchi initial vengono eseguiti una volta sola.I blocchi initial vengono eseguiti una volta sola.I blocchi always vengono eseguiti per sempre (finche’ dura la simulazione).Ogni modulo puo’ contenere piu’ blocchi initial e piu’ blocchi always.I blocchi initial vengono usati di solito nei moduli di testI blocchi initial vengono usati di solito nei moduli di test.I blocchi always modellano il comportamento di reti logiche e sequenziali.

initial always @(posedge CK)begin

a = 0;b = 0;

#10 b = 1;

beginA_reg <= A_reg;if( RSTb == 0 )

A reg <= 7’b0;#10 b 1;a = 1;

#50 b = 0;#10 a = 0;

A_reg < 7 b0;else

if( LD == 1 )A_reg <= data_in;

Paolo Musico INFN GenovaFebbraio 2017 18

end end

MODELLI BEHAVIORAL (3)

Le variabili assegnate in un blocco procedurale devono essere di tipo regaltrimenti si ha il messaggio illegal left-hand-side assignment.Ogni variabile puo’ essere assegnata in un solo blocco procedurale (sintesi).Fare attenzione all’ uso corretto degli operatori logici e/o bit wised.Le operazioni comprese tre begin e end vengono eseguite sequenzialmente.p p g g g qL’ esecuzione concorrente e’ gestita da fork e join (non la trattiamo).Gli statements casex e casez vengono usati per gestire le condizioni “don’t care”casex sia per ‘x’ che per ‘z’ e casez solo per ‘z’ Si usa il ‘?’ per specificarlocasex sia per x che per z e casez solo per z . Si usa il ? per specificarlo.

casex( data_in )4’b???1: prienc <= 1; 4’b??10: prienc <= 2;4’b?100: prienc <= 3;4’b1000: prienc <= 4;

endcase

Paolo Musico INFN GenovaFebbraio 2017 19

endcase

MODELLI BEHAVIORAL (4)

Modellazione del reset sincrono e asincrono.Tutte le logiche sequenziali devono avere uno stato iniziale, di solitoimposto con un segnale di reset esterno che puo’ essere sincronoimposto con un segnale di reset esterno, che puo essere sincrono(reset sul prossimo fronte del clock) o asincrono (immediato).

module SyncRstReg(OUT,D,CK,RSb); module ASyncRstReg(OUT,D,CK,RSb);output [3:0] OUT;input [3:0] D;input CK, RSb;begin

output [3:0] OUT;input [3:0] D;input CK, RSb;beginbegin

always @(posedge CK)if( RSb == 0 )

OUT <= 0;

beginalways @(posedge CK or negedge RSb)

if( RSb == 0 )OUT <= 0;

elseOUT <= D;

endendmodule

elseOUT <= D;

endendmodule

Paolo Musico INFN GenovaFebbraio 2017 20

endmodule endmodule

MODELLI BEHAVIORAL (5)

Continuous assignments: usati per modellare logica combinatoria.Occorre aver dichiarato la variabile di tipo wire.Vengono usati al di fuori dei blocchi procedurali.Ogni cambiamento nel valore dell’ espressione assegnata corrisponde adun cambiamento della variabile.un cambiamento della variabile.

wire out;wire eq;wire [7:0] data_out;

assign out = a & b;assign eq = (a == b);assign eq (a b);assign data_out = (enable == 1) ? data_in : 8’bz;

Paolo Musico INFN GenovaFebbraio 2017 21

MODELLI BEHAVIORAL (6)

La logica combinatoria puo’ anche essere modellata con blocchi procedurali(vedi l’ esempio del MUX2_1).

always @(enable or addr or reg0 or reg1 or reg2 or reg3)begin

if( enable == 1 )case( addr )

2’b00: data_out <= reg0;2’b01: data_out <= reg1;2’b10: data out <= reg2;2’b10: data_out <= reg2;2’b11: data_out <= reg3;

endcaseelse

data_out <= 0;end

Paolo Musico INFN GenovaFebbraio 2017 22

MODELLI BEHAVIORAL (7)

NON CONDIZIONARE MAI IL SEGNALE DI CLOCK!!!Condizionare il dato d’ ingresso invece…ContatoriContatori.Usare operatori ‘+’ e ‘-’ per implementare contatori in avanti o indietro.La generazione dei segnali d’ uscita puo’ essere fatta con logica combinatoriati “ ti i t ” i t t (1 i d di l k i )tipo “continuous assignments” oppure registrata (1 periodo di clock prima).

module cnt4(DATA_OUT, RSTb, CK);output [3:0] DATA_OUT;input RSTb, CK;reg [3:0] DATA_OUT;

always@(posedge CK)if( RSTb == 0 )if( RSTb 0 )

DATA_OUT <= 4’b0;else

DATA_OUT <= DATA_OUT + 1;

Paolo Musico INFN GenovaFebbraio 2017 23

endmodule

MODELLI BEHAVIORAL (8)

Macchine a stati implicite.La variabile di stato non e’ dichiarata. Il sintetizzatore se ne accorge e ne mettequante ne servono.Codifica elegante.Sintesi poco controllabile.

module implicit;always @(posedge CK)begin

l 0Usare sempre lo stessofronte di clock per controllarel’ avanzamento dello stato.

out_pulse <= 0;if( inp_signal == 1 )begin

out pulse <= 1;Attenzione al RESET dellavariabile di stato.Occorre imporre valori di reset

_p ;@(posedge CK);while( inp_signal == 1 )

@(posedge CK);dOccorre imporre valori di reset

e di default per le variabilidi uscita.Tutte le variabili di ingresso devono essere sincrone: eventualmente sincronizzarle

endend

endmodule

Paolo Musico INFN GenovaFebbraio 2017 24

Tutte le variabili di ingresso devono essere sincrone: eventualmente sincronizzarle.

MODELLI BEHAVIORAL (9)

always @(input var or state var)

Macchine a stati esplicite.La variabile di stato dischiarata

y ( p _ _ )begin

out_var <= out_var;case( state_var )

S0: beginout var <= 0;

esplicitamente.Maggior controllo sulla sintesi,sullo stato iniziale e di RESET.

out_var <= 0;if( input_var == 1 )

new_state <= S1;else

new_state <= S0;

Separazione della parte registratadalla logica di generazione dellostato successivo e delle variabili

endS1: begin

out_var <= 1;new_state <= S2;

endstato successivo e delle variabilid’ uscita.

module explicit;reg [1:0] state_var, new_state;parameter S0 = 0, S1 = 1,

S2: beginout_var <= 1;if( input_var == 1 )

new_state <= S2;elsep

S2 = 2, S3 = 3;

always @(posedge CK)state_var <= new_state;

elsenew_state <= S0;

endS3: new_state <= S0;

endcased

Paolo Musico INFN GenovaFebbraio 2017 25

endendmodule

SIMULAZIONE (1)

Una volta creato il modello comportamentale del circuito occorre simularlo.Creare un modulo di test in un file separato dal modello in cui istanziarloCreare un modulo di test in un file separato dal modello in cui istanziarloe generare gli stimoli che ne permettano una verifica esaustiva.Nel modulo di test di solito vengono chiamate le system task per salvareil database di simulazione che puo’ essere visualizzato in forma graficail database di simulazione che puo essere visualizzato in forma grafica.Di solito si mette un blocco initial per inizializzare tutte le variabili al tempo 0e per abilitare il salvataggio del database.Si tt i bl l l i d i li di l k ( i di i)Si mette poi un blocco always per la generazione dei segnali di clock (periodici).Possono venire utilizzate delle user task per la generazione degli stimoliche semplificano la scrittura dei vettori di test e rendono piu’ leggibile il codice.I vettori di test vengono posti in un blocco initial e alla fine di questo sichiude il database di simulazione e utilizza la system task $finish per terminareil processo.

Paolo Musico INFN GenovaFebbraio 2017 26

SIMULAZIONE (2)

`timescale 1ns/10psmodule test;reg A, B, selector;wire sig out;wire sig_out;MUX2_1 mux_instance(sig_out, A, B, selector);

initial // inizializzazione al tempo 0begin

A = 0; B = 0; selector = 0;$shm_open(”waves.shm”); $shm_probe(”AS”);

endendinitial // vettori di testbegin

#50 A = 1;#50 selector = 1;#50 B = 1;#50 $shm_close; $finish; // termina

end

Paolo Musico INFN GenovaFebbraio 2017 27

endendmodule

SIMULAZIONE (3)

Simulatori commerciali:Mentor QuestaSim (ex ModelSim)Mentor QuestaSim (ex ModelSim)Cadence ncsim (Incisive suite)Synopsys vcsXilinx ISEXilinx ISEAltera Qsim

P d tti F /O SProdotti Free/OpenSource:Icarus VerilogVerilatorVeriWell

Paolo Musico INFN GenovaFebbraio 2017 28

DEMO BOARD: TERASIC DE2-115

Paolo Musico INFN GenovaFebbraio 2017 29

DEMO BOARD: BLOCK DIAGRAM

Paolo Musico INFN GenovaFebbraio 2017 30

ALTERA CYCLONE IV FPGA

Paolo Musico INFN GenovaFebbraio 2017 31

Fine Line BGA 780 pin, 1 mm pitch

ALTERA CYCLONE IV LE IN NORMAL MODE

Paolo Musico INFN GenovaFebbraio 2017 32

ALTERA CYCLONE IV LE IN ARITHMETIC MODE

Paolo Musico INFN GenovaFebbraio 2017 33

ALTERA CYCLONE IV LABs

LEs are organized in LABs

1 LAB = 16 LEs

Paolo Musico INFN GenovaFebbraio 2017 34

DESIGN EXAMPLE ON DEMO BOARD

A lot of examples come with the board

Try to develop a custom example: Frequency Metermeasure the frequency of an input signal and show on 7 segment displays

CLOCK

COUNTER LATCHReset

TIMEBASECOUNTER LATCH DISPLAY

DRIVER

Reset

Load

INPUT

Paolo Musico INFN GenovaFebbraio 2017 35

CLASS EXERCISE

Implement a DSP function.Inputs are provided by a ADC and output must drive a DAC.Inputs are provided by a ADC and output must drive a DAC.Input signal will be generated by a pulse/function/arbitrary generatorOutput signal will be shown on a o-scope (together with input)

FunctionGenerator

ADC DSPFunction

DAC Oscilloscope

• Wire function to see that everything is OK• Moving average with programmable number of samples to be averagedMoving average with programmable number of samples to be averaged• Deconvolution with a known (simple) function• Other proposal from class?• Possibily serializing at least 2 proposed functions

Paolo Musico INFN GenovaFebbraio 2017 36

• Possibily serializing at least 2 proposed functions