Logica combinatoria in linguaggio Verilog -...
Transcript of Logica combinatoria in linguaggio Verilog -...
Università di CagliariDipartimento di Ingegneria Elettrica ed Elettronica
Laboratorio di Elettronica (EOLAB)
Logica combinatoria in linguaggio Verilog
Lucidi del Corso di Elettronica Digitale
Modulo 8
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 2
Logica Combinatoria
Logica combinatoria: un blocco di logica in cui le M uscite sono, in ogni istante, funzione logica degli N ingressi in quell’istante e NON della storia passata degli ingressi
x1
x2
xN
y1y2
yM
Logicacombinatoria
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 3
Stili descrittivi di logica combinatoria
Strutturale: la funzione viene descritta come interconnessione di primitive logiche (and, or, not, nand, nor, etc.). E’ necessario sintetizzare il circuito logico a partire dalla descrizione inizialeDataflow: la funzione viene descritta in termini di trasformazioni algebriche degli ingressi per mezzo di continuous assigments (parola-chiave assign). 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 procedurali (always) in termini algoritmici (if…else, case, for). Si può partire da una descrizione descrittiva del sistema senza necessariamente passare dalla sintesi logica
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 4
Descrizione strutturale
Si basa sull’uso di primitive logiche (AND, NAND, OR, NOR, XOR, XNOR, BUF, NOT) che rappresentano l’equivalente della porta logica disegnata in uno schematico.
Tutti i segnali interni ed esterni sono NET(abbiamo usato solo i NET di tipo wire)
Coincide con una descrizione testuale di uno schematico (l’equivalente di una netlist spicerispetto ad un circuito disegnato)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 5
Descrizione strutturale: esempio
Vediamo come esempio la descrizione di un half-adder
A
B
S
C
nAB
AnBnB
nA
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 6
Descrizione strutturale: half-adder
module ha(A,B,C,S);
input A,B;
output C,S;
wire A,B,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
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
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 7
Istanziazione di una primitiva logica
Per istanziare una primitiva logica, come in spice, si scrive una riga (una per componente)
and a1 (nAB, nA, B);
Tipo di porta
Nome del’istanza
Uscita (SEMPRE il primo della lista)
Ingressi
Il nome dell’istanze può essere omesso, ma è meglio metterlo per chiarezza
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 8
Descrizione strutturale
A differenza di spice TUTTI i nodi interni devono essere dichiarati (subito dopo la definizione delle porte, all’inizio del modulo). Possono non essere dichiarati solo i wire a dimensione di un solo bitPer connettere l’uscita di una porta con l’ingresso di un’altra gli si dà semplicemente lo stesso nome
B
nA nAB
S
….and a1(nAB,nA,B);
….or o1(S,nAB,AnB);….
Nodo interno: wire
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 9
Descrizione strutturale: primitive
and: porta and (Z=AB)
or: porta or (Z=A+B)
nand: porta nand (Z=(AB)’)
nor: porta nor (Z=(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’)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 10
Descrizione strutturale
Una descrizione strutturale può fare uso non solo delle primitive ma anche di altri moduli 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 istanza di quel modulo seguito dalla lista dei terminaliCi 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 moduloPer nome: si associano uno per uno i nodi alla porta corrispondente
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 11
Istanziazione di un modulo
module mio_modulo(A,B);input A;output B;…..endmodule
module top(X,Y,X);input X,Y;output Z;wire aa,bb,cc,dd;mio_modulo m1(cc,dd);mio_modulo m2(.B(aa), .A(bb));…endmodule
Sottomodulo con 1 ingresso e 1 uscita (per i moduli non èobbligatorio che l’uscita sia in prima posizione)
Assegnazione posizionale:cc->Add->B
Assegnazione per nome:bb->Aaa->B
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 12
Sottomodulo: esempio
module sommatore(A,B,S);input [3:0] A,B;output [4:0] S;wire [2:0] C;wire [3:0] A,B;wire [4:0] S;ha g1(A[0],B[0],C[0],S[0]);fa g2(A[1],B[1],C[0],C[1],S[1]);fa g3(A[2],B[2],C[1],C[2],S[2]);fa g4(A[3],B[3],C[2],S[4],S[3]);endmodule
Ogni segnale interno deve essere esplicitamente dichiarato con la sua dimensione (numero di bit).Quindi di A devo dire sia che è un ingresso (input) sia che è un filo (wire).Solo i wire a singolo bit possono essere omessi
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 13
Descrizione dataflow
Si basa sulla definizione algebrica delle uscite rispetto agli ingressi, le uscite sono direttamente definite con l’opportuna espressione algebricaIl nome dataflow (flusso di dati) deriva dal fatto che le uscite sono la trasformazione algebrica degli ingressiTutti i segnali interni ed esterni sono NET (in particolare WIRE) il cui valore viene definito tramite un continuousassignmentE’ simile alla descrizione strutturale, le porte logiche sono sostituite da operatori logici all’interno di un’espressioneAd esempio per descrivere lo half-adder si può descrivere semplicemente l’espressione algebrica che genera le due uscite a partire dagli ingressi
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 14
Dataflow: operatori logici
&: and fra due bit
|: or fra due bit
^: xor fra due bit
~^: xnor fra due bit
~: not di un singolo bit
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 15
Dataflow: half-adder
module ha(A,B,C,S);
input A,B;
output C,S;
wire A,B,C,S,nA,nB,A1,A2;assign C=A&B;
assign S=((~A)&B)|(A&(~B));
endmodule
assign: parola-chiave necessaria per assegnare ad un segnale (in questo caso di uscita, ma potrebbe essere un segnale interno) una espressione logica funzione degli ingressi e di eventuali altri nodi interni
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 16
Descrizioni dataflow e strutturale
Le due descrizioni, per come le abbiamo utilizzate, sono assolutamente EQUIVALENTIL’unica informazione che ci danno è infatti quella logica e funzionale ed abbiamo giàverificato che le diverse descrizioni possibili di una funzione logica sono tutte equivalenti fino a che non vengono trasformate in circuiti e transistorPer il momento, anche la descrizione strutturale non corrisponde a qualcosa di fisico (non èdetto che il circuito sarà implementato con le porte istanziate)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 17
Descrizione algoritmica/RTL
La descrizione algoritmico/RTL fa uso di istruzioni procedurali eseguite all’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 blocco di logica combinatoria
Le regole per una corretta implementazione di un blocco combinatorio sono fondamentali perché si rischia, non seguendole, di rappresentare un blocco completamente differente (sequenziale) senza accorgersene
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 18
Always: sensitivity list
I blocchi always che implementano logica combinatoria sono leggermente diversi da quelli utilizzati finora nella generazione di testbench: la loro esecuzione viene attivata solo in corrispondenza della variazione di un insieme di segnali detto sensitivity listLa sensitivity list viene indicata fra parentesi tonde subito dopo il simbolo @ (at) che segue la parola-chiave always. I nomi dei segnali della lista vengono separati dalla parola chiave or.Nella sensitivity list, ovviamente, andranno gli ingressi alla funzione combinatoria (ogni volta che cambia uno qualsiasi tra gli ingressi devono essere aggiornate le uscite ossia eseguito l’always)Le uscite del blocco devono essere di tipo reg perchésono assegnate in un blocco procedurale (l’always)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 19
Always: sensitivity list
…
always @(x1 or x2 or x3 … or xn)begin
….
end…
Sensitivity list: l’always viene eseguito solo se cambia uno qualsiasi fra i segnali x1, x2,…, xn
x1
x2
xN
y1y2
yM
LogicaCombinatoria
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 20
Always: assegnazione delle uscite
always @(x1 or x2 or x3 … or xN)begin….
y1= …. ;
….
yM=…. ;
end
x1
x2
xN
y1y2
yM
LogicaCombinatoria
Le uscite devono sempre essere assegnate altrimenti il loro valore dipenderebbe dalla storia degli ingressi perché manterrebbero il valore precedente
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 21
Esempio: half-adder
L’implementazione con un always di un blocco combinatorio già implementato in dataflow e strutturale:
module ha(A,B,C,S);
input A,B;
output C,S;
reg C,S;
always @(A or B)beginC=A&B;
S=A^B;end
endmodule
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 regnon richiede la parola chiave assign (usata solo per i wire)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 22
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 le uscite sono wire ed assegnate con un assign)Si ottiene un enorme vantaggio (in semplicità e leggibiltà di descrizione, facilità di implementazione) sfruttando costrutti piùraffinati che possono essere evidentemente usati solo in un blocco procedurale: if…else, case, for
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 23
Istruzione condizionale (if…else)
L’istruzione condizionale ha la stessa sintassi del linguaggio C:
if(espressione)blocco1
elseblocco2
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
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 24
Esempio: multiplexer
module mux2_1(A,B,sel,Z);
input A,B,sel;
output Z;
reg Z;
always @(A or B or sel)beginif(sel)
Z=A;else
Z=B;end
endmodule
Multiplexer: se sel=1 passa A altrimenti B
Tutti gli ingressi sono specificati nella sensitivitylist
In qualsiasi ramo della if l’uscita viene assegnata
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 25
IF…ELSE combinatorio
Perché la struttura if…else implementi veramente della logica combinatoria bisogna che per qualsiasi combinazione degli ingressi l’uscita (o le uscite) venga SEMPRE assegnata.
Se esistesse anche una sola combinazione di ingresso per cui l’uscita non è assegnata, l’uscita stessa, essendo un reg, manterrebbe il valore assunto precedentemente quindi dipenderebbe dalla storia del circuito (avremmo dunque logica sequenziale e NON combinatoria)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 26
Esempio: multiplexer
module mux2_1(A,B,sel,Z);
input A,B,sel;
output Z;
reg Z;
always @(A or B or sel)beginZ=B;if(sel)
Z=A;end
endmodule
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
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 27
Esempio: multiplexer 4x1
module mux4_1(A,B,C,D,sel,Z);
input A,B,C,D;input [1:0] sel;
output Z;
reg Z;
….
endmodule
always @(A or B or C or D or sel)if(sel[1])
if(sel[0])Z=A;
elseZ=B;
elseif(sel[0])
Z=C;else
Z=D;
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 28
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
Se espressione non ricade in uno dei valori elencati si esegue il default (blocco0).
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 29
Istruzione CASE
A seconda del valore di espressione viene eseguito uno dei blocchi di istruzioni.
Se espressione non ricade in uno dei valori elencati si esegue il default (blocco0).
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
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 30
Esempio: multiplexer 4x1module mux4_1(A,B,C,D,sel,Z);
input A,B,C,D;input [1:0] sel;
output Z;
reg Z;
always @(A or B or C or D or sel)case (sel)
2’b00: Z=D;2’b01: Z=C;2’b10: Z=B;2’b11: Z=A;default: Z=A;
endcase
endmodule
Il default ènecessario perchécase confronta i bit considerando anche i valori 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)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 31
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
La differenza col case normale consiste nel fatto che in valN si possono specificare gruppi di bit come X o Z ed in tal caso quei bit non vengono considerati (don’t care)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 32
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 esegue il default (blocco0).
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 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 ESEGUO blocco2
Il match avviene per qualsiasi valore di questo bit
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 33
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;default: Z=x;
endcaseendmodule
Il priority encoder è un codificatore che prende in ingresso N bit e mette in uscita M=log2N bit che rappresentano la codifica di quale bit di ingresso è attivo (alto).I bit di ingresso hanno priorità quindi se quello a priorità massima è 1, a prescindere dal valore degli ingressi si mette in uscita la sua codifica
E’ utilizzato nella gestione delle interrupt
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 34
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
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 35
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 attenzione perché può facilmente dar luogo a descrizioni inesatte di logica combinatoria (gli sono preferibili i costrutti if..else e case)
Praticamente l’unico caso in cui useremo i cicli forsaranno i testbench (modulo 8) ossia i moduli usati per verificare il funzionamento di un modulo (è utile per generare tutte le possibili combinazioni di ingresso)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 36
Esempio: priority encoder
module pri_enc(A, Z);
input [7:0] A;output [2:0] Z;
reg [2:0] Z;integer K;
always @(A)begin
Z=3’bx;for(K=0;K<8; K=K+1)
if(A[K])Z=K;
end
endmodule
K è un integer
Z è sempre assegnato
I bit piùsignificativi di A hanno prioritàmaggiore
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 37
Descrizione algoritmica: sottomoduliNon è detto che l’intero blocco combinatorio debba essere descritto con un unico always, è anche possibile suddividere gerarchicamente il modulo in sottomoduli, ciascuno dei quali può a sua volta essere un modulo separato o semplicemente un always dentro il modulo top
Modulo 0
Modulo 1
Modulo 2
Modulo 3
I1I2
I4 O2
O1int1
int2
int3
I3
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 38
Sottomodulimodule m1(A,B,X,Y);
…
endmodule
module m2(A,B,X,Y);
…
endmodule
module m3(A,B,C,X);…endmodule
module m0(I1,I2,I3,I4,O1,O2);…m1 g1(I1,I2,int1,int2);m2 g2(I3,I4,int3,O2);m3 g3(int1,int2,int3,O1);…endmodule
Ad esempio, si possono scrivere 3 moduli, uno per ogni sottomodulo, e metterli insieme nel modulo top (m0)
Modulo 0
Modulo 1
Modulo 2
Modulo 3
I1I2
I4 O2
O1int1
int2
int3
I3
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 39
Sottomodulimodule m0(I1,I2,I3,I4,O1,O2);
…
always @(I1,I2)
begin
…
end
always @(int1, int2, int3)begin…end
always @(I3,I4)begin…end
…endmodule
■ Oppure si può scrivere un unico modulo contenente 3 always differenti, uno per ogni sottomodulo.■ La sensitivity-list del singolo always contiene solo gli ingressi al sottomodulo specifico implementato
Modulo 0
Modulo 1
Modulo 2
Modulo 3
I1I2
I4 O2
O1int1
int2
int3
I3
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 40
Espressioni: operatori
Aritmetici (2 operandi, risultato su N bit) + (somma) (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)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 41
Espressioni: operatori
Riduzione (1 operando, risultato su 1 bit)& (and) (Es. &(01101)=0 , &(1111)=1)~& (nand)
| (or) (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)
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 42
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. 0110<<1 = 1100)
(i bit inseriti negli shift destro e sinistrosono sempre 0, per uno shift devo indicare di quantibit voglio shiftare )
01 Novembre 2006 ED - Verilog combinatorio Massimo Barbaro 43
Espressioni: operatori
Condizionale (3 operandi, risultato è un’espressione)(espressione)?S1:S2
se espressione è vera valuta S1 altrimenti S2Esempio:Z=(sel==1)?A:B; (multiplexer, se sel=1 assegna A
altrimenti B)Concatenazione
{,} concatena i due vettoriEsempio: Z={A,B};
Replica{int{ }} ripete int volte un certo vettoreEsempio: Z={3{A}} -> Z={A,A,A}