Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Circuiti e sistemi combinatori , Appunti di Elettronica

Elettronica dei Sistemi Integrati Digitali

Tipologia: Appunti

2016/2017

Caricato il 31/05/2017

snr59940
snr59940 🇮🇹

2 documenti

1 / 117

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Capitolo 2
Circuiti e sistemi combinatori
2.1 Implementazione di circuiti CMOS statici
Esistono opportuni algoritmi per implementare il layout delle porte CMOS complesse. In logica
CMOS possiamo realizzare, in maniera molto efficace, funzioni logiche di tipo A-O-I (And-Qr-
Invert) oppure, eventualmente, OAI (Or-And-Invert), cioè funzioni espresse come somma di
prodotti negando poi il risultato (oppure prodotti di somme, negando poi il risultato).
Consideriamo una funzione del tipo AOI; la funzione più semplice che possiamo pensare è la
seguente:
Y = AB+C
In generale una porta CMOS complessa (Fig. 2.1) prevede la presenza di una rete di pull-up
(costituita solo da PMOS) ed una rete di pull-down (costituita solo da NMOS) collegate,
rispettivamente, fra l’uscita e la tensione di alimentazione e fra l’uscita e massa. Inoltre, ogni
segnale di ingresso xi è collegato sia alla rete di pull-up che alla rete di pull-down.
Fig. 2.1 – Porta CMOS complessa
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Anteprima parziale del testo

Scarica Circuiti e sistemi combinatori e più Appunti in PDF di Elettronica solo su Docsity!

Capitolo 2

Circuiti e sistemi combinatori

2.1 Implementazione di circuiti CMOS statici

Esistono opportuni algoritmi per implementare il layout delle porte CMOS complesse. In logica CMOS possiamo realizzare, in maniera molto efficace, funzioni logiche di tipo A-O-I (And-Qr- Invert) oppure, eventualmente, OAI (Or-And-Invert), cioè funzioni espresse come somma di prodotti negando poi il risultato (oppure prodotti di somme, negando poi il risultato). Consideriamo una funzione del tipo AOI; la funzione più semplice che possiamo pensare è la seguente:

Y = A⋅B+C

In generale una porta CMOS complessa (Fig. 2.1) prevede la presenza di una rete di pull-up (costituita solo da PMOS) ed una rete di pull-down (costituita solo da NMOS) collegate, rispettivamente, fra l’uscita e la tensione di alimentazione e fra l’uscita e massa. Inoltre, ogni segnale di ingresso xi è collegato sia alla rete di pull-up che alla rete di pull-down.

Fig. 2.1 – Porta CMOS complessa

Le reti di pull-up e pull-down si progettano direttamente per ispezione dalla nostra funzione logica. Ad esempio, per quanto riguarda la rete di pull-down, ci chiediamo quando Y=0. L’uscita Y è uguale a 0 quando C=l oppure quando A·B=l. Ciò significa che ci sono due modi per portare l’uscita a massa, cui corrispondono due sottoreti della rete di pull-down: una collegata con l’ingresso C e l’altra con due ingressi A e B (Fig. 2.2).

Fig. 2.2 – Rete di pull-down relativa alla funzione Y = A⋅B+C

La condizione A·B=1 si ha quando sia A che B sono uguali ad 1; ciò significa che la sottorete cui arrivano i segnali A e B è, in effetti, composta dalla serie di due sottoreti (Fig. 2.2), una comandata dal segnale A e l’altra dal segnale B. Possiamo applicare iterativamente questo algoritmo finché non si arriva (come in questo esempio) a sottoreti comandate da un solo segnale e formate da un singolo NMOS. In definitiva, si ottiene il circuito mostrato in Fig. 2.

Fig. 2.3 – NMOS della rete di pull-down

Il modo più semplice, comunque, è quello di seguire la Tabella 2.1, che descrive come è possibile passare da un’espressione scritta nella forma A-O-I (O-A-I) ad una porta logica CMOS complessa. Osserviamo che, se consideriamo la rete di pull-up (o, analogamente, quella di pull-down), non c’è nessun particolare motivo per preferire la disposizione dei PMOS di Figura 2.4, rispetto al caso in cui la rete è capovolta (essendo nient’altro che un bipolo). Quindi, come rete di pull-up avremmo potuto considerare anche quella mostrata in Figura 2.5. Da un punto di vista logico, il funzionamento del circuito, con questa rete di pull-up, è lo stesso di quello di Figura 2.4.

Fig. 2.5 – Schema alternativo della rete di pull-up

Dal punto di vista elettrico (tempi di propagazione, ecc.) le due soluzioni non sono esattamente equivalenti. Osserviamo che le capacità che influiscono sul funzionamento del nostro circuito sono quelle relative al nodo intermedio della rete di pull-up (nodo 1) e quelle presenti sul nodo d’uscita. La capacità sul nodo intermedio è sempre la stessa in quanto ci sono tre PMOS collegati in entrambe le soluzioni. Viceversa, la capacità sul nodo d’uscita è presumibilmente più bassa nella seconda soluzione che non nella prima, dato che in questa seconda versione, un solo PMOS (anziché due) è collegato all’uscita. Dal punto di vista circuitale, la seconda versione del circuito è da preferire. Osserviamo, inoltre, che i ritardi di questo circuito non sono gli stessi per i tre ingressi A, B e C. Sappiamo, infatti, che gli ingressi collegati ai transistori più vicini all’uscita sono quelli privilegiati, ovvero il tempo di propagazione fra questi e l’uscita è minore di quello relativo agli altri ingressi (collegati a transistori più lontani dall’uscita). Da ciò si deduce che nella prima versione del nostro circuito l’ingresso A è un ingresso privilegiato, essendo collegato in prossimità dell’uscita sia nella rete di pull-up sia in quella di pull-down. L’ingresso C, inoltre, per quanto riguarda il tempo di scarica è anch’esso privilegiato, mentre non lo è per il tempo di carica (poiché deve caricare la anche la capacità del nodo intermedio, che può non essere del tutto trascurabile). Nella seconda versione del circuito, invece, l’ingresso C risulta essere privilegiato, poiché è collegato al mosfet più

vicino all’uscita sia nella rete di pull-up sia in quella di pull-down. Queste considerazioni sono, in generale, da tenere presente nel progetto del nostro circuito. Se dobbiamo ottimizzare il ritardo fra l’ingresso A e l’uscita potrebbe addirittura essere preferibile la prima soluzione che non la seconda (anche se ciò è tutto da verificare in quanto, seppure A è più vicino all’uscita, la capacità sul nodo d’uscita è maggiore). Invece, la seconda soluzione è senz’altro migliore se bisogna ottimizzare il ritardo fra l’ingresso C e l’uscita.

2.2 Grafi delle reti di pull-up e pull-down: cammini di Eulero

Passiamo adesso alla realizzazione del layout del nostro circuito. Il primo passo da compiere è quello di considerare la sola rete di dispositivi a canale n. Per questa rete di pull-down dobbiamo ottenere un grafo che la rappresenta, che chiameremo grafo-N. Tale grafo si ottiene associando ad ogni nodo della rete di pull-down un nodo del grafo, ed ad ogni transistor della rete di pull-down un arco del grafo (Fig. 2.6).

Fig. 2.6 – Grafo della rete di pull-down

In maniera analoga, possiamo ottenere il grafo-P della rete di pull-up. Sappiamo che, dal punto di vista logico, la rete di pull-up (rete p) è ridondante, cioè potremmo sostituire ad essa una resistenza ed ottenere la stessa funzione logica. Ciò vuol dire che, dato il grafo della rete di pull-down (rete n), esisterà sicuramente un modo univoco per ottenere il grafo della rete p (essendo le reti logicamente dipendenti l’una dall’altra). Infatti, il grafo-P è il grafo duale del grafo-N e si ottiene nel seguente modo:

  • al grafo-N aggiungiamo un arco ausiliario che collega i nodi d’uscita e massa, dove è posta la capacità di carico del nostro circuito;
  • per ognuna delle zone individuate nel grafo-N, associamo un nodo del duale grafo-P (1, 2 e 3 in Figura 2.7);
  • colleghiamo uno alla volta i nodi del grafo-P, intersecando un arco del grafo-N con il duale arco del grafo-P (ad esempio, chiamiamo C’ l’arco duale che interseca l’arco C ).

Verifichiamo che il grafo duale corrisponde alla rete di pull-up riportata in Figura 2.5. Infatti, il

Partiamo dal grafo-N e riarrangiamolo in modo da allineare gli archi secondo la sequenza prescelta (Fig. 2.8). Partiamo dal nodo Y, poi abbiamo un arco A che porta da y a P, poi abbiamo un arco B che porta da P a G, poi un arco C che da G porta di nuovo ad Y. Volendo allineare tutti gli archi del grafo-N, riportiamo di nuovo i1 nodo Y dopo il nodo G e colleghiamo i due nodi Y con un arco tratteggiato (per ricordarci che sono lo stesso nodo). In modo analogo operiamo per il grafo-P.

Fig. 2.8 – Disposizione dei grafi secondo il cammino di Eulero prescelto

Fig. 2.9 – Stick-diagram relativo al circuito in esame

Dai due grafi organizzati come mostrato in Figura 2.8 è immediato passare allo stick-diagram riportato in Figura 2.9. Gli ingressi andranno collegati alle gate, quindi saranno realizzati con delle linee di polisilicio verticali che attraversano le regioni diffuse. I nodi, invece, coincideranno con dei contatti, e la sequenza degli archi corrisponderà alla sequenza delle linee di polisilicio. Quindi, in definitiva, basta realizzare delle strisce diffuse, separate da contatti e attraversate da linee di polisilicio, seguendo la disposizione dei grafi. Realizziamo, ovviamente, le linee di massa (GND!) e di alimentazione (Vdd!) fra le quali disegniamo una striscia diffusa di tipo n ed una di tipo p, tutte parallele fra loro. Tracciamo poi una linea verticale corrispondente alla linea di polisilicio relativa all’ingresso A, poi quella relativa all’

ingresso B, e infine quella relativa all’ingresso C. Realizziamo i contatti relativi al nodo Y, che sono collegati fra loro e corrispondono al nodo d’uscita Y. Realizziamo poi il contatto relativo al nodo G, che colleghiamo a massa (dato che corrisponde al nodo di massa nel circuito di Figura 2.4). Realizziamo poi il contatto corrispondente al nodo P (quello tratteggiato in figura) che, in realtà, non serve dato che corrisponde al nodo intermedio fra i due NMOS in serie della rete di pull-down e, quindi, lo eliminiamo. Analogamente si opera per la rete di pull-up, m cui il contatto relativo al nodo 3 va collegato all’alimentazione e quello relativo al nodo 2 va collegato all’uscita; i contatti relativi ai nodi i sono soltanto da collegare fra loro. Per completare del tutto lo stick-diagram vanno aggiunte le prese di substrato. In questo modo riusciamo ad ottimizzare al massimo il nostro layout, per una serie di motivi. Innanzitutto si parte da una funzione logica nella forma AOI, che si presta alla perfezione ad essere realizzata in logica CMOS. Il layout è organizzato mediante due strisce diffuse, parallele alle linee di alimentazione; ciò è un altro vantaggio in quanto ci consente di piazzare parecchie prese di substrato e di rispettare la distanza dei 12λ, senza per questo perdere molta area. Infine riusciamo a compattare al massimo l’area perché ogni contatto realizzato viene sempre condiviso almeno fra due mosfet: in alcuni casi, addirittura, riusciamo ad eliminare dei contatti, laddove questi non sono indispensabili. Nel caso in cui esistano più cammini di Eulero comuni alle reti n e p significa che ci sono più layout di questo tipo che possiamo realizzare, alcuni dei quali potranno essere preferiti per motivi particolari; ad esempio, in quello da noi realizzato il morsetto d’uscita e disponibile sulla stessa verticale, il che può essere utile per alcune applicazioni. Laddove non riusciamo ad individuare un cammino di Eulero comune per la rete n e per la rete p vuoi dire che questo algoritmo, in pratica, non si può applicare. In generale, però, questi sono dei casi abbastanza patologici dato che, almeno per funzioni non particolarmente strane, sono individuabili diversi cammini di Eulero. Esistono, comunque, degli algoritmi più complessi che, ad esempio, vanno a partizionare l’unica regione diffusa n in due sottoregioni, e lo stesso viene fatto per la regione p, cercando poi di collegarle fra loro in modo da avere delle linee di polisilicio verticali relative agli ingressi.

2.3 Addizionatore a n bit

Un’addizionatore è un sistema combinatorio (Fig. 2.10), i cui i terminali di ingresso sono parole (words) da n bit, A e B, più un singolo bit, C (^) in , il riporto entrante, e le cui uscite sono il vettore somma S (anch’esso su n bit) ed il riporto uscente, C (^) out (su un singolo bit).

Fig. 2.10 – Schema dell’addizionatore a n bit

ingressi, che chiamiamo a, b, c (su un solo bit), e genera un bit di somma s ed un bit di riporto uscente c (^) out. La tabella della verità è riportata di seguito (Tab. 2.2).

c b a c (^) out s c (^) out 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0

Tab. 2.2 – Tabella della verità di un full-adder

Mediante il full-adder contiamo il numero di ingresso pari ad 1, e lo riportiamo in binario sull’uscita. Si dice anche che il full-adder è un “compressore 3→2”, nel senso che il contenuto informativo presente nei tre segnali di ingresso (ovvero il numero di 1) viene rappresentato su due soli bit (somma e riporto).

Fig. 2.12 – Full-adder a singolo bit

Dobbiamo ricavare adesso le funzione booleane per la somma ed il riporto. Per quanto concerne il riporto, utilizzando la mappa di Karnaugh (per cercare una forma minima), si ha la seguente tabella:

b 0 0 1 1 c a 0 1 1 0 0 1 1 1 1 1

Tab. 2.3 – Mappa di Karnaugh per il riporto

Quindi, l’espressione minima per cout (che utilizza i tre termini circoscritti in tabella) è la seguente:

Il modo più efficace per calcolare cout potrebbe essere quello di trasformare questa espressione dalla forma AND-OR alla forma NAND-NAND e realizzare il tutto con 4 porte NAND. Peraltro, visto che stiamo realizzando il circuito in logica CMOS, è sicuramente più opportuno esprimere questa funzione logica nella forma AOI, Quindi, calcoliamo prima

e poi calcolare cout effettuando il negato di cout , utilizzando quindi prima una AOI e poi un invertitore. Osserviamo, comunque, che conviene apportare una minima modifica alla nostra funzione logica, consistente nel mettere in evidenza il fattore c, ovvero:

Il vantaggio nel mettere in evidenza un termine consiste nel fatto che realizzando l’espressione ordinaria in logica CMOS sono necessari 6 mosfet sia per la rete di pull-down sia per quella di pull- up, mentre mettendo in evidenza il fattore c saranno necessari soltanto 5 mosfet (quindi si risparmia un mosfet sia nella rete di pull-down sia in quella di pull-up). Il motivo per cui è stato messo in evidenza il fattore c, e non a o b, sarà spiegato in seguito. Per quanto riguarda la somma, considerando la mappa di Karnaugh, avremo:

b 0 0 1 1 c a 0 1 1 0 0 1 1 1 1 1

Tab. 2.4 – Mappa di Karnaugh per la somma

In questo caso notiamo che purtroppo non è possibile in alcun modo semplificare la nostra funzione logica (la somma, infatti, è la XOR dei tre ingressi); quindi si ha:

Ricordiamo che la funzione XOR di n ingressi e uguale ad 1 quando un numero dispari di ingressi è pari ad 1, quindi è una funzione che possiamo definire di “disparità”. Potremmo anche tentare di realizzare questa espressione nella forma AOI e poi utilizzare un invertitore per ottenere s, però abbiamo la necessità di avere non solo gli ingressi a, b e c, ma anche gli ingressi negati; inoltre, risulta essere significativo il numero di transistori che bisognerebbe utilizzare. Pertanto, il circuito sarebbe molto complesso e sicuramente anche molto lento. Proviamo a valutare se sia possibile calcolare la somma sfruttando in qualche modo il riporto

c (^) out =ab+ac+bc

c (^) out =ab+ac+ bc

c out =ab+c( a+b) ⇒cout=ab+c( a+b)

s =a⊕b⊕c=abc+abc+abc+ abc

pilotato da a e quello pilotato da b) sarà certamente in conduzione.

Fig. 2.14 – Rete di pull-down del circuito per il calcolo di cout

Dunque, grazie alla particolarità della funzione logica e non per regola generale, nulla cambia se nel nostro circuito colleghiamo la serie dei due PMOS direttamente al nodo di uscita, invece che a monte del parallelo dei due PMOS. Otteniamo, quindi, la rete di sinistra in Figura 2.15.

Fig. 2.15 – Rete di pull-up del circuito per il calcolo di cout

Dal punto di vista logico questa rete di pull-up è equivalente a quella originaria; per quanto riguarda le prestazioni, invece, nel caso precedente la capacità d’uscita era caricata non solo dalla serie dei due PMOS ma anche dai due PMOS parallelo, che offrivano una resistenza ulteriore alla carica della capacità (rallentando il tplh ). Nella rete di pull-up modificata, invece, il tplh può essere migliorato, quando a e b sono entrambi pari a 0. Osserviamo, inoltre, che ci conviene anche capovolgere il ramo sinistro di questa rete di pull-up, in modo da avere solo due PMOS collegati al nodo d’uscita. Otteniamo, quindi, la rete di destra in Figura 2.15. Osserviamo, inoltre, che sul nodo interno insistono adesso 3 PMOS, mentre nella rete

originaria ne insistevano 4; quindi viene ridotta anche la capacità su questo nodo interno. In definitiva il circuito completo è quello di Figura 2.16. Grazie a queste modifiche apportate le reti di pull-up e pull-down risultano essere perfettamente simmetriche; pertanto si semplifica anche il layout del nostro circuito, dato che possiamo utilizzare la tecnica dei cammini di Eulero. In tal caso, infatti, poiché le due reti sono uguali, un qualsiasi cammino di Eulero per la rete n lo sarà anche per la rete p. A questo punto osserviamo che per c (^) out avremmo potuto equivalentemente scegliere anche la seguente espressione logica:

Il circuito sarebbe equivalente sia come numero di transistori sia come ottimizzazione.

Fig. 2.16 – Circuito ottimizzato per il calcolo di cout

Osservando però il circuito di Figura 2.16, notiamo che non tutti gli ingressi hanno la stessa priorità. Difatti, in seguito all’ottimizzazione eseguita sulle reti di pull-up e pull-down, l’ingresso c è privilegiato, in quanto più vicino all’uscita in entrambe le reti. Da ciò si deduce che il ritardo fra c (riporto entrante) e l’uscita sarà minore che non quello fra a o b e l’uscita. Gli ingressi a e b, invece, risultano esser praticamente equivalenti per quanto riguarda il ritardo fra questi e l’uscita. Per quanto riguarda il dimensionamento del nostro circuito (ovvero la scelta delle W, dato che le L vengono sempre considerate pari alla Lmin ), operiamo sempre a meno di un fattore di scala, ovvero tutte le W saranno definite a meno di una variabile da scegliere in base alla velocità del circuito: in linea di massima, più grandi realizziamo i dispositivi tanto più veloce sarà il circuito. Per quanto riguarda la rete di pull-down, sul ramo sinistro, conviene scegliere uguali i W dei due NMOS (anche se per ottimizzare al massimo le prestazioni si potrebbe realizzare l’NMOS pilotato da a un poco più piccolo di quello pilotato da b). Per quanto riguarda il ramo destro, notiamo che

c out =a ( b+c) +bc

Anche per questa porta logica, grazie alla particolarità della funzione che stiamo realizzando, si può semplificare la rete di pull-up. Difatti, il ramo costituito dalla serie dei tre PMOS comandati da a, b e c conduce soltanto quando questi tre ingressi sono tutti pari a 0; in questo caso anche il parallelo dei tre PMOS pilotati da a, b e c è in conduzione. Quindi, nulla cambia se colleghiamo il ramo dei

tre PMOS in serie direttamente all’alimentazione positiva, invece che al parallelo dei tre PMOS.

Otteniamo, quindi, la rete di pull-up mostrata in Figura 2.18.

Fig. 2.18 – Rete di pull-up del circuito per il calcolo di s

Fig. 2.19 – Circuito ottimizzato per il calcolo di s

Il circuito complessivo che si ottiene è riportato in Figura 2.19. Anche in questo caso le reti di pull- up e di pull-down sono perfettamente identiche fra loro. In questa realizzazione l’ingresso che è

stato privilegiato è cout , e ciò sicuramente e una scelta ragionevole dato che tale segnale sicuramente arriverà in ritardo rispetto agli altri tre ingressi (dato che è calcolato da un’altra porta logica). Per quanto riguarda il dimensionamento di questo circuito (anche se questo non è così determinante come lo è quello della cella che calcola il riporto, come vedremo in seguito) notiamo che nella rete di pull-down vi sono 3 NMOS in serie, quindi è ragionevole farli uguali con la stessa Wn , che ovviamente non è necessariamente la stessa di quella della cella carry; la L è naturalmente sempre quella minima. Per quanto riguarda il ramo di destra osserviamo che, se scegliessimo una W uguale a Wn per tutti gli NMOS di tale ramo, questo sarebbe più veloce del ramo di sinistra (in quanto ci sarebbero solo due NMOS in conduzione, anziché tre). Conviene, quindi, uguagliare il ritardo (ovvero le resistenze) nei due rami. Per fare ciò bisogna far sì che, sul ramo di destra, la serie di due NMOS sia equivalente alla serie di tre NMOS del ramo di sinistra. Per far ciò bisogna realizzare gli NMOS di destra con una W più piccola di quella degli NMOS di sinistra, precisamente di un fattore 2/3. Essendo la rete di pull-up topologicamente uguale a quella di pull-down, le W dei PMOS si ottengono moltiplicando semplicemente per 2 (rapporto delle mobilità) le W dei dispositivi omologhi nella rete di pull-down. Per quanto riguarda il dimensionamento del ramo destro della rete di pull-down, forse converrebbe rendere questo ramo più veloce in quanto ad esso appartiene l’NMOS pilotato dal segnale di riporto c (^) out. Inoltre, dovendo realizzare dispositivi di tipo n con una W differente, bisognerebbe realizzare degli scalini nella striscia diffusa di tipo n (non si ha cioè una striscia diffusa uniforme di tipo n attraversata da linee di polisilicio) che potrebbero comportare una maggiore occupazione di area, dato che comunque bisogna rispettare delle regole di progetto (distanza minima fra due diffusioni, estensione minima della regione diffusa oltre la regione attiva, ecc). Ciò comporta un probabile aumento delle capacità del circuito, il che vanificherebbe tutte le ottimizzazioni pensate trascurando il layout del circuito e ragionando esclusivamente sullo schema a livello transistor. Per questo motivi è allora ragionevole scegliere una W uguale per tutti i dispositivi della rete di pull-down, anche per la cella che calcola la somma. Ripetiamo che in linea di principio si potrebbe dimensionare il circuito come suggerito prima (Fig. 2.19), ma bisognerebbe vedere poi cosa succede a livello di layout.

Fig. 2.20 – Disposizione schematica dei layer nella cella Full-Adder

Fig. 2.22 – Grafo dei ritardi

Una volta ottenuto il grafo dei ritardi, possiamo valutare il ritardo massimo che si ha fra un qualsiasi ingresso primario e una delle possibili uscite. Per fare ciò basta identificare il cammino che va dall’ingresso all’uscita considerati, cui compete un peso massimo, vale a dire quel cammino per il quale la somma dei pesi degli archi che lo costituiscono è massima. Per esempio il ritardo fra i 2 e l’uscita o 1 è pari a 2 ns: invece il ritardo tra i 2 e 1 uscita o 2 è pari a 5 ns. In questo modo è possibile elencare, per tutti i possibili cammini, i ritardi corrispondenti. Fra tutti questi possibili cammini chiameremo cammino critico quello cui compete il ritardo massimo. Nel nostro esempio i cammini critici sono, in realtà, due: quello che va da i 2 a o 2 e quello che va da i 3 ad o 2 ; in entrambi i casi il ritardo è pari a 5 ns. Osserviamo che questo discorso dei cammini critici è più importante di quanto sembri. Consideriamo, infatti, il nostro circuito semplicemente come un sistema con 4 ingressi e 2 uscite, e supponiamo di voler determinare il ritardo massimo del nostro circuito mediante simulazione. Il numero di possibili casi da simulare è dato dal numero di commutazioni possibili, pari a 2^4 ⋅(2^4 -1) (prodotto del numero di possibili combinazioni in ingresso e del numero di combinazioni cui si può giungere in seguito ad una commutazione). Se consideriamo, allora, un addizionatore in cui A e B sono ad 8 bit più il bit da riporto entrante, abbiamo in totale 17 ingressi; il numero di commutazioni possibili è pari a 2^17 ⋅(2^17 -1)≅ 234. È evidente, allora, che e impensabile poter simulare tutte queste possibili combinazioni; anche in un circuito con pochi ingressi il numero di commutazioni possibili cresce in maniera esponenziale. L’unico vero modo, allora, per determinare il ritardo del circuito è quello di determinare il grafo dei ritardi, da cui il cammino critico. Ovviamente, si perdono delle informazioni quando si passa ad una descrizione del circuito in termini di porte logiche. Infatti, ad esempio, quando diciamo che il ritardo fra l’ingresso i 2 e l’uscita m è pari a 2 ns, non sappiamo se ci riferiamo al t (^) plh o al t (^) phl. Possiamo, ad esempio, riferirci sempre al massimo fra i due, avendo in tal caso una sovrastima di tali ritardi. Inoltre all’invertitore (nell’esempio) è attribuito un ritardo pari a 1 ns, ma sappiamo che tale ritardo dipende dal tempo di salita (o di discesa) del segnale di ingresso; questo, quindi, è un altro particolare che si perde in una descrizione del circuito a livello porta logiche.

Questa perdita di informazioni, purtroppo, è il prezzo da pagare per avere una semplificazione nella determinazione del ritardo del circuito. Inoltre è molto più semplice valutare il ritardo massimo dal cammino critico anziché dalla simulazione proprio perché non bisogna simulare il circuito, ma basta avere una caratterizzazione delle porte logiche in termini del loro ritardo; da ciò si determina il grafo del circuito e lo si analizza con degli algoritmi di ricerca operativa. I programmi che fanno operazioni di questo tipo sono chiamati static-timing-ana1yzer , ovvero sono analizzatori statici della temporizzazione perché non eseguono alcuna simulazione, ma calcolano semplicemente il cammino critico su un grafo. Sono, quindi, dei programmi molto veloci, molto efficaci, anche con reti costituite da molte porte logiche, che forniscono una stima molto accurata del ritardo massimo del circuito. Osserviamo, inoltre, che se anche riuscissimo a determinare tramite simulazione il ritardo massimo, l’unica informazione che avremmo da questa simulazione sarebbe il valore di tale ritardo; non sapremo quindi come migliorare il nostro circuito. Se invece abbiamo il grafo dei ritardi, individuato il cammino critico, sappiamo dove agire per ottimizzare il nostro circuito (perché sappiamo dov’è, per così dire, il “collo di bottiglia” del nostro circuito). Ad esempio, nel circuito di Figura 2.21, non ha alcun senso migliorare la porta NAND relativa all’uscita o 1 , essendo fuori del cammino critico; è invece opportuno ottimizzare soltanto le porte che si trovano sul cammino critico (privilegiando anche gli ingressi dei nodi che si trovano su tale cammino). Inoltre, se una porta è fuori del cammino critico, possiamo addirittura farla a dimensioni minime in modo da recuperare area. Per quanto riguarda i ritardi introdotti dalle capacità delle interconnessioni, questi possono in qualche modo essere portati in conto poiché, per ogni porta logica, il ritardo è pari a t=t 0 +αCL (dove α è un coefficiente e CL la capacità di carico dell’interconnessione). Proviamo adesso a valutare il cammino critico dell’addizionatore ad n bit. Il grafo dei ritardi del full-adder è quello mostrato in Figura 2.23, che dovrebbe essere completato riportando i ritardi sui diversi archi per valutare il cammino critico.

Fig. 2.23 - Grafo dei ritardi del full-adder

Presumibilmente supponendo che i pesi degli archi siano tutti uguali fra loro, il cammino critico potrebbe essere quello che parte dall’ingresso a, va su cout , poi su s e poi su s, dato che in questo