Logica combinatoria in linguaggio Verilog Lucidi del Corso di Elettronica Digitale Modulo 7 Università di Cagliari Dipartimento di Ingegneria Elettrica ed Elettronica Laboratorio di Elettronica (EOLAB) Logica Combinatoria Logica combinatoria: un blocco di logica in cui le M uscite sono, sono in ogni istante, istante funzione logica degli N ingressi in quell’istante e NON della storia passata degli ingressi x1 x2 y1 y2 Logica combinatoria xN 17 Novembre 2009 yM ED - Verilog combinatorio Massimo Barbaro 2 Stili descrittivi di logica combinatoria Strutturale: la funzione viene descritta come interconnessione di p primitive logiche g ((and, or, not, nand, nor, etc.). E’ necessario sintetizzare il circuito logico a partire dalla descrizione iniziale Dataflow: la funzione viene descritta in termini di trasformazioni algebriche degli ingressi per mezzo di continuous assigments g (parola-chiave assign). (p g ) E’ necessario sintetizzare il circuito logico a partire dalla descrizione iniziale (come la descrizione strutturale ma si usano espressioni algebriche anzi che porte) Algoritmico/RTL: la funzione viene descritta per mezzo di blocchi p procedurali ((always) y ) in termini algoritmici g (if…else, case, for). Si può partire da una descrizione descrittiva del sistema senza necessariamente passare dalla sintesi logica 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 3 Descrizione strutturale Si basa sull’uso di primitive logiche (AND, NAND OR, NAND, OR NOR, NOR XOR, XOR XNOR, XNOR BUF, BUF NOT) che rappresentano l’equivalente della porta logica disegnata in uno schematico. schematico Tutti i segnali interni ed esterni sono NET ( bbi (abbiamo usato t solo l i NET di tipo ti wire) i ) Coincide con una descrizione testuale di uno schematico (l’equivalente di una netlist spice rispetto ad un circuito disegnato) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 4 Descrizione strutturale: esempio Vediamo come esempio la descrizione di un half adder half-adder A nA nAB S B nB AnB C 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 5 Descrizione strutturale: half-adder module ha(A,B,C,S); input A,B; output C,S; wire A,B,C,S,nA,nB,nAB,AnB; not n1(nA,A); not n2(nB,B); and a1(nAB,nA,B); and a2(AnB,A,nB); or o1(S,nAB,AnB); and a3(C,A,B); endmodule 17 Novembre 2009 Ingressi e uscite a singolo bit Segnali interni (interconnessione fra porte) La parola chiave not indica il tipo di porta L’assegnazione dei nodi è posizionale (come in SPICE): il primo segnale della lista è sempre l’uscita ED - Verilog combinatorio Massimo Barbaro 6 Istanziazione di una primitiva logica Per istanziare una primitiva logica, come in spice si scrive una riga (una per componente) spice, Tipo di porta Uscita (SEMPRE il primo della lista) and a1 (nAB, nA, B); Nome del’istanza del istanza Ingressi Il nome dell’istanze può essere omesso, ma è meglio metterlo per chiarezza hi 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 7 Descrizione strutturale A differenza di spice TUTTI i nodi interni devono essere dichiarati ((subito dopo p la definizione delle p porte, all’inizio del modulo). Possono non essere dichiarati solo i wire a dimensione di un solo bit Per connettere ll’uscita uscita di una porta con ll’ingresso ingresso di un’altra gli si dà semplicemente lo stesso nome nA nAB …. and a1(nAB,nA,B); a1(nAB nA B); B S Nodo interno: wire 17 Novembre 2009 ED - Verilog combinatorio …. or o1(S,nAB,AnB); o1(S nAB AnB); …. Massimo Barbaro 8 Descrizione strutturale: primitive and: porta and (Z=AB) or: porta or (Z=A+B) nand: porta nand (Z=(AB)’) nor: porta nor (Z (Z=(A+B)’) (A B) ) xor: porta xor (Z=AB’+A’B) xnor: porta xnor (Z=(AB’+A’B)’) buf: buffer ( (Z=A) ) not: porta not (Z=A’) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 9 Descrizione strutturale Una descrizione strutturale può fare uso non solo delle primitive ma anche di altri moduli p p precedentemente definiti (nello stesso file, o in un altro file che fa parte dello stesso progetto). Per istanziare un modulo si procede come per le altre primitive: prima il nome del modulo, poi il nome della singola g istanza di q quel modulo seguito g dalla lista dei terminali Ci sono due modi per associare un nodo ad una particolare porta di un modulo Posizionale: nella lista conta l’ordine quindi i segnali sono associati alla porta corrispondente nella definizione del modulo Per nome: si associano uno per uno i nodi alla porta corrispondente 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 10 Istanziazione di un modulo Sottomodulo con 1 ingresso e 1 uscita (per i moduli non è obbligatorio che l’uscita l uscita sia in prima posizione) module mio_modulo(A,B); input A; output B; ….. endmodule module top(X,Y,Z); top(X Y Z); input X,Y; output Z; wire aa,bb,cc,dd; mio_modulo m1(cc,dd); mio modulo m2( mio_modulo m2(.B(aa), B(aa) .A(bb)); A(bb)); … endmodule 17 Novembre 2009 ED - Verilog combinatorio Assegnazione posizionale: cc->A dd->B Assegnazione per nome: bb->A aa->B Massimo Barbaro 11 Sottomodulo: esempio module sommatore(A,B,S); i input t [3:0] [3 0] A,B; AB output [4:0] S; wire i [2:0] [2 0] C; C wire [3:0] A,B; wire i [4:0] [4 0] S; S ha g1(A[0],B[0],C[0],S[0]); f g2(A[1],B[1],C[0],C[1],S[1]); fa 2(A[1] B[1] C[0] C[1] S[1]) fa g3(A[2],B[2],C[1],C[2],S[2]); f g4(A[3],B[3],C[2],S[4],S[3]); fa 4(A[3] B[3] C[2] S[4] S[3]) endmodule 17 Novembre 2009 ED - Verilog combinatorio Ogni segnale interno deve essere esplicitamente dichiarato con la sua dimensione (numero di bit). Q i di di A devo Quindi d di dire sia che è un ingresso (input) sia che è un filo (wire). Solo i wire a singolo bit possono essere omessi Massimo Barbaro 12 Descrizione dataflow Si basa sulla definizione algebrica delle uscite rispetto agli g ingressi, g le uscite sono direttamente definite con l’opportuna espressione algebrica Il nome dataflow (flusso di dati) deriva dal fatto che le uscite sono la trasformazione algebrica degli ingressi Tutti i segnali interni ed esterni sono NET (in particolare WIRE) il cui valore viene definito tramite un continuous assignment E’ simile alla descrizione strutturale, le porte logiche sono sostituite da operatori logici all’interno di un’espressione Ad esempio per descrivere lo half-adder half adder si può descrivere semplicemente l’espressione algebrica che genera le due uscite a partire dagli ingressi 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 13 Dataflow: operatori logici &: and fra due bit |: or fra due bit ^: xor fra due bit ~^:: xnor fra due bit ~: not di un singolo bit 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 14 Dataflow: half-adder module ha(A,B,C,S); input A,B; output C,S; wire A,B,C,S; assign C=A&B; assign i S=((~A)&B)|(A&(~B)); S (( A)&B)|(A&( B)) endmodule assign: parola-chiave necessaria per assegnare ad un segnale g ((in q questo caso di uscita,, ma p potrebbe essere un segnale interno) una espressione logica funzione degli ingressi e di eventuali altri nodi interni 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 15 Descrizioni dataflow e strutturale Le due descrizioni, per come le abbiamo utilizzate sono assolutamente EQUIVALENTI utilizzate, L’unica informazione che ci danno è infatti quella logica e funzionale ed abbiamo già verificato che le diverse descrizioni possibili di una funzione logica g sono tutte equivalenti q fino a che non vengono trasformate in circuiti e transistor Per il momento, anche la descrizione strutturale non corrisponde a qualcosa di fisico (non è d tt che detto h il circuito i it sarà à implementato i l t t con le l porte istanziate) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 16 Descrizione algoritmica/RTL La descrizione algoritmico/RTL fa uso di istruzioni procedurali eseguite all all’interno interno di un blocco always (ovviamente NON in un blocco initial in cui le istruzione vengono eseguite una volta sola) Il blocco always quindi, se scritto seguendo opportune regole, può essere usato per rappresentare un generico bl blocco di logica l i combinatoria bi t i Le regole per una corretta implementazione di un blocco combinatorio sono fondamentali perché si rischia, rischia non seguendole, di rappresentare un blocco completamente differente (sequenziale) senza accorgersene 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 17 Always: sensitivity list I blocchi always che implementano logica combinatoria sono leggermente gg diversi da q quelli utilizzati finora nella generazione di testbench: la loro esecuzione viene attivata solo in corrispondenza della variazione di un insieme di segnali detto sensitivity list La sensitivity list viene indicata fra parentesi tonde subito dopo p il simbolo @ ((at)) che segue g la p parola-chiave always. I nomi dei segnali della lista vengono separati dalla parola chiave or. Nella sensitivity list, list ovviamente, ovviamente andranno gli ingressi alla funzione combinatoria (ogni volta che cambia uno qualsiasi tra g q gli ingressi g devono essere aggiornate gg le uscite ossia eseguito l’always) Le uscite del blocco devono essere di tipo reg perché sono assegnate in un blocco procedurale (l’always) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 18 Always: sensitivity list x1 x2 Logica Combinatoria xN yM … always @(x1 or x2 or x3 … or xn) begin …. end … 17 Novembre 2009 y1 y2 ED - Verilog combinatorio Sensitivity list: l’always viene eseguito solo se cambia uno l i i ffra i qualsiasi segnali x1, x2,…, xn Massimo Barbaro 19 Always: assegnazione delle uscite x1 x2 Logica Combinatoria xN yM always @(x1 or x2 or x3 … or xN) begin …. y1= …. ; …. yM=…. ; end 17 Novembre 2009 y1 y2 ED - Verilog combinatorio Le uscite devono sempre essere assegnate altrimenti il loro valore dipenderebbe dalla storia degli ingressi perché manterrebbero il valore precedente Massimo Barbaro 20 Esempio: half-adder L’implementazione con un always di un blocco combinatorio già implementato in dataflow e strutturale: module ha(A,B,C,S); i input t A,B; AB output C,S; reg C,S; CS always @(A or B) begin C=A&B; S=A^B; end endmodule 17 Novembre 2009 C e S sono reg perché sono assegnati in un blocco procedurale La sensitivity list contiene tutti gli ingressi al blocco L’assegnamento ad un reg NON richiede la parola chiave assign (usata solo per i wire) e viene fatto SOLO dentro un always o un initial ED - Verilog combinatorio Massimo Barbaro 21 Costrutti algoritmici La descrizione precedente non ha alcun vantaggio rispetto a quella strutturale e tanto meno dataflow (anzi, la descrizione dataflow è praticamente identica,, con la sola differenza che p le uscite sono wire ed assegnate con un assign) Si ottiene un enorme vantaggio (in semplicità e leggibiltà di descrizione, facilità di i l implementazione) t i ) sfruttando f tt d costrutti t tti più iù raffinati che possono essere evidentemente usati solo in un blocco procedurale: if…else, if else case, for 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 22 Istruzione condizionale (if…else) L’istruzione condizionale ha la stessa sintassi del linguaggio g gg C: if(espressione) blocco1 else blocco2 Se espressione è vera viene eseguito blocco1 altrimenti blocco2 (un blocco sono istruzioni racchiuse fra begin…end) Se espressione è un segnale su N bit allora è vera se il numero rappresentato è diverso da zero, falsa se il numero è zero o se contiene delle X o Z 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 23 Esempio: multiplexer module mux2_1(A,B,sel,Z); input A,B,sel; A B sel; output Z; reg Z; always @(A or B or sel) begin if(sel) Z=A;; else Z=B; end d endmodule 17 Novembre 2009 ED - Verilog combinatorio Multiplexer: se sel=1 l 1 passa A altrimenti B Tutti gli ingressi sono specificati nella sensitivity list In qualsiasi ramo della if l’uscita viene assegnata Massimo Barbaro 24 IF…ELSE combinatorio Perché la struttura if…else implementi veramente della logica combinatoria bisogna che per qualsiasi combinazione degli ingressi ll’uscita uscita (o le uscite) venga SEMPRE assegnata. assegnata Se esistesse anche una sola combinazione di i ingresso per cuii l’uscita l’ it non è assegnata, t l’uscita stessa, essendo un reg, manterrebbe il valore l assunto t precedentemente d t t quindi i di dipenderebbe dalla storia del circuito (avremmo d dunque l i logica sequenziale i l e NON combinatoria) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 25 Esempio: multiplexer module mux2_1(A,B,sel,Z); input A,B,sel; A B sel; output Z; reg Z; always @(A or B or sel) begin Z=B; if(sel) ( ) Z=A; end endmodule 17 Novembre 2009 ED - Verilog combinatorio Non è necessario che ci siano tutti i rami della if ma che la Z sia sempre assegnata. In questo caso per prima cosa si assegna B a Z e poi, se sel=1, si cambia il suo valore in A. Un assegnamento viene comunque eseguito per ogni valore degli ingressi Massimo Barbaro 26 Esempio: multiplexer 4x1 module mux4_1(A,B,C,D,sel,Z); input A,B,C,D; A B C D; input [1:0] sel; always @(A or B or C or D or sel) output Z; if(sel[1]) if(sel[0]) reg Z; Z=A;; else Z=B; …. else l if(sel[0]) Z=C; else Z=D; endmodule 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 27 Istruzione CASE Se i casi possibili sono molti più di due si possono usare delle if annidate oppure l’istruzione case case (espressione) val1: blocco1; val2: blocco2; … valN: bloccoN; default: blocco0; endcase 17 Novembre 2009 Se espressione non ricade in uno dei valori elencati si esegue g il default ((blocco0). ) ED - Verilog combinatorio Massimo Barbaro 28 Istruzione CASE A seconda del valore di espressione viene eseguito uno dei blocchi di istruzioni istruzioni. Se espressione non ricade in uno dei valori elencati l ti sii esegue il default d f lt (blocco0). (bl 0) Il match fra espressione e val è fatto bit a bit tenendo conto dei valori x e z, quindi: Se val2=2’b01 e espressione=2’b01 eseguo blocco2 Se val2=2’b01 e espressione=2’b0x NON eseguo blocco2 Se val2=2’b0x e espressione=2’b01 NON eseguo blocco2 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 29 Esempio: multiplexer 4x1 module mux4_1(A,B,C,D,sel,Z); p A,B,C,D; , , , ; input input [1:0] sel; output Z; reg Z; always @(A or B or C or D or sel) case (sel) ( l) 2’b00: Z=D; 2’b01: Z=C;; 2’b10: Z=B; 2’b11: Z=A; default: Z=A; endcase endmodule 17 Novembre 2009 ED - Verilog combinatorio Il default è necessario perché case confronta i bit considerando anche h i valori l i X e Z ed in questo caso non abbiamo specificato azioni quando i bit assumono tali valori (quindi non abbiamo specificato tutte le combinazioni di ingresso) Massimo Barbaro 30 Istruzione CASEX L’istruzione casex permette di non specificare tutti i casi e raggruppare insiemi di casi in cui viene eseguita la stessa operazione casex (espressione) val1: blocco1; val2: blocco2; … valN: bloccoN; default: blocco0; endcase 17 Novembre 2009 ED - Verilog combinatorio La differenza L diff coll case normale consiste nel fatto che in valN si possono specificare gruppi g pp di bit come X o Z ed in tal caso quei bit non vengono considerati id ti (d ’t (don’t care) Massimo Barbaro 31 Istruzione CASEX A seconda del valore di espressione viene eseguito uno dei blocchi di istruzioni. Se espressione non ricade in uno dei valori elencati si g il default ((blocco0). ) esegue Il match fra espressione e val è fatto bit a bit ma un valore di X o Z viene interpretato come don’t care (qualsiasi valore abbia quel bit l’espressione corrisponde se corrispondono gli altri bit) Se val2=2’b01 S l2 2’b01 e espressione=2’b01 i 2’b01 eseguo blocco2 bl 2 Se val2=2’b01 e espressione=2’b0x NON eseguo blocco2 Se val2 val2=2’b0x 2 b0x e espressione espressione=2’b01 2 b01 ESEGUO blocco2 Il match avviene per qualsiasi valore di questo bit 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 32 Esempio: priority encoder module pri_enc(A, Z); input [1:0] A; output Z; reg Z; always @(A) casex ((A)) 2’b1x: Z=1; 2’b01: Z=0; d f lt Z=x; default: Z endcase endmodule Il priority encoder è un codificatore che prende in ingresso N bit e mette in uscita M=log2N bit che h rappresentano t l la codifica di quale bit di ingresso g è attivo ((alto). ) I bit di ingresso hanno priorità quindi se quello a priorità massima è 1, 1 a prescindere dal valore degli ingressi si mette in uscita la sua codifica E’ utilizzato nella gestione delle interrupt 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 33 Istruzione FOR La for equivale alla corrispondente istruzione C esegue cioè un certo numero di istruzioni per un determinato numero di volte for (i=start; espressione; i=newexpr) begin … end La variabile i non può essere né un wire né un reg ma deve essere di tipo integer. Finché espressione è vera viene eseguito il blocco e viene valutato il nuovo valore di i con newexpr 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 34 Istruzione FOR Il numero di iterazioni nel ciclo for deve essere predeterminato a priori e NON può dipendere dai segnali di ingresso, altrimenti non avremmo logica combinatoria Poiché il ciclo for è troppo simile ad un istruzione di linguaggio di programmazione deve essere usato con molto lt attenzione tt i perché hé può ò facilmente f il t dar d l luogo a descrizioni inesatte di logica combinatoria (gli sono preferibili i costrutti if..else if else e case) Praticamente l’unico caso in cui useremo i cicli for saranno i testbench (modulo 8) ossia i moduli usati per verificare il funzionamento di un modulo (è utile per generare tutte le possibili combinazioni di ingresso) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 35 Esempio: priority encoder module pri_enc(A, Z); input [7:0] A; output [2:0] Z; reg [2:0] Z; integer K; y @( @(A)) always begin Z=3’bx; f (K 0 K 8 K for(K=0;K<8; K=K+1) K 1) if(A[K]) Z=K; end endmodule 17 Novembre 2009 ED - Verilog combinatorio K è un integer Z è sempre assegnato I bit più significativi di A hanno priorità maggiore Massimo Barbaro 36 Descrizione algoritmica: sottomoduli Non è detto che l’intero blocco combinatorio debba essere descritto con un unico always, è anche possibile suddividere ddi id gerarchicamente hi t il modulo d l in i sottomoduli, tt d li ciascuno dei quali può a sua volta essere un modulo separato o semplicemente un always dentro il modulo top I1 I2 int1 Modulo 1 int2 O1 Modulo 3 int3 I3 3 I4 17 Novembre 2009 M d l 2 Modulo Modulo 0 ED - Verilog combinatorio O2 Massimo Barbaro 37 Sottomoduli I1 I2 Modulo 1 int1 i t2 int2 O1 Modulo 3 int3 I3 I4 Modulo 2 O2 Modulo 0 Ad esempio, p si p possono scrivere 3 moduli, uno per ogni sottomodulo, e metterli tt li i i insieme nell modulo top (m0) 17 Novembre 2009 module m1(A,B,X,Y); … endmodule module m2(A,B,X,Y); … endmodule module odu e m3(A,B,C,X); 3( , ,C, ); … endmodule module d l m0(I1,I2,I3,I4,O1,O2); 0(I1 I2 I3 I4 O1 O2) … m1 g1(I1,I2,int1,int2); m2 g g2(I3,I4,int3,O2); ( , , , ); m3 g3(int1,int2,int3,O1); … endmodule ED - Verilog combinatorio Massimo Barbaro 38 Sottomoduli I1 I2 Modulo 1 int1 i t2 int2 O1 Modulo 3 int3 I3 I4 Modulo 2 O2 Modulo 0 ■ Oppure si può scrivere un unico modulo contenente 3 always differenti, uno per ogni sottomodulo. ■ La sensitivity-list sensitivity list del singolo always contiene solo gli ingressi al sottomodulo specifico ifi implementato i l t t 17 Novembre 2009 module m0(I1,I2,I3,I4,O1,O2); … always @(I1,I2) begin … end always @(int1, @(int1 int2, int2 int3) begin … end always @(I3,I4) begin … end … endmodule ED - Verilog combinatorio Massimo Barbaro 39 Espressioni: operatori Aritmetici (2 operandi, risultato su N bit) + (somma) (Es. (Es 5+2=7) - (sottrazione) * (moltiplicazione) / (divisione) Bitwise (bit a bit) (2 operandi, risultato su N bit) ~ (negazione) (Es. ~(0100)= 1011) & (and) (Es. (0111)&(1101)= 0101) | (or) ^ (xor) ~^,^~ (xnor) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 40 Espressioni: operatori Riduzione (1 operando, risultato su 1 bit) & (and) (Es. (Es &(01101)=0 , &(1111)=1) ~& (nand) | (or) (Es. (Es |(0101)=1 , |(0000)=0) ~| (nor), ^ (xor) ~^,^~ , ((xnor)) Logici (2 operandi, risultato 1 bit) ! (negazione logica) (Es. !3 è falso, !0 è vero) &&, || (and e or di due espressioni) ==,!= (uguaglianza e disuglianza di espressioni, se un operatore contiene x o z risulta falsa) ===,!== (uguaglianza e disuguaglianza con verifica bit a bit dei valori x e z) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 41 Espressioni: operatori Relazionali (2 operandi, risultato 1 bit) < (minore) <= (minore uguale) > (maggiore) >= (maggiore uguale) Shift (2 operandi, risultato su N bit) >> (shift destro) (Es. 0110>>2 = 0001) << (shift sinistro) (Es (Es. 0110<<1 = 1100) (i bit inseriti negli shift destro e sinistro sono sempre 0 0, per uno shift devo indicare di quanti bit voglio shiftare ) 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 42 Espressioni: operatori Condizionale (3 operandi, risultato è un’espressione) (espressione)?S1:S2 se espressione è vera valuta S1 altrimenti S2 Esempio: Z=(sel==1)?A:B; (multiplexer, se sel=1 assegna A altrimenti B)) Concatenazione {,} concatena i due vettori E Esempio: i Z Z={A,B}; {A B} Replica {int{ }} ripete int volte un certo vettore Esempio: Z={3{A}} -> Z={A,A,A} 17 Novembre 2009 ED - Verilog combinatorio Massimo Barbaro 43