Il Linguaggio VERILOG Introduzione Concetti di base Sintassi del linguaggio Modellazione di librerie Modelli comportamentali (behavioral) orientati alla sintesi logica Verifica (simulazione) Sintesi logica di FPGA Implementazione di una semplice interfaccia VME Paolo Musico INFN Genova 1
INTRODUZIONE (1) Verilog e un linguaggio di programmazione orientato alla descrizione di strutture hardware (HDL) digitali. Viene usato per descrivere sistemi digitali a differenti livelli: switch level: transistor level gate level: porte logiche elementari Register Transfer Level (RTL): scambio dati tra registri Verilog e stato introdotto nel 1985 da Gateway Design System Corporation e 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 realizzazione di altri simulatori (VeriWell, VCS, VeriBest, ). Questo corso e orientato all introduzione della modellazione RTL. Paolo Musico INFN Genova 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. Verilog ha la sintassi C-like ed e meno formale di VHDL che ha una sintassi ADA-like ed e molto formale. Perche si usa un HDL? La complessita odierna dei circuiti non permette piu la semplice rappresentazione schematica. 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 implementazioni alternative dello stesso circuito e scegliere la piu performante. Paolo Musico INFN Genova 3
CONCETTI BASE (1) Metodologia Bottom-Up: usando componenti esistenti si sviluppa il progetto e 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 ogni blocco viene decomposto a sua volta fino ad limite (un banco di registri ha bisogno oltre che dei registri stessi di una decodifica, il singolo registro sara poi 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 i sottoblocchi con HDL e uso la sintesi per implementarli, utilizzando librerie di gates). Paolo Musico INFN Genova 4
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 che permetta 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 gli stimoli 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 5
SINTASSI (1) Esempio completo di modulo: mux 2 1. Definizione del modulo con i segnali di I/O. Definizione del tipo reg Blocco procedurale always Uso di begin- Statement decisionale if-else Assegnazione: <= Commenti: // e /* */ Statement di chiusura del modulo 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; else out <= b; /* Altro commento */ module Paolo Musico INFN Genova 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 ignorati dal parser del simulatore. E possibile usare commenti particolari come direttive per 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 bit 6 b11_0010 // binario a 6 bit o576 // ottale senza dimensione 32 bz // binario a 32 bit Hi-Z Il carattere _ viene ignorato e puo essere usato come separatore Paolo Musico INFN Genova 7
SINTASSI (3) Identificatori: iniziano con un carattere alfabetico (a-z, A-Z), possono contenere 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 sono usati. Crearsi una convenzione sugli identificatori; per esempio: i moduli iniziano con una maiuscola le porte sono sempre tutte maiuscole i segnali interni al modulo sono sempre tutti minuscoli i segnali attivi bassi terminano con b oppure con _ Verilog e case sensitive (per default) quindi pippo e diverso da Pippo. Paolo Musico INFN Genova 8
SINTASSI (4) Variabili di tipo fisico. Tipo reg : memorizza il valore dell ultimo assegnamento in un blocco procedurale Tipo wire: rappresenta la connessione tra porte di varie entita. Puo venire assegnato tramite 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; reg [7:0] data_bus; wire [1:0] select; wire enabled; // scalare // 8 bit bus // 2 bit bus // scalare E possibile avere variabili vettoriali con segno: reg signed [7:0] s1data_bus; // range -128 <-> +127 wire signed [3:0] s2data_bus; // range -8 <-> +7 Le variabili con segno vengono rappresentate in complemento a 2. Paolo Musico INFN Genova 9
SINTASSI (5) E possibile dichiarare una memoria come: reg [7:0] data_mem[1023:0] Notare che la dimensione dei vettori e [<start bit>:< 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 10
SINTASSI (6) Operatori aritmetici. + addizione - sottrazione e negazione unaria * moltiplicazione / divisione % modulo Operatori logici.! negazione logica && AND logico OR logico Paolo Musico INFN Genova 11
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 12
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 combinatoria e per cambiare nome ai segnali. Spesso usato per modellare i 3-state. assign A = in1 & in2; assign B = enable? out : 1 bz; // A e di tipo wire // B e di tipo wire Paolo Musico INFN Genova 13
SINTASSI (9) Assegnamento blocking A = 3; L espressione viene valutata nel flusso di esecuzione e la variablile viene assegnata immediatamente. A = 3; #1 A = A+1; B = A+1; Assegnamento NON blocking A <= A + 1; L espressione viene valutata nel flusso di esecuzione, viene assegnato il risultato ad una variabile temporanea e la variablile viene assegnata prima di passare all istante di simulazione successivo. // A = 4, B = 5 #1 A <= A+1; B <= A+1; // A = 5, B = 5 Paolo Musico INFN Genova 14
SINTASSI (10) Strutture di controllo (1). if-else e case (casex e casez): esecuzione condizionata semplice e multipla if( A == B ) begin C = 0; else begin C = 1; case (sel) 2 b00: out = 0; 2 b01: out = 1; default: out = x; case Paolo Musico INFN Genova 15
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); repeat( 5 ) begin i = i + 1; $display( i = %0d, i); while(i < 10) begin i = i + 1; forever #10 CK = ~CK; Paolo Musico INFN Genova 16
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 psec initial begin #10 A = 0; // dopo 10 nsec A = 0 @(posedge CK); // aspetta il fornte di salita di CK A = 1; @( B ); // aspetta una variazione di B A = 0; Paolo Musico INFN Genova 17
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 18
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; function task sleep; input [31:0] period; begin repeat( period ) #10; task sleep(10); // aspetta 10 * 10 unita temporali c = add1(b); // c = b + 1 Paolo Musico INFN Genova 19
MODELLAZIONE DI MEMORIE 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); $readmemh( mem_file.txt, data_mem); Il file testo avra il formato riportato nel riquadro. Uso di _ per migliorare la leggibilita Uso di @ per accedere ad un indirizzo specifico Verilog non riporta errori di indirizzamento // binary file format // hexadecimal file format 0000_0000 0101_0001 0001_0101 // one line comment @100 // at address 100 (hex) 1111_1100 /* multi line comment */ 1100_0011 @3FF 0000_0000 Paolo Musico INFN Genova 20
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 = 1 bufif0 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 21
User Defined Primitives (UDP) E possibile definire delle funzioni logiche primitive aggiuntive, combinatorie e 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 indicata produce una x in uscita. Il? rappresenta qualunque valore. E possibile definire UDP sequenziali sia 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; table primitive Paolo Musico INFN Genova 22
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 il calcolo dei ritardi in funzione del carico. La descrizione funzionale puo essere implementata con primitive e/o UDP oppure con statement behavioral: evitare la descrizione mista. `celldefine `timescale 1ns/10ps module mux_21(o, a, b, s); output o; input a, b, s; // Functional description // Timing module `celldefine Paolo Musico INFN Genova 23
MODELLAZIONE DI LIBRERIE (2) Le temporizzazioni identificano il ritardo di propagazione dei segnali all interno della cella e permettono di effettuare controlli (tipo setup/hold). Di solito si definiscono i ritardi pin to pin (path delay) che possono dipere dallo stato logico dei segnali. Se uno stato non e definito il ritardo e nullo. $setup $hold $width sono usati per controllare le 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/10ps module XOR2(y, a, b); output y; input a, b; // Functional description xor i1 (y, a, b); // Timing specify if( b ) (a => y)= (20, 20); if(~b ) (a => y)= (10, 20); if( a ) (b => y)= (20, 10); if(~a ) (b => y)= (15, 10); specify module `celldefine Paolo Musico INFN Genova 24
MODELLI BEHAVIORAL (1) Seguire il metodo top-down. Separare il problema in blocchi elementari, implementarli e collegarli gerarchicamente, istanziandoli. Collegamento dei moduli: per posizione per nome module MUX2_1(out, a, b, sel); module module top_level; MUX2_1 first_mux(out1, a1, b1, sel1); MUX2_1 second_mux(.out(out2),.sel(sel2),.b(b1),.a(a1)); module Paolo Musico INFN Genova 25
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. initial begin a = 0; b = 0; #10 b = 1; a = 1; #50 b = 0; #10 a = 0; always @(posedge CK) begin A_reg <= A_reg; if( RSTb == 0 ) A_reg <= 7 b0; else if( LD == 1 ) A_reg <= data_in; Paolo Musico INFN Genova 26
MODELLI BEHAVIORAL (3) Le variabili assegnate in un blocco procedurale devono essere di tipo reg altrimenti 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 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; case Paolo Musico INFN Genova 27
MODELLI BEHAVIORAL (4) Modellazione del reset sincrono e asincrono. Tutte le logiche sequenziali devono avere uno stato iniziale, di solito imposto 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; module 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; module Paolo Musico INFN Genova 28
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 ad un 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 29
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; case else data_out <= 0; Paolo Musico INFN Genova 30
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 combinatoria 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 ) DATA_OUT <= 4 b0; else DATA_OUT <= DATA_OUT + 1; module Paolo Musico INFN Genova 31
MODELLI BEHAVIORAL (8) Macchine a stati implicite. La variabile di stato non e dichiarata. Il sintetizzatore se ne accorge e ne mette quante ne servono. module implicit; Codifica elegante. always @(posedge CK) Sintesi poco controllabile. begin Usare sempre lo stesso out_pulse <= 0; if( inp_signal == 1 ) fronte di clock per controllare begin l avanzamento dello stato. out_pulse <= 1; Attenzione al RESET della @(posedge CK); variabile di stato. while( inp_signal == 1 ) @(posedge CK); Occorre imporre valori di reset e di default per le variabili di uscita. module Tutte le variabili di ingresso devono essere sincrone: eventualmente sincronizzarle. Paolo Musico INFN Genova 32
MODELLI BEHAVIORAL (9) Macchine a stati esplicite. La variabile di stato dischiarata esplicitamente. Maggior controllo sulla sintesi, sullo stato iniziale e di RESET. Separazione della parte registrata dalla logica di generazione dello stato successivo e delle variabili d 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: begin out_var <= 0; if( input_var == 1 ) new_state <= S1; else new_state <= S0; S1: begin out_var <= 1; new_state <= S2; S2: begin out_var <= 1; if( input_var == 1 ) new_state <= S2; else new_state <= S0; S3: new_state <= S0; case module Paolo Musico INFN Genova 33
MODELLI BEHAVIORAL (10) Macchine a stati esplicite con un solo blocco always. Come la sintassi precedente con il vantaggio di avere tutte le variabili di uscita registrate. I sintetizzatori riconoscono bene le macchine esplicite con le 2 implementazioni descritte, mentre fanno fatica a riconoscere quelle implicite. always @(posedge CK) begin case( state_var ) S0: begin out_var <= 0; if( input_var == 1 ) new_state <= S1; else new_state <= S0; S1: begin out_var <= 1; new_state <= S2; S2: begin out_var <= 1; if( input_var == 1 ) new_state <= S2; else new_state <= S0; S3: new_state <= S0; case Paolo Musico INFN Genova 34
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 istanziarlo e generare gli stimoli che ne permettano una verifica esaustiva. Nel modulo di test di solito vengono chiamate le system task per salvare il database di simulazione che puo essere visualizzato in forma grafica. Di solito si mette un blocco initial per inizializzare tutte le variabili al tempo 0 e 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 stimoli che semplificano la scrittura dei vettori di test e rono piu leggibile il codice. I vettori di test vengono posti in un blocco initial e alla fine di questo si chiude il database di simulazione e utilizza la system task $finish per terminare il processo. Paolo Musico INFN Genova 35
SIMULAZIONE (2) `timescale 1ns/10ps module test; reg A, B, selector; wire sig_out; MUX2_1 mux_instance(sig_out, A, B, selector); initial // inizializzazione al tempo 0 begin A = 0; B = 0; selector = 0; $shm_open( waves.shm ); $shm_probe( AS ); initial // vettori di test begin #50 A = 1; #50 selector = 1; #50 B = 1; #50 $shm_close; $finish; // termina module Paolo Musico INFN Genova 36
SIMULAZIONE (3) Far girare la simulazione e aprire il database con il visualizzatore di forme d onda. Se si utilizza Verilog-XL (Cadence) verilog test_mux.v mux.v signalscan Se si utilizza VCS (Synopsys) vcs Mupdate I -line test_mux.v mux.v./simv virsim Manuali utente principali: /cds_2002/psd142/doc/vlogref/vlogref.pdf /cds_2002/psd142/doc/vloguser/vloguser.pdf Paolo Musico INFN Genova 37
CALCOLO E ANALISI DEI RITARDI Occorre poter calcolare il ritardo di propagazione dei segnali in funzione del carico, della forza di pilotaggio di ogni nodo e di altri parametri (V, T, ). Il calcolo viene fatto pro informazioni di connettivita dalla netlist e di parassiti dai tools di place and route: viene generato una informazione di ritardi in formato SDF, che puo essere utilizzata nella simulazione. Occorre mettere una chiamata $sdf_annotate nel codice Verilog in modo che le informazioni dei ritardi possano essere usate. Paolo Musico INFN Genova 38
SINTESI DI FPGA (1) Struttura interna di una XILINX della famiglia XC3000: IOB, CLB, matrice di interconnessione. Paolo Musico INFN Genova 39
SINTESI DI FPGA (2) Struttura interna di una XILINX della famiglia Spartan IIE Paolo Musico INFN Genova 40
SINTESI DI FPGA (3) Il modello verilog viene sintetizzato usando il pogramma fpga_compiler di 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 processo e poi si prepara un file di script che viene interpretato dalla seconda con piu efficenza nelle fasi successive. Il sintetizzatore deve venire inizializzato identificando sia la famiglia di FPGA da utilizzare che il modello specifico. Questo si fa di solito utilizzando un file di startup (.synopsys_dc.setup) nella directory corrente che viene letto ogni volta che lo si invoca. Noi abbiamo tools per sviluppare FPGA della famiglia XILINX. Paolo Musico INFN Genova 41
SINTESI DI FPGA (4) Le operazioni elementari che occorre far eseguire al sintetizzatore possono essere riassunte: lettura del file sorgente definizione del (o dei) segnale di clock applicazione di vincoli temporali sugli ingressi e sulle uscite applicazione di vincoli sull ottimizzazione (area o velocita ) inserimento dei pads e vincoli relativi (slew rate, pullup, ) compilazione e ottimizzazione opzionalmente si puo inserire la posizione dei pads e il tipo di componente generazione della netlist in formato opportuno (XNF) generazione di report post sintesi generazione di vincoli per il processo di place & route Paolo Musico INFN Genova 42
SINTESI DI FPGA (5) Successivamente occorre utilizzare i progammi proprietari di XILINX per effettuare il place & route della netlist XNF generata ed ottenere il risultato finale. La sequenza (script) puo essere cosi riassunta: Generazione del database iniziale parto dal file XNF (anche piu di 1) Mappatura dei gate della netlist nei blocchi elementari del dispositivo Place & Route vero e proprio Generazione del bitstream necessario alla programmazione del componente Generazione del file esadecimale con cui programmare la PROM seriale Estrazione delle informazioni temporali (ritardi) reali del componente Generazione del modello verilog gate level con ritardi reali Vengono generati reports ad ogni passo con i quali si puo verificare l andamento del processo. E poi possibile simulare il risultato finale con gli stimoli di progetto Paolo Musico INFN Genova 43
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 di implementare una struttura il piu generale possibile. Gestiamo semplici cicli dati, senza interrupts. Paolo Musico INFN Genova 44
INTERFACCIA VME (2) Diagrammi temporali dei cicli di bus che ci interessano Ciclo di lettura Ciclo di scrittura Paolo Musico INFN Genova 45
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 (exted), 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 di Address Strobe AS, attivo basso. Decidiamo di rispondere a cicli di indirizzamento a 32 bit, sia in spazio utente che supervisore (programma e dati), senza trasferimento a blocchi. Implementando un solo registro decidiamo di rispondere ad un singolo indirizzo di longword (allineato a 4 byte) per generalita. Usando l estensione V430 (CERN) e possibile avere un informazione geografica sulla posizione dell unita all interno del crate: non la usiamo per generalita. Paolo Musico INFN Genova 46
INTERFACCIA VME (4) Ciclo dati. Il VME permette trasferimenti dati a 8, 16 e 32 bit: i segnali DSA, DSB e LWORD (attivi bassi) vengono usati per convalidare la sezione di bus interessata. Per semplicita implementiamo un registro a 8 bit che risponda sulle linee D[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 47
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 in caso 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 FPGA XILINX tipo XC5204-6PC68C, a parte i buffer dati (74ACT245) e i comparatori sulle linee A[31:8] (74ACT521). Implementiamo il circuito di controllo con logica SINCRONA: serve un segnale di clock abbastanza veloce (F CK 20 MHz). Paolo Musico INFN Genova 48
INTERFACCIA VME (6) Schema a blocchi del circuito: FPGA, buffer dati, comparatori di indirizzi. Paolo Musico INFN Genova 49
INTERFACCIA VME (7) Segue il listato del codice dell interfaccia e del modulo di test. Provare un implementazione indipente. 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. Paolo Musico INFN Genova 50