Paolo Musico INFN Genova 1
Il Linguaggio VERILOG
IntroduzioneConcetti di baseSintassi del linguaggioModellazione di librerieModelli comportamentali (behavioral) orientati alla sintesi logicaVerifica (simulazione)Sintesi logica di FPGAImplementazione di una semplice interfaccia VME
Paolo Musico INFN Genova 2
INTRODUZIONE (1)
Verilog e’ un linguaggio di programmazione orientato alla descrizionedi strutture hardware (HDL) digitali.Viene usato per descrivere sistemi digitali a differenti livelli:
switch level: transistor levelgate level: porte logiche elementariRegister Transfer Level (RTL): scambio dati tra registri
Verilog e’ stato introdotto nel 1985 da Gateway Design System Corporatione 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 Genova 3
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.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 rappresentazioneschematica.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 Genova 4
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 ogniblocco 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.)
Metodologia mista: si decompone il problema top-down fino ad un certo limite;i 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 Genova 5
CONCETTI BASE (2)
Un intero progetto viene contenuto in piu’ files HDL: ogni file puo’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, …).Dopo la sintesi e’ possibile utilizzare la netlist gate level, applicare glistimoli e verificare che il risultato della sintesi soddisfi i requisiti del problema(limiti di velocita’, …).Strumenti necessari e disponibili su piattaforma Sun-Solaris:editor di testo (VI, GVIM, EMACS, TEXTEDIT, …),simulatore (Verilog-XL, VCS),visualizzatore di seganli (Signalscan, Virsim),sintetizzatore (Synopsys design_compiler o fpga_compiler, XILINX XST).
Paolo Musico INFN Genova 6
SINTASSI (1)
module MUX2_1(out, a, b, sel);output out;input a, b, sel;
reg out; // Commento
always @(sel or a or b)begin
if( sel == 0 )out <= a;
elseout <= b;
end/* Altro commento */endmodule
Esempio completo di modulo: mux 2 → 1.
Definizione del modulo con i segnalidi I/O.Definizione del tipo regBlocco procedurale alwaysUso di begin-endStatement decisionale if-elseAssegnazione: <=Commenti: // e /* */Statement di chiusura del modulo
Paolo Musico INFN Genova 7
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 (esempio: // synthesis attribute …).Numeri: interi e reali (non usati per la sintesi). Formato generico di un intero:
<size>’<base><value>
Esempi:12 // decimale (base 10)8’h5F // esadecimale a 8 bit6’b11_0010 // binario a 6 bit’o576 // ottale senza dimensione32’bz // binario a 32 bit Hi-Z
Il carattere ‘_’ viene ignorato e puo’ essere usato come separatore
Paolo Musico INFN Genova 8
SINTASSI (3)
Identificatori: iniziano con un carattere alfabetico (a-z, A-Z), possono contenerenumeri (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 sonousati.Crearsi una convenzione sugli identificatori; per esempio:
i 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 Genova 9
SINTASSI (4)
Variabili di tipo fisico.Tipo 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).Le variabili possono essere scalari e vettoriali. Esempi:
reg out; // scalarereg [7:0] data_bus; // 8 bit buswire [1:0] select; // 2 bit buswire enabled; // scalare
E’ possibile avere variabili vettoriali con segno:reg signed [7:0] s1data_bus; // range -128 <-> +127wire signed [3:0] s2data_bus; // range -8 <-> +7
Le variabili con segno vengono rappresentate in complemento a 2.
Paolo Musico INFN Genova 10
SINTASSI (5)
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: Verilog ammette 4 valori possibili:0 (logic zero, false), 1 (logic one, true), x (unknown), z (Hi-Z).
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.Tipo time: intero a 64 bit senza segno.
Paolo Musico INFN Genova 11
SINTASSI (6)
Operatori aritmetici.+ addizione- sottrazione e negazione unaria* moltiplicazione/ divisione% modulo
Operatori logici.! negazione logica&& AND logico|| OR logico
Paolo Musico INFN Genova 12
SINTASSI (7)
Operatori logici relazionari.> maggiore>= maggiore o uguale< minore<= minore o uguale== uguaglianza logica (NON assegnazione)!= diseguaglianza logica
Operatori bitwise (operano sui singoli bit di un vettore).~ negazione& AND| OR^ XOR~& NAND~| NOR~^ XNOR
Paolo Musico INFN Genova 13
SINTASSI (8)
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
Continuous assignment: usato per modellare semplice logica combinatoriae per cambiare nome ai segnali. Spesso usato per modellare i 3-state.
assign A = in1 & in2; // A e’ di tipo wireassign B = enable ? out : 1’bz; // B e’ di tipo wire
Paolo Musico INFN Genova 14
SINTASSI (9)
Assegnamento blockingA = 3;
L’ espressione viene valutata nel flusso diesecuzione e la variablile viene assegnataimmediatamente.
Assegnamento NON blockingA <= A + 1;
L’ espressione viene valutata nel flusso di esecuzione,viene assegnato il risultato ad una variabile temporanea ela variablile viene assegnata prima di passare all’ istante disimulazione successivo.
A = 3;#1 A = A+1;
B = A+1;// A = 4, B = 5
#1 A <= A+1;B <= A+1;
// A = 5, B = 5
Paolo Musico INFN Genova 15
SINTASSI (10)
Strutture di controllo (1).if-else e case (casex e casez): esecuzione condizionata semplice e multipla
if( A == B )begin
C = 0;endelsebegin
C = 1;end
case (sel)2’b00: out = 0;2’b01: out = 1;default: out = x;
endcase
Paolo Musico INFN Genova 16
SINTASSI (11)
Strutture di controllo (2).for, while, repeat e forever: ripetizione multipla
for(i=0; i<10; i=i+1)begin
$display(”i = %0d”, i);end
while(i < 10)begin
i = i + 1;end
repeat( 5 )begin
i = i + 1;$display(”i = %0d”, i);
end
forever#10 CK = ~CK;
Paolo Musico INFN Genova 17
SINTASSI (12)
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@(posedge CK); // aspetta il fornte di salita di CKA = 1;@( B ); // aspetta una variazione di BA = 0;
end
Paolo Musico INFN Genova 18
SINTASSI (13)
Altre parole chiave.parameter 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>
parameter e’ locale al modulo, define e’ locale al file (preprocessore)
System tasks.$finish // termina la simulazione$time // ritorna l’ istante corrente di simulazione (per stampe)$display$monitor$shm_open $shm_probe $shm_close // interfaccia verso signalscan$vcdpluson // interfaccia verso virsim
Paolo Musico INFN Genova 19
SINTASSI (14)
Task.Equivalente (circa) ad una procedura in un comune linguaggio di programmazione.Puo’ avere argomenti, non ritorna valori.Puo’ impiegare statement di controllo temporale.
Funzioni.Puo’ avere argomenti e deve ritornare un valore.Non puo’ impiegare statement di controllo temporale.
function [3:0] add1;input [3:0] a;begin
add1 = a + 1;endendfunction
task sleep;input [31:0] period;begin
repeat( period )#10;
endendtask
…sleep(10); // aspetta 10 * 10 unita’ temporalic = add1(b); // c = b + 1…
Paolo Musico INFN Genova 20
Abbiamo visto la dichiarazione di una memoria:reg [7:0] data_mem[1023:0] // 1024 word x 8 bit memory array
L’ accesso alla locazione i-esima si fara’ con: data_mem[i]
E’ possibile caricare una memoria da file esterno:$readmemb(“mem_file.txt”, data_mem); // binary file format$readmemh(“mem_file.txt”, data_mem); // hexadecimal file format
Il file testo avra’ il formato riportato nel riquadro.Uso di ‘_’ per migliorare la leggibilita’Uso di ‘@’ per accedere ad un indirizzo specificoVerilog non riporta errori di indirizzamento
MODELLAZIONE DI MEMORIE
0000_00000101_0001 0001_0101// one line comment@100 // at address 100 (hex)1111_1100/* multi linecomment */1100_0011@3FF0000_0000
Paolo Musico INFN Genova 21
Primitive di Verilog
Verilog ha definite delle funzioni logiche primitive: and, or, not, buf,
xor, nand, nor, xnor. Esse implementano la funzione logica indicata.Eccetto not e buf possono avere un numero variabile di ingressi.and a1 (out, in1, in2);or o1 (out2, in3, in4, in5);
Il primo parametro e’ sempre l’ uscita.I not e i buf possono avere multple uscite, ma sempre 1 solo ingresso.
Primitive condizionali: bufif1, bufif0, notif1, notif0.Servono per modellare segnali 3-state:bufif1 b1 (out3, in, enable); // out3 = in se enable = 1bufif0 b2 (out4, in, enable); // out4 = in se enable = 0
Il nome dell’ istanza e’ opzionale.Si puo’ indicare un ritardo: and #2 (o, i1, i2);
Paolo Musico INFN Genova 22
User Defined Primitives (UDP)
E’ possibile definire delle funzioni logiche primitive aggiuntive, combinatoriee sequenziali.Vengono definite tramite tabelle di verita’: hanno una sola uscita e da 1 a 10 ingressi.Tutti i segnali sono scalari e la ‘z’ non e’ supportata (viene mappata come ‘x’).
Ogni combinazione non indicataproduce una ‘x’ in uscita.Il ‘?’ rappresenta qualunque valore.
E’ possibile definire UDP sequenzialisia ‘level sensitive’ (latch) che‘edge sensitive’ (flip-flop).
primitive mux_21(o, a, b, s);output o;input a, b, s;table// a b s : o
0 ? 1 : 0;1 ? 1 : 1;? 0 0 : 0;? 1 0 : 1;0 0 x : 0;1 1 x : 1;
endtableendprimitive
Paolo Musico INFN Genova 23
MODELLAZIONE DI LIBRERIE (1)
Un elemento (cella) di libreria e’ un modulo, composto di 2 parti:descrizione funzionale e temporizzazioni relative.
Le celle cosi’ descritte vengono usate per ilcalcolo dei ritardi in funzione del carico.
La descrizione funzionale puo’ essereimplementata con primitive e/o UDPoppure con statement behavioral: evitarela descrizione mista.
`celldefine`timescale 1ns/10psmodule mux_21(o, a, b, s);output o;input a, b, s;// Functional description…// Timing…endmodule`endcelldefine
Paolo Musico INFN Genova 24
MODELLAZIONE DI LIBRERIE (2)
Le temporizzazioni identificano il ritardo di propagazione dei segnali all’ internodella cella e permettono di effettuare controlli (tipo setup/hold).Di solito si definiscono i ritardi ‘pin to pin’ (path delay)che possono dipendere dallo stato logicodei segnali.Se uno stato non e’ definito il ritardoe’ nullo.
$setup $hold $width sono usati per controllarele temporizzazioni. Esempio:
$setup(data, posedge ck, 10, flag);
flag cambia stato se il controllo fallisce, e verra’usato per notificare il fallimento a qualche modo.
`celldefine`timescale 1ns/10psmodule XOR2(y, a, b);output y;input a, b;// Functional description
xor i1 (y, a, b);// Timing
specifyif( b ) (a => y)= (20, 20);if(~b ) (a => y)= (10, 20);if( a ) (b => y)= (20, 10);if(~a ) (b => y)= (15, 10);
endspecifyendmodule`endcelldefine
Paolo Musico INFN Genova 25
MODELLI BEHAVIORAL (1)
Seguire il metodo top-down. Separare il problema in blocchi elementari,implementarli e collegarli gerarchicamente, istanziandoli.Collegamento dei moduli:
per posizioneper nome
module MUX2_1(out, a, b, sel);…endmodule
module top_level;…
MUX2_1 first_mux(out1, a1, b1, sel1);MUX2_1 second_mux(.out(out2), .sel(sel2), .b(b1), .a(a1));
…endmodule
Paolo Musico INFN Genova 26
MODELLI BEHAVIORAL (2)
Blocchi procedurali initial e always.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 test.I blocchi always modellano il comportamento di reti logiche e sequenziali.L’ esecuzione di tutti i blocchi procedurali inizia in parallelo al tempo zero.
initialbegin
a = 0;b = 0;
#10 b = 1;a = 1;
#50 b = 0;#10 a = 0;
end
always @(posedge CK)begin
A_reg <= A_reg;if( RSTb == 0 )
A_reg <= 7’b0;else
if( LD == 1 )A_reg <= data_in;
end
Paolo Musico INFN Genova 27
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.L’ 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 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 Genova 28
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 sincrono(reset sul prossimo fronte del clock) o asincrono (immediato).
module SyncRstReg(OUT,D,CK,RSb);output [3:0] OUT;input [3:0] D;input CK, RSb;begin
always @(posedge CK)if( RSb == 0 )
OUT <= 0;else
OUT <= D;endendmodule
module ASyncRstReg(OUT,D,CK,RSb);output [3:0] OUT;input [3:0] D;input CK, RSb;begin
always @(posedge CK or negedge RSb)if( RSb == 0 )
OUT <= 0;else
OUT <= D;endendmodule
Paolo Musico INFN Genova 29
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.
wire out;wire eq;wire [7:0] data_out;
assign out = a & b;assign eq = (a == b);assign data_out = (enable == 1) ? data_in : 8’bz;
Paolo Musico INFN Genova 30
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’b11: data_out <= reg3;
endcaseelse
data_out <= 0;end
Paolo Musico INFN Genova 31
MODELLI BEHAVIORAL (7)
NON CONDIZIONARE MAI IL SEGNALE DI CLOCK!!!Condizionare il dato d’ ingresso invece…Contatori.Usare operatori ‘+’ e ‘-’ per implementare contatori in avanti o indietro.La generazione dei segnali d’ uscita puo’ essere fatta con logica combinatoriatipo “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 )
DATA_OUT <= 4’b0;else
DATA_OUT <= DATA_OUT + 1;endmodule
Paolo Musico INFN Genova 32
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.Usare sempre lo stessofronte di clock per controllarel’ avanzamento dello stato.Attenzione al RESET dellavariabile di stato.Occorre imporre valori di resete di default per le variabilidi uscita.Tutte le variabili di ingresso devono essere sincrone: eventualmente sincronizzarle.
module implicit;always @(posedge CK)begin
out_pulse <= 0;if( inp_signal == 1 )begin
out_pulse <= 1;@(posedge CK);while( inp_signal == 1 )
@(posedge CK);end
endendmodule
Paolo Musico INFN Genova 33
MODELLI BEHAVIORAL (9)
Macchine a stati esplicite.La variabile di stato dischiarataesplicitamente.Maggior controllo sulla sintesi,sullo stato iniziale e di RESET.Separazione della parte registratadalla logica di generazione dellostato successivo e delle variabilid’ uscita.
module explicit;reg [1:0] state_var, new_state;parameter S0 = 0, S1 = 1,S2 = 2, S3 = 3;
always @(posedge CK)state_var <= new_state;
always @(input_var or state_var)begin
out_var <= out_var;case( state_var )
S0: beginout_var <= 0;if( input_var == 1 )
new_state <= S1;else
new_state <= S0;end
S1: beginout_var <= 1;new_state <= S2;
endS2: begin
out_var <= 1;if( input_var == 1 )
new_state <= S2;else
new_state <= S0;end
S3: new_state <= S0;endcase
endendmodule
Paolo Musico INFN Genova 34
MODELLI BEHAVIORAL (10)
Macchine a stati esplicite con unsolo blocco always.Come la sintassi precedente con ilvantaggio di avere tutte le variabili di uscitaregistrate.
I sintetizzatori riconoscono bene le macchineesplicite con le 2 implementazioni descritte,mentre “fanno fatica” a riconoscere quelleimplicite.
always @(posedge CK)begin
case( state_var )S0: begin
out_var <= 0;if( input_var == 1 )
new_state <= S1;else
new_state <= S0;end
S1: beginout_var <= 1;new_state <= S2;
endS2: begin
out_var <= 1;if( input_var == 1 )
new_state <= S2;else
new_state <= S0;end
S3: new_state <= S0;endcase
end
Paolo Musico INFN Genova 35
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 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 grafica.Di solito si mette un blocco initial per inizializzare tutte le variabili al tempo 0e per abilitare il salvataggio del database.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 Genova 36
SIMULAZIONE (2)
`timescale 1ns/10psmodule test;reg A, B, selector;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”);
endinitial // vettori di testbegin
#50 A = 1;#50 selector = 1;#50 B = 1;#50 $shm_close; $finish; // termina
endendmodule
Paolo Musico INFN Genova 37
SIMULAZIONE (3)
Far girare la simulazione e aprire il database con il visualizzatore diforme d’ onda.
Se si utilizza Verilog-XL (Cadence)verilog test_mux.v mux.vsignalscan
Se si utilizza VCS (Synopsys)vcs –Mupdate –I -line test_mux.v mux.v./simvvirsim
Manuali utente principali:/cds_2002/psd142/doc/vlogref/vlogref.pdf/cds_2002/psd142/doc/vloguser/vloguser.pdf
Paolo Musico INFN Genova 38
CALCOLO E ANALISI DEI RITARDI
Occorre poter calcolare il ritardo di propagazione dei segnali in funzione delcarico, della forza di pilotaggio di ogni nodo e di altri parametri (V, T, …).
Il calcolo viene fatto prendendo informazioni di connettivita’ dalla netlist e diparassiti dai tools di place and route: viene generato una informazione di ritardiin formato SDF, che puo’ essere utilizzata nella simulazione.Occorre mettere una chiamata $sdf_annotate nel codice Verilog in modo chele informazioni dei ritardi possano essere usate.
Paolo Musico INFN Genova 39
SINTESI DI FPGA (1)
Struttura interna di una XILINXdella famiglia XC3000: IOB, CLB,matrice di interconnessione.
Paolo Musico INFN Genova 40
SINTESI DI FPGA (2)
Struttura interna di una XILINXdella famiglia Spartan IIE
Paolo Musico INFN Genova 41
SINTESI DI FPGA (3)
Il modello verilog viene sintetizzato usando il pogramma fpga_compilerdi Synopsys.Si presenta con 2 interfacce: una grafica (fpga_analyzer) e una testuale(fpga_shell). Di solito si usa la prima in una fase di debug del processoe poi si prepara un file di script che viene interpretato dalla secondacon piu’ efficenza nelle fasi successive.Il sintetizzatore deve venire inizializzato identificando sia la famiglia di FPGAda utilizzare che il modello specifico. Questo si fa di solito utilizzandoun file di startup (.synopsys_dc.setup) nella directory correnteche viene letto ogni volta che lo si invoca.Noi abbiamo tools per sviluppare FPGA della famiglia XILINX.
Paolo Musico INFN Genova 42
SINTESI DI FPGA (4)
Le operazioni elementari che occorre far eseguire al sintetizzatore possonoessere riassunte:
lettura del file sorgentedefinizione del (o dei) segnale di clockapplicazione di vincoli temporali sugli ingressi e sulle usciteapplicazione di vincoli sull’ ottimizzazione (area o velocita’)inserimento dei pads e vincoli relativi (slew rate, pullup, …)compilazione e ottimizzazioneopzionalmente si puo’ inserire la posizione dei padse il tipo di componentegenerazione della netlist in formato opportuno (XNF)generazione di report post sintesigenerazione di vincoli per il processo di place & route
Paolo Musico INFN Genova 43
SINTESI DI FPGA (5)
Successivamente occorre utilizzare i progammi proprietari di XILINX pereffettuare il place & route della netlist XNF generata ed ottenere ilrisultato finale. La sequenza (script) puo’ essere cosi’ riassunta:
Generazione del database iniziale partendo dal file XNF (anche piu’ di 1)Mappatura dei gate della netlist nei blocchi elementari del dispositivoPlace & Route vero e proprioGenerazione del bitstream necessario alla programmazione del componenteGenerazione del file esadecimale con cui programmare la PROM serialeEstrazione delle informazioni temporali (ritardi) reali del componenteGenerazione del modello verilog gate level con ritardi reali
Vengono generati reports ad ogni passo con i quali si puo’ verificarel’ andamento del processo.E’ poi possibile simulare il risultato finale con gli stimoli di progetto
Paolo Musico INFN Genova 44
INTERFACCIA VME (1)
Il bus VME e’ un tipico bus asincrono da microprocessore (tipo MC68000),con 32 linee dati, 32 linee indirizzi, interrupts, possibilita’ di gestione multimaster,trasferimento a blocchi, …Non verra’ trattato estesamente il bus VME in se stesso.Implementazione di una piccola struttura (registro) accessibile da bus VME.Operazioni da compiere:
Riconoscimento ciclo di indirizzamento.Riconoscimento ciclo dati.Operazione di lettura oppure scrittura nel registro.Chiusura del ciclo.
Per semplicita’ di gestione SW da parte della CPU master cerchiamo diimplementare una struttura il piu’ generale possibile.Gestiamo semplici cicli dati, senza interrupts.
Paolo Musico INFN Genova 45
INTERFACCIA VME (2)
Ciclo di lettura Ciclo di scrittura
Diagrammi temporali dei cicli di bus che ci interessano
Paolo Musico INFN Genova 46
INTERFACCIA VME (3)
Ciclo di indirizzamento.Dobbiamo decidere a quale indirizzo (o range di indirizzi) risponde la nostra unita’.Il VME permette indirizzamenti a 16 (short), 24 (standard) e a 32 bit (extended),e separa lo spazio utente dallo spazio supervisore, sia programma che dati.Questo viene indicato tramite le linee AM[5:0] (Address Modifiers).Gli AM identificano anche se il trasferimento dati e’ singolo oppure a blocchi.Sia le linee di indirizzo A[31:1] che gli AM[5:0] vengono convalidati dal segnale diAddress Strobe AS, attivo basso.Decidiamo di rispondere a cicli di indirizzamento a 32 bit, sia in spazio utente chesupervisore (programma e dati), senza trasferimento a blocchi.Implementando un solo registro decidiamo di rispondere ad un singolo indirizzodi longword (allineato a 4 byte) per generalita’.Usando l’ estensione V430 (CERN) e’ possibile avere un’ informazione geograficasulla posizione dell’ unita’ all’ interno del crate: non la usiamo per generalita’.
Paolo Musico INFN Genova 47
INTERFACCIA VME (4)
Ciclo dati.Il VME permette trasferimenti dati a 8, 16 e 32 bit: i segnali DSA, DSB eLWORD (attivi bassi) vengono usati per convalidare la sezione di businteressata.Per semplicita’ implementiamo un registro a 8 bit che risponda sulle lineeD[7:0] e accetti i tre tipi di ciclo: le scritture su D[31:8] verranno ignorate,le letture restituiscono 0.Il verso del trasferimento viene identificato tramite la linea WRITE: alto = lettura,basso = scrittura.In un ciclo di lettura occorre mettere sulle linee D[7:0] il contenuto del registro,mentre in un ciclo di scrittura occorre copiare nel registro il valore delle linee D[7:0].
Paolo Musico INFN Genova 48
INTERFACCIA VME (5)
Chiusura del ciclo.Dopo aver effettuato l’ operazione richiesta occorre segnalarne la fine al master.Bisogna generare il segnale DTACK in caso di esito positivo e BERR incaso di errore. Entrambi sono attivi bassi e Open Collector.Essi verranno generati attivi alti dalla logica che pilotera’ un transistor NPN(es. 2N2222, 2N2369, …) per implementare il tipo di segnale richiesto.Possiamo decidere di generare BERR in caso di ciclo di indirizzamento errato,oppure, per semplicita’, di non generarlo mai (ignoriamo i tipi di ciclo non gestiti).
Implementiamo sia la logica di gestione VME che il nostro registro in una FPGAXILINX tipo XC5204-6PC68C, a parte i buffer dati (74ACT245) e i comparatorisulle linee A[31:8] (74ACT521).Implementiamo il circuito di controllo con logica SINCRONA: serve un segnaledi clock abbastanza veloce (FCK ≥ 20 MHz).
Paolo Musico INFN Genova 49
INTERFACCIA VME (6)
Schema a blocchi del circuito: FPGA, buffer dati, comparatori di indirizzi.
Paolo Musico INFN Genova 50
INTERFACCIA VME (7)
Segue il listato del codice dell’ interfaccia e del modulo di test.Provare un’ implementazione indipendente.Simulazione del modello realizzato.Caricamento di Synopsys e familiarizzazione con l’ interfaccia utente.Prova di sintesi e place & route utilizzando scripts.Simulazione post processamento e analisi delle differenze.