Architettura dei Sistemi Integrati - Quelli di Informatica
Architettura dei Sistemi Integrati - Quelli di Informatica
Architettura dei Sistemi Integrati - Quelli di Informatica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Architettura</strong> <strong>dei</strong> <strong>Sistemi</strong> <strong>Integrati</strong><br />
A.A. 2009/2010<br />
Problematiche progettuali per i sistemi integrati<br />
(Cap. 1 del testo)<br />
I sistemi elettronici a larga scala <strong>di</strong> integrazione (VLSI) integrano su <strong>di</strong> una medesima tessera <strong>di</strong><br />
Silicio (Chip) un numero sempre crescente <strong>di</strong> <strong>di</strong>spositivi elettronici.<br />
Troviamo applicazioni in un gran numero <strong>di</strong> sistemi <strong>di</strong> uso quoti<strong>di</strong>ano:<br />
Computer<br />
Telefoni cellulari<br />
<strong>Sistemi</strong> multime<strong>di</strong>ali (riproduttori musicali, lettori DVD, ricevitori satellitari)<br />
Controllo <strong>dei</strong> sistemi <strong>di</strong> bordo nelle autovetture (controllo iniezione, ABS,<br />
climatizzazione ecc.)<br />
<strong>Sistemi</strong> elettro-me<strong>di</strong>cali<br />
<strong>Sistemi</strong> domotici per il controllo del comfort e della sicurezza delle<br />
abitazioni<br />
Esistono poi i cosiddetti ASIC: Application-Specific Integrated Circuit, ovvero circuiti integrati per<br />
applicazioni specifiche che sono customizzabili a seconda delle necessità dell’utente.<br />
Molteplici sono i vantaggi che spingono a realizzare un intero sistema con un unico circuito<br />
integrato, invece <strong>di</strong> assemblare componenti standard:<br />
Riduzione delle <strong>di</strong>mensioni dell’intero sistema.<br />
Riduzione <strong>dei</strong> parametri parassiti.<br />
Aumento della frequenza <strong>di</strong> clock (legata alla riduzione delle capacità<br />
parassite) E’ inoltre possibile trasmettere segnali all'interno <strong>di</strong> un chip<br />
a frequenze un or<strong>di</strong>ne <strong>di</strong> grandezza superiori rispetto al caso in cui i<br />
segnali viaggiano su piste <strong>di</strong> circuito stampato.<br />
Riduzione della potenza <strong>di</strong>ssipata.<br />
Riduzione <strong>dei</strong> costi del sistema complessivo, possibilità <strong>di</strong> sviluppare<br />
applicazioni portatili sempre più versatili (telefonini, notebook, PDA<br />
ecc.)<br />
Protezione della riservatezza del progetto.<br />
Il primo <strong>dei</strong> fattori che contribuiscono allo sviluppo ed alla <strong>di</strong>ffusione <strong>dei</strong> sistemi VLSI è,<br />
sicuramente, il fatto che la <strong>di</strong>sponibilità <strong>di</strong> sistemi integrati <strong>di</strong> complessità sempre più elevata,
spinge allo sviluppo <strong>di</strong> applicazioni sempre più sofisticate. Inoltre le nuove applicazioni, con il loro<br />
mercato, fungono a loro volta da traino alla progettazione <strong>di</strong> sistemi VLSI <strong>di</strong> prestazioni maggiori.<br />
Come esempio possiamo citare lo sviluppo delle applicazioni e <strong>dei</strong> sistemi operativi per PC, cui ha<br />
fatto da contraltare lo sviluppo <strong>di</strong> microprocessori e memorie sempre più avanzate.<br />
La necessità <strong>di</strong> sistemi integrati sempre più sofisticati ha spinto al continuo miglioramento <strong>dei</strong><br />
processi tecnologici.<br />
L’evoluzione fu prevista dalla Legge <strong>di</strong> Moore, enunciata nel 1965 Gordon Moore, (allora a capo<br />
della R&D alla Fairchild Semiconductor, in seguito, nel 1969, co-fondatore della INTEL).<br />
Dall'osservazione del numero <strong>di</strong> componenti integrati su chip nel periodo 1959-65, Moore postulò<br />
che si sarebbe avuto un aumento esponenziale del numero <strong>di</strong> <strong>di</strong>spositivi integrati anche negli anni<br />
a venire.<br />
Le tecniche <strong>di</strong> progetto <strong>di</strong> sistemi VLSI devono confrontarsi con l’elevata complessità <strong>dei</strong> circuiti da<br />
realizzare (spesso dell'or<strong>di</strong>ne <strong>di</strong> milioni <strong>di</strong> porte logiche elementari), con il ridotto time to market<br />
(vista la continua evoluzione tecnologica e <strong>di</strong> mercato) e inoltre con la necessità <strong>di</strong> sofisticati<br />
programmi <strong>di</strong> progettazione assistita al calcolatore (CAD).<br />
Per questo motivo si fa un largo utilizzo <strong>di</strong> <strong>di</strong>versi livelli <strong>di</strong> astrazione progettuali e <strong>di</strong> tecniche <strong>di</strong><br />
progettazione gerarchica.<br />
Livelli <strong>di</strong> astrazione<br />
La legge <strong>di</strong> Moore, dall'articolo<br />
originalepubblicato nel 1965 su<br />
Electronics<br />
Il flusso <strong>di</strong> progetto <strong>di</strong> un sistema integrato si completa<br />
attraverso un raffinamento fra <strong>di</strong>versi livelli <strong>di</strong> astrazione.<br />
Le specifiche rappresentano una descrizione delle<br />
operazioni che il sistema deve essere in grado <strong>di</strong> effettuare.<br />
Come specifiche sono inoltre assegnati i parametri <strong>di</strong><br />
prestazione del sistema:<br />
la frequenza <strong>di</strong> clock<br />
la potenza <strong>di</strong>ssipata<br />
l'occupazione <strong>di</strong> area sul chip<br />
Le specifiche sono essenzialmente un insieme <strong>di</strong> requisiti<br />
(scritti in linguaggio naturale) e possono risultare<br />
incomplete o contrad<strong>di</strong>ttorie.<br />
La descrizione comportamentale consiste nel descrivere<br />
il sistema me<strong>di</strong>ante un programma eseguibile, ottenuto a<br />
partire da linguaggi ad alto livello.<br />
La descrizione del comportamento del sistema è univoca.<br />
La legge <strong>di</strong> Moore,<br />
Applicata ai<br />
microprocessori INTEL
E’ possibile simulare il funzionamento del sistema, applicando in ingresso <strong>dei</strong> vettori <strong>di</strong> test.<br />
Analizzando i risultati prodotti della simulazione è possibile verificarne la congruenza con le<br />
specifiche assegnate.<br />
I linguaggi per la descrizione dell’hardware utilizzati sono detti linguaggi HDL (Hardware<br />
Description Language): VHDL e VERILOG.<br />
La descrizione Register-Transfer Level (RTL) consiste nel descrivere il sistema è me<strong>di</strong>ante<br />
collegamento <strong>di</strong><br />
blocchi combinatori (che realizzano funzioni logiche assegnate) con elementi <strong>di</strong> memoria (registri).<br />
Si delinea la struttura interna del sistema, della quale è possibile conoscere con precisione il<br />
comportamento del circuito in ogni ciclo <strong>di</strong> clock. E’ possibile avere delle prime stime,<br />
approssimative, <strong>dei</strong> parametri <strong>di</strong> prestazione.<br />
Anche la descrizione RTL viene spesso formalizzata tramite linguaggi HDL.<br />
Nella fase <strong>di</strong> descrizione a livello gate i blocchi funzionali in<strong>di</strong>viduati a livello RTL sono descritti<br />
me<strong>di</strong>ante interconnessione <strong>di</strong> alcune porte logiche elementari.<br />
L'insieme delle gates utilizzate per descrivere il circuito è denominato libreria, mentre per netlist si<br />
intende il listato che enumera le celle elementari utilizzate e ne descrive le interconnessioni.<br />
In questa fase del flusso <strong>di</strong> progetto è possibile ottenere delle stime molto più accurate<br />
dell'occupazione <strong>di</strong> area, della sua velocità e delle <strong>di</strong>ssipazione <strong>di</strong> potenza.<br />
Il passaggio dalla descrizione RTL a quella a livello gate può essere estremamente complesso<br />
poiché la netlist finale può contenere centinaia <strong>di</strong> migliaia o milioni <strong>di</strong> gates.<br />
I programmi <strong>di</strong> sintesi consentono, in maniera quasi del tutto automatica, <strong>di</strong> passare da una<br />
descrizione HDL a livello RTL ad una netlist equivalente<br />
La descrizione a livello transistor consiste nel considerare le realizzazioni circuitali delle celle<br />
logiche <strong>di</strong> libreria me<strong>di</strong>ante <strong>di</strong>spositivi NMOS e PMOS, ognuno con le proprie <strong>di</strong>mensioni <strong>di</strong> canale,<br />
opportunamente interconnessi in modo da formare porte CMOS complesse, strutture a porte <strong>di</strong><br />
trasmissione, logiche <strong>di</strong>namiche ecc.<br />
Anche a questo livello <strong>di</strong> astrazione il circuito sarà descritto da una netlist (ad esempio, un listato<br />
SPICE) che può essere simulata per verificare il funzionamento del circuito e per valutarne le<br />
prestazioni.<br />
A livello <strong>di</strong> layout avviene la descrizione me<strong>di</strong>ante un insieme <strong>di</strong> rettangoli <strong>di</strong> polisilicio, <strong>di</strong><br />
<strong>di</strong>ffusioni N e P, <strong>di</strong> metallizzazioni ecc. che nella loro composizione definiscono i transistori e le<br />
linee <strong>di</strong> interconnessione del chip.<br />
Le informazioni geometriche contenute nel layout servono per realizzare le maschere<br />
fotolitografiche necesarie per la realizzare il circuito integrato.<br />
Il layout consente quin<strong>di</strong> <strong>di</strong> valutare esattamente l'area <strong>di</strong> Silicio richiesta dal circuito.<br />
Solo a livello layout è possibile calcolare con precisione i valori <strong>dei</strong> parametri parassiti introdotti<br />
dalle interconnessioni. Si può quin<strong>di</strong> valutare accuratamente la frequenza operativa e la<br />
<strong>di</strong>ssipazione <strong>di</strong> potenza.<br />
Il layout un circuito VLSI può includere milioni <strong>di</strong> rettangoli elementari => è fondamentale la<br />
<strong>di</strong>sponibilità <strong>di</strong> programmi CAD per layout automatico.<br />
Programmi <strong>di</strong> piazzamento e collegamento <strong>di</strong> celle elementari: partendo dalla netlist a livello gate e<br />
dalla conoscenza <strong>dei</strong> dettagli geometrici delle celle standard, generano automaticamente un layout<br />
del circuito complessivo in cui le celle sono allineate su più righe parallele, intercalate da canali <strong>di</strong><br />
collegamento.<br />
Il flusso <strong>di</strong> progetto che partendo dalle specifiche porta fino al layout è <strong>di</strong> tipo top-down.<br />
Sfortunatamente, molto spesso non è sufficiente un approccio top-down. I parametri <strong>di</strong> prestazione<br />
sono valutati accuratamente solo a livello layout.<br />
Non possiamo essere sicuri che partendo da una determinata descrizione RTL il<br />
circuito finale verificherà le specifiche assegnate in termini <strong>di</strong> potenza, area e velocità.<br />
Se le specifiche non sono sod<strong>di</strong>sfatte è necessario apportare <strong>dei</strong> miglioramenti al progetto,<br />
operando in verso bottom-up. E’ possibile migliorare le prestazioni rimanendo (ad esempio) al<br />
livello layout (ottimizzando il piazzamento ed il collegamento delle celle per<br />
ridurre gli elementi parassiti), ma benché questo comporti uno sforzo aggiuntivo ridotto non è<br />
ottimale in quanto i miglioramenti ottenibili in termini <strong>di</strong> prestazioni sono alquanto limitati.<br />
Se invece si ritorna a livello RTL, può essere possibile migliorare la Fclock mo<strong>di</strong>ficando
(ad esempio) la co<strong>di</strong>fica adottata per memorizzare lo stato del controllore che coor<strong>di</strong>na il<br />
funzionamento del sistema, oppure può essere possibile ridurre la Pd <strong>di</strong>sabilitando i blocchi<br />
funzionali ininfluenti in determinate modalità operative.<br />
Le mo<strong>di</strong>fiche effettuate a livello RTL richiedono uno sforzo progettuale molto maggiore poiché è<br />
necessario passare nuovamente per più livelli <strong>di</strong> astrazione, prima <strong>di</strong> ottenere la<br />
nuova versione del circuito.<br />
Le carenze del modello basato sui livelli <strong>di</strong> astrazione sono molteplici:<br />
Si evidenziano con il progre<strong>di</strong>re della tecnologia a causa dell’evidenziarsi <strong>di</strong> effetti prima<br />
trascurabili<br />
Il ritardo dovuto alle interconnessioni tende ad essere predominante.(es.: un’architettura <strong>di</strong><br />
sommatore potenzialmente più veloce <strong>di</strong> un’altra a livello gate <strong>di</strong>viene più lenta a livello<br />
layout.<br />
Elementi globali al sistema integrato come il clock o le linee <strong>di</strong> alimentazione non appaiono<br />
nei livelli <strong>di</strong> astrazione più elevati ma possono influenzare notevolmente le prestazioni<br />
complessive.<br />
La <strong>di</strong>ssipazione <strong>di</strong> potenza in con<strong>di</strong>zioni <strong>di</strong> riposo (leakage) tende a crescere<br />
drammaticamente al ridursi della feture-size, fino a <strong>di</strong>venire confrontabile con quella<br />
<strong>di</strong>namica. E’ necessaria una conoscenza approfon<strong>di</strong>ta degli aspetti circuitali che<br />
consentono <strong>di</strong> <strong>di</strong>minuire Pleakage anche nei livelli <strong>di</strong> astrazione più elevati.<br />
Progettazione gerarchica<br />
Ad ognuno <strong>dei</strong> livelli <strong>di</strong><br />
astrazione vengono adoperate<br />
tecniche <strong>di</strong> progettazione<br />
gerarchica. Ogni elemento del<br />
progetto viene ricorsivamente<br />
sud<strong>di</strong>viso in elementi<br />
più semplici, fino a giungere ad<br />
elementi "atomici", <strong>di</strong><br />
ridotta complessità.<br />
A lato possiamo vedere due<br />
esempi <strong>di</strong> progettazione<br />
gerarchica per quanto riguarda<br />
Progettazione gerarchica a livello RTL<br />
la progettazione a livello RTL e<br />
la progettazione a livello layout.<br />
Per la progettazione a livello layout abbiamo:<br />
primo livello gerarchico, il layout è<br />
costituito dalla giustapposizione <strong>di</strong> celle<br />
identiche (bit slice).<br />
Ogni bit-slice è quin<strong>di</strong> decomposta in celle<br />
elementari<br />
Il layout delle celle elementari viene realizzato<br />
<strong>di</strong>segnando i vari rettangoli che rappresentano i<br />
transistori e le linee <strong>di</strong> interconnessione ed<br />
alimentazione.<br />
Costi <strong>di</strong> un circuito integrato<br />
Progettazione gerarchica a livello Layout<br />
I costi si <strong>di</strong>fferenziano in due categorie:<br />
Costi non ricorrenti:<br />
Tempo <strong>di</strong> progettazione e miglioramento, generazione della maschera
Fattore <strong>di</strong> costo una tantum<br />
Costi ricorrenti:<br />
Trattamento del silicio, package, test<br />
Costi proporzionali al volume<br />
Costi proporzionali all’area del chip<br />
In formule:<br />
Resa del test finale : Dopo essere stati incapsulati i circuiti vengono testati per verificarne il corretto<br />
funzionamento.<br />
Resa: % <strong>di</strong> circuiti funzionanti rispetto al totale <strong>di</strong><br />
circuiti prodotti.<br />
Numero <strong>di</strong> chip su wafer = rapporto fra area del wafer ed area del chip (circa)<br />
Resa= % chip non <strong>di</strong>fettosi sul wafer<br />
La resa <strong>di</strong>pende dalle <strong>di</strong>mensioni del chip: più è grande più è probabile che possa essere presente<br />
un <strong>di</strong>fetto nel chip.
Tecniche <strong>di</strong> implementazione <strong>dei</strong> sistemi <strong>di</strong>gitali<br />
(Cap. 8 del testo)<br />
Progettazione Custom<br />
In un progetto Custom il chip viene realizzato artigianalmente e il rettangolo sul layout ne<br />
rappresenta l’elemento atomico. Con questo tipo <strong>di</strong> progettazione si conseguono massime<br />
prestazioni ma è massimo anche il tempo <strong>di</strong> progetto.<br />
Quando si utilizza un approccio custom, si progetta un blocco che verrà riutilizzato molte volte<br />
(libreria). I costi fissi <strong>di</strong> progettazione possono essere ammortizzati su un volume <strong>di</strong> produzione<br />
elevatissimo (uP, memorie), ma in generale questo approccio è scelto quando il costo non è il<br />
parametro fondamentale, che sono invece le prestazioni.<br />
Progettazione Semi-Custom<br />
Si <strong>di</strong>vide in progettazione Cell-based e Array-based.<br />
Progettazione Cell-based<br />
La progettazione Cell-based è un approccio in<strong>di</strong>spensabile<br />
per ridurre i tempi <strong>di</strong> progettazione. Vi è però una<br />
penalizzazione in termini <strong>di</strong> prestazioni.<br />
L’elemento atomico è rappresentato dalle celle (macrocelle) <strong>di</strong><br />
libreria, infatti il sistema è realizzato assemblando e<br />
collegando fra loro celle preesistenti. Per questo tipo <strong>di</strong><br />
progettazione è necessario un utilizzo intensivo <strong>di</strong> programmi <strong>di</strong> sintesi automatica, piazzamento e<br />
collegamento.<br />
Lo schema <strong>di</strong> principio <strong>di</strong> una progettazione cell-based con celle standard è presentata qui a lato.<br />
Come si vede tutte le celle hanno la stessa altezza mentre la larghezza è variabile (<strong>di</strong>pende dalla<br />
funzione logica, dal numero <strong>di</strong> ingressi, dalle W <strong>dei</strong> MOS,etc.). Si<br />
ha un livello <strong>di</strong> metal (ad esempio, m1) per le interconnessioni<br />
orizzontali, ed un altro livello <strong>di</strong> metal (m2) per i collegamenti<br />
verticali.<br />
I canali <strong>di</strong> collegamento (routing channels) servono per collegare<br />
i terminali <strong>di</strong> ingresso-uscita delle celle.<br />
Le linee <strong>di</strong> alimentazione si collegano automaticamente<br />
affiancando fra loro le celle.<br />
La percentuale <strong>di</strong> utilizzo è data dal rapporto fra l’area<br />
complessiva e l’area occupata dalle celle. I canali <strong>di</strong><br />
Progettazione con celle standard<br />
collegamento riducono la percentuale <strong>di</strong> utilizzo.<br />
L’utilizzo <strong>di</strong> un numero maggiore <strong>di</strong> livelli <strong>di</strong> metallizzazione
consente <strong>di</strong> migliorare notevolmente la percentuale <strong>di</strong> utilizzo.<br />
Ad esempio: nelle celle si utilizza soltanto il primo livello <strong>di</strong> metal, mentre per le interconnessioni<br />
utilizzo i livelli <strong>di</strong> metal superiori (da metal2 a metal6) => collegamenti sopra le celle. Con una<br />
tecnologia a 7 livelli <strong>di</strong> metal si riesce ad ottenere percentuali <strong>di</strong> utilizzo del 90%. Quanti più livelli <strong>di</strong><br />
metal sono <strong>di</strong>sponibili, tanto più si riesce ad aumentare la percentuale <strong>di</strong> utilizzo.<br />
Osservazioni sulle celle standard: le celle hanno due linee metalliche, una inferiore e una <strong>di</strong><br />
alimentazione positiva, la stessa altezza garantisce che quando accostiamo due celle, possiamo<br />
collegare le due linee <strong>di</strong> alimentazione e <strong>di</strong> massa. Non tutte le celle hanno lo stesso numero <strong>di</strong><br />
<strong>di</strong>spositivi o la stessa complessità, ecco perché hanno larghezza <strong>di</strong>versa. Attenzione: queste linee<br />
saranno definite solo per le varie righe. Tra le varie righe, ci sarà una linea <strong>di</strong> collegamento globale<br />
che porta la Vdd e la GND.<br />
Quin<strong>di</strong>, la <strong>di</strong>mensione delle celle non può essere casuale. La lunghezza non può comunque<br />
variare con continuità. Si definisce un passo elementare m. Questo garantisce anche che i vari<br />
contatti andranno piazzati su una definita griglia e non a casaccio in modo che il programma <strong>di</strong><br />
collegamento delle celle sappia dove posizionare i vari contatti.<br />
I collegamenti vengono realizzati con due livelli <strong>di</strong> metal: un primo livello per i collegamenti<br />
orizzontali e un secondo livello per i collegamenti verticali. Così facendo, non ci sono problemi <strong>di</strong><br />
“corto”.<br />
Il canale non può essere troppo stretto altrimenti non riusciamo a far passare le linee <strong>di</strong><br />
collegamento. Il programma <strong>di</strong> collegamento e piazzamento sceglierà l’altezza minima che<br />
consentirà il passaggio <strong>di</strong> tutte le tracce. Nota che se non piazzo le celle, non<br />
posso sapere quali collegamenti devono essere fatti. La bontà del piazzamento<br />
delle celle sarà migliore quanto più piccolo sarà il canale.<br />
Questa cella standard ha una altezza ben definita, ha la Vdd in alto e la massa<br />
in basso, per cui ha gli nmos in basso (dove deve esserci la presa <strong>di</strong> substrato)<br />
e i pmos in alto (vicino alla vdd). Se ogni cella è ben caratterizzata, dalla<br />
tabella posso valutare i ritar<strong>di</strong> della cella! Si <strong>di</strong>ce che i ritar<strong>di</strong> (elementi <strong>di</strong><br />
ritardo) vengono annotati con la porta logica.<br />
Esempio: si possono valutare le celle logiche, le alimentazioni tra le varie righe<br />
sono le linee grosse verticali al centro (Vdd e massa), tra una riga <strong>di</strong><br />
cella e un’altra c’è il canale, metal1 in viola e metal2 in azzurro. Si ha<br />
che l’altezza del canale tra 2 righe è ad<strong>di</strong>rittura maggiore dell’altezza<br />
delle celle stesse!! Un modo per migliorare le cose è far si che il<br />
canale <strong>di</strong> collegamento possa coincidere con la striscia <strong>di</strong> celle: i<br />
collegamenti avvengono sopra le celle logiche e ciò si fa solo a<br />
con<strong>di</strong>zione che vengano utilizzate come linee <strong>di</strong> collegamento <strong>dei</strong><br />
livelli <strong>di</strong> metal che non sono utilizzati per costruire le celle! In altre parole, nelle celle uso metal1 e<br />
metal2 e i collegamenti li faccio con metal3 e metal4. Così, le linee orizzontali e verticali (azzurro e<br />
viola) possono passare anche sulle celle stesse!! I collegamenti <strong>di</strong> ingresso e uscita quin<strong>di</strong><br />
possono stare anche in mezzo alle celle stesse! Le linee <strong>di</strong><br />
collegamento poi pioveranno dall’alto. Più livelli <strong>di</strong> metal ci sono, più<br />
gra<strong>di</strong> <strong>di</strong> libertà ci sono.<br />
Nella figura a sinistra è riportata una tecnologia con 7 livelli <strong>di</strong> metal e si<br />
vede chiaramente come la percentuale <strong>di</strong> utilizzo sia estremamente<br />
migliorata del 70-80%. Si noti però che cominciano a giocare le<br />
capacità tra le varie linee. Queste danno luogo ad una serie <strong>di</strong> problemi<br />
che vedremo. Comunque, tutti questi collegamenti rappresentano<br />
capacità. Le tecnologie attuali hanno 7-8 livelli <strong>di</strong> metal.<br />
Per quanto riguarda la progettazione cell-based con moduli funzionali (macro-celle) notiamo che la<br />
standar<strong>di</strong>zzazione a livello <strong>di</strong> porta logica è attraente per funzioni logiche generiche ma non è<br />
molto efficace per:<br />
strutture ripetitive (circuiti aritmetici, memorie)
strutture complesse (microprocessori, DSP).<br />
Sfruttando la natura specifica <strong>di</strong> questi blocchi è possibile ottenere realizzazioni con migliori<br />
prestazioni. Le macrocelle sono o strutture ripetitive o altri blocchi (strutture complesse) che<br />
vengono meglio realizzate a parte o ad<strong>di</strong>rittura acquistate.<br />
I moduli funzionali (macrocelle) possono essere <strong>di</strong>stinti in:<br />
hard-macro: pezzi <strong>di</strong> layout già fatti che vengono ottimizzati<br />
per la tecnologia che stiamo utilizzando<br />
soft-macro: netlist in<strong>di</strong>pendente dalla tecnologia,<br />
ottimizzata per il particolare blocco funzionale. in<strong>di</strong>pendenti dalla<br />
tecnologia, sono netlist fatti a posta per quella applicazione.<br />
Questi vengono quin<strong>di</strong> generati con generatori a parte (macro<br />
generator). Per esempio, se devo realizzare una memoria.<br />
La <strong>di</strong>sponibilità <strong>di</strong> macro-moduli ha mo<strong>di</strong>ficato le tecniche <strong>di</strong> progettazione <strong>di</strong> sistemi VLSI negli<br />
ultimi anni.<br />
Circuiti costruiti assemblando macroblocchi, spesso acquistati da terze parti: proprietà intellettuali,<br />
o intellectual property IP.<br />
Una IP non è il solo macroblocco, ma include spesso anche gli strumenti software (ad esempio,<br />
per alla IP <strong>di</strong> un microprocessore si accompagna un compilatore, un sistema <strong>di</strong> debugging ecc.).<br />
Inoltre, devono essere forniti modelli <strong>di</strong> pre<strong>di</strong>zione del timing, strumenti per il testing, etc.<br />
Per fare un sistema complesso system on a chip, si prendono queste IP, si collegano e si mettono<br />
su un chip, si fa qualche cosa ad hoc con le celle standard ed il gioco è fatto. (sistemi embedded).<br />
Flusso <strong>di</strong> progetto <strong>di</strong> un sistema semi-custom<br />
Come si fa il flusso <strong>di</strong> progetto <strong>di</strong> questi sistemi semi<br />
custom?<br />
- Descrizione HDL.<br />
- sintesi logica con netlist<br />
- floorplanning: dato il mio sistema, dove piazzo i vari<br />
componenti? grossolana<br />
- placament: piazzamento vero e proprie delle celle<br />
- collegamento<br />
- simulazione post layout<br />
Se ci sono problemi sul rispetto delle specifiche, si<br />
ripetono <strong>dei</strong> passi.<br />
I parametri parassiti associati al layout giocano un ruolo predominante per le prestazioni del<br />
sistema.<br />
Nel flusso <strong>di</strong> sviluppo “standard” non si tiene conto <strong>di</strong> questi parametri in fase <strong>di</strong> sintesi logica<br />
Il circuito sintetizzato sembra apparentemente sod<strong>di</strong>sfare i vincoli temporali: in effetti dopo la fase<br />
<strong>di</strong> place and route si verifica che il circuito non ha le prestazioni richieste.<br />
Processo <strong>di</strong> “timing closure”: sono necessarie più iterazioni prima che il progetto sod<strong>di</strong>sfi le<br />
specifiche assegnate.<br />
Già in fase si sintesi si effettua un primo place and route <strong>di</strong> tentativo, per ottenere una stima <strong>dei</strong><br />
parametri parassiti del layout.<br />
Progettazione Array-based<br />
La progettazione Array-based, ovvero <strong>di</strong> tipo matrice, si<br />
<strong>di</strong>stinguono in gate-array e fpga. I costi da ridurre sono soprattutto<br />
quelli delle maschere. I blocchi sono tutti uguali, però sono<br />
completati fino ad un determinato livello, per esempio metal1. Poi,<br />
vengono personalizzati per realizzare la nostra funzione usando i
livelli <strong>di</strong> metal superiore. Questi chip non personalizzati vengono prodotti per tutti gli utenti che<br />
useranno quell’hardware, poi ognuno si farà i collegamenti che vuole.<br />
Nella realizzazione delle Gate Array, si parla <strong>di</strong> Sea-of-gates, e l’obiettivo è ridurre i tempi <strong>di</strong><br />
realizzazione e ridurre i costi non ricorrenti.<br />
Vengono realizzati lotti <strong>di</strong> wafer in cui sono stati realizzati i primi passi <strong>di</strong> processo (ad esempio,<br />
fino alla realizzazione del metal-1). I chip (tutti uguali fra loro) includono delle celle “primitive”. I<br />
chip sono “personalizzati” per realizzare una specifica applicazione utilizzando i livelli <strong>di</strong> metal<br />
superiori.<br />
Vantaggi: i costi relativi ai primi passi <strong>di</strong> processo sono ammortizzati fra numerosi progetti<br />
I tempi necessari per la personalizzazione <strong>dei</strong> chip sono ridotti (è necessario realizzare solo poche<br />
maschere).<br />
I circuiti iniziali somigliano ad un sistema basato su celle standard: le righe <strong>di</strong> celle sono non<br />
collegate tra loro!! Ci sono un insieme <strong>di</strong> nmos e <strong>di</strong> pmos non collegati. In fase <strong>di</strong><br />
personalizzazione sfruttiamo i contatti e i livelli<br />
<strong>di</strong> metal per realizzare la voluta funzione logica.<br />
Per fare la NOR a 4 ingressi si è fatto come in<br />
figura. Il circuito realizzato in questo modo non<br />
è ottimizzato, infatti o faccio una NOR o una<br />
NAND le <strong>di</strong>mensioni sono sempre le stesse. La<br />
logica cmos però ha questo vantaggio: se uno<br />
collega bene i <strong>di</strong>spositivi (anche con W e L a<br />
caso) la porta funzionerà sempre! Ovviamente,<br />
i ritar<strong>di</strong> saranno non ottimali.<br />
Ci saranno però collegamenti inutili.<br />
Svantaggi: Prestazioni limitate (celle non ottimizzate, piazzamento <strong>dei</strong><br />
blocchi non ottimizzato ecc.) I SoC attuali richiedono tempi <strong>di</strong> sviluppo consistenti: il risparmio <strong>di</strong><br />
due-tre settimane ottenibile con i gate-arrays non è più così cruciale.<br />
Nelle tecnologie attuali con 7/8 livelli <strong>di</strong> metal, la metallizzazione è <strong>di</strong>venuto uno <strong>dei</strong> passi <strong>di</strong><br />
processo più critici e costosi: il risparmio economico <strong>dei</strong> gate-arrays non è più molto sensibile.<br />
Risultato: i gate-arrays hanno attualmente perso gran parte della loro popolarità.<br />
Un esempio <strong>di</strong> System-on-chip Customizable è SPEAr ST.<br />
Il chip include:<br />
un processore<br />
alcune IP standard<br />
della logica aggiuntiva ed una rete <strong>di</strong> collegamenti, personalizzabili dall'utente<br />
Per quanto riguarda le FPGA(Field-Programmable Gate Array) esse possono essere programmate<br />
in <strong>di</strong>versi mo<strong>di</strong>:<br />
basata su fusibile (programmabile una sola volta)<br />
basata su EPROM non-volatile<br />
basata su RAM<br />
Può essere programmata in due mo<strong>di</strong>:<br />
Array-based<br />
Look-up Table<br />
Inoltre è possibile programmare anche lo stile delle interconnessioni.<br />
Gli FPGA più avanzati hanno anche processori già embedded o moltiplicatori.<br />
Costa <strong>di</strong> più l’fpga o gate array ?<br />
Nel caso <strong>di</strong> asic, ho costi iniziali elevatissimi per ottenere il primo prototipo (e per fare le<br />
maschere), ma poi ogni altro <strong>di</strong>spositivo mi costerà pochissimo.<br />
Quin<strong>di</strong> avrò una pendenza del costo in funzione <strong>dei</strong> volumi prodotti bassa.<br />
Nel caso <strong>dei</strong> gate array invece, il costo iniziale sarà più basso ma poi l’area mi costa e la pendenza<br />
è maggiore!!
Per gli FPGA, il costo iniziale è ancora inferiore, però ogni FPGA mi costa sempre uguale quin<strong>di</strong> la<br />
pendenza è ancora maggiore!<br />
Nell’elettronica <strong>di</strong> consumo quin<strong>di</strong> si usa ASIC perché ne devo fare milioni.<br />
Gli FPGA invece si usano come prima versione o come piattaforma per effettuare delle<br />
emulazioni. Quando si ha un sistema molto complicato non è facile farne la simulazione, in alcuni<br />
casi la risposta del sistema è richiesta non in simulazione ma proprio sul circuito. Gli FPGA quin<strong>di</strong><br />
si usano per la rapid prototyping.<br />
Un aspetto fondamentale nella progettazione <strong>di</strong> un system on chip è la scelta <strong>di</strong> realizzare le<br />
funzionalità richieste me<strong>di</strong>ante blocchi hardware oppure in software, sfruttando il microprocessore<br />
presente sul chip.<br />
In generale si fa una partizione del sistema fra componenti hardware e software: hardwaresoftware<br />
co-design.<br />
Per verificare il corretto funzionamento del sistema è infine necessario provvedere ad una cosimulazione<br />
(Hardware-software co-simulation) hardware-software in cui è necessario tenere in<br />
conto, contemporaneamente, l'esecuzione <strong>di</strong> un programma da parte del processore e le<br />
operazioni svolte dalle periferiche e dalla logica aggiuntiva integrata sul chip.<br />
In figura è mostrato un esempio <strong>di</strong> come si sviluppa oggi un system on chip.<br />
Si valuta in matlab/c il sistema. Capite le specifiche si partiziona la parte sw e la parte hw. Si valuta<br />
quanta memoria serve ecc. Si fa l’hw, si mette insieme tutto su un prototipo, si fa una validazione<br />
finale e poi si esce col chip.
Modelli per il transistore MOS<br />
Cap. 3<br />
Esistono <strong>di</strong>fferenti approcci, a seconda delle applicazioni:<br />
Analisi manuale (carta e matita)<br />
Modelli switch-level (simulazione veloce, non molto accurata)<br />
Modelli per simulazione circuitale (SPICE) (accurati, molti parametri). In<strong>di</strong>spensabili per<br />
sistemi analogici. Per applicazioni <strong>di</strong>gitali: simulazioni <strong>di</strong> sottocircuiti critici.<br />
È sempre fondamentale effettuare un’analisi carta e penna.<br />
Nella simulazione switch-level viene sostituito un interruttore controllato con una resistenza. Grazie<br />
ad una scelta furba <strong>di</strong> questa resistenza equivalente, si ottengono risposte abbastanza atten<strong>di</strong>bili<br />
anche con circuiti con decine <strong>di</strong> migliaia <strong>di</strong> <strong>di</strong>spositivi.<br />
Modelli per analisi manuale<br />
Ricor<strong>di</strong>amo le equazioni per il modello semplificato (level 1) a canale “lungo”:<br />
La tensione <strong>di</strong> soglia <strong>di</strong>pende dalla tensione tra source e substrato.<br />
Possiamo riscrivere le equazioni in maniera del tutto equivalente:<br />
Questo modo <strong>di</strong> scrivere la relazione del MOS è importante.<br />
Graficamente abbiamo:<br />
Le limitazioni <strong>di</strong> questo modello sono<br />
sicuramente:<br />
1. Dipendenza della tensione <strong>di</strong> soglia dalla<br />
Vds. La Vt si riduce al crescere <strong>di</strong> Vds (Drain<br />
Induced Barrier Lowering, DIBL) pertanto Id<br />
cresce sensibilmente al crescere <strong>di</strong> Vds. Non<br />
è un aspetto molto rilevante per applicazioni<br />
<strong>di</strong>gitali, poiché quasi tutti i <strong>di</strong>spositivi hanno<br />
L=Lmin.<br />
2. Degradazione della mobilità. La velocità<br />
con la quale si muovono i portatori satura al<br />
crescere della Vds (non è più proporzionale al
campo elettrico). Anche per bassi valori <strong>di</strong> Vds, la mobilità tende a ridursi al crescere della<br />
Vgs.<br />
A causa <strong>di</strong> tutto ciò, le<br />
caratteristiche tendono a<br />
saturare molto prima! La<br />
caratteristica tende ad essere<br />
più una retta che una<br />
parabola! La saturazione si ha<br />
a causa del fatto che aumento<br />
la Vds ma si riduce la mobilità.<br />
La caratteristica continua<br />
comunque ad aumentare<br />
perché si riduce la Vt. Nel modello a canale lungo, c’è una corrente che va col quadrato. Quando è<br />
a canale corto, la corrente tende a cresce linearmente, o comunque con qualcosa che va come:<br />
(Vgs-Vt)^k (con k compreso tra ½ e 2).<br />
La Id satura per valori <strong>di</strong> Vds inferiori rispetto a (Vgs-Vt). In pinch-off, la Id cresce all’incirca<br />
linearmente con Vgs-Vt.<br />
In questa simulazione, il mos è collegato a<br />
<strong>di</strong>odo. In questo caso, la relazione a<br />
canale lungo è sempre in pinch off tranne<br />
se la V scende sotto la Vt. Nel mos a<br />
canale corto, la relazione <strong>di</strong>venta<br />
praticamente lineare con la Vgs.<br />
Possiamo modellare questi fenomeni<br />
mo<strong>di</strong>ficando la formula vista prima:<br />
ora compare un terzo parametro: tensione <strong>di</strong> saturazione Vsat che è una costante. Il valore <strong>di</strong> Vsat<br />
è un po’ più grande della Vt.<br />
È un modello empirico che consente <strong>di</strong> analizzare circuiti con MOS a canale corto con carta e<br />
matita ed è detto modello MOS unificato.<br />
La caratteristica si mo<strong>di</strong>fica come in figura.<br />
Nelle caratteristiche del mio <strong>di</strong>spositivo, in<strong>di</strong>viduo 3 zone invece che 2: se Vgs-Vt è inferiore a<br />
Vsat, si hanno le stesse relazioni del modello a canale lungo (siamo nella zona Saturated). Questa<br />
prima zona termina quando Vgs-Vt <strong>di</strong>venta maggiore <strong>di</strong> Vsat.<br />
Ora bisogna vedere la Vds: se è minore <strong>di</strong> Vsat, ancora una<br />
volta siamo nella solita caratteristica (in particolare in triodo). Se<br />
invece è la Vsat la più bassa, siamo in una nuova zona: Velocity<br />
Saturated che è la più grande! In questa zona a velocità<br />
saturata si ha che:<br />
Id=K[2(Vgs-Vt)Vsat-Vsat 2 ](1+λVds)<br />
La Id è funzione lineare <strong>di</strong> Vgs-Vt. In pratica il <strong>di</strong>spositivo opera<br />
quasi sempre in questa zona a velocità saturata.
Possiamo vedere <strong>di</strong> nuovo la caratteristica con il MOS connesso a<br />
<strong>di</strong>odo:<br />
Per i <strong>di</strong>spositivi PMOS invece avremo che:<br />
Al posto <strong>di</strong> Vds => Vsd (grandezza positiva)<br />
Al posto <strong>di</strong> Vgs => Vsg (grandezza positiva)<br />
Al posto <strong>di</strong> Vt => Vtp; (grandezza positiva)<br />
Al posto <strong>di</strong> Kn => Kp (K’p=1/2 ÷1/2.5 K’n)<br />
Quin<strong>di</strong> le equazioni sono:<br />
Analizziamo ora il problema della conduzione<br />
sotto soglia.<br />
La Id non si annulla bruscamente per Vgs
Tramite una simulazione SPICE (quanto più accurata possibile) dell’invertitore, ottengo Tphl, dal<br />
quale calcolo Rn.<br />
Questa Rn è determinata per uno specifico MOS con W e L e con una specifica capacità d carico.<br />
Che succede se cambio la W del mio <strong>di</strong>spositivo?<br />
Se parto da un mos con W0/L e determino la Rn, per un MOS che avrà W1/L la Rn1 la posso<br />
ottenere così:<br />
Rn1=Rn0*W0/W1<br />
Attenzione a questo approccio semplificato: in pratica, la tensione <strong>di</strong> soglia del <strong>di</strong>spositivo è<br />
funzione della L e della W quin<strong>di</strong> non c’è esattamente una relazione così lineare tra R e W. Se<br />
andassimo a ragionare per <strong>di</strong>spositivi per <strong>di</strong>fferente L, questo fenomeno è molto significativo!<br />
Normalmente la W è molto più grande della L e gli effetti <strong>di</strong> canale stretto non sono così forti. Per<br />
quanto riguarda la C <strong>di</strong> carico invece non ho problemi. Nelle nostre simulazioni spice useremo<br />
valori tipici <strong>di</strong> W e calcoleremo una R tipica.<br />
Analogamente per Rp, ottenuta però considerando il tempo <strong>di</strong> propagazione basso-alto tplh.<br />
Si può fare anche una stima analitica <strong>di</strong> Rn.<br />
Ricaviamo una formula approssimata <strong>di</strong> Rn per capire da cosa <strong>di</strong>pende e quali or<strong>di</strong>ni <strong>di</strong> grandezza<br />
assume. Ve<strong>di</strong>amo dove avviene la commutazione: essa<br />
avviene in regione <strong>di</strong> velocità saturata. Infatti la Vo va da<br />
Vdd1/2 Vdd.<br />
Se sto in tecnologia 0.24um la Vdd è 2.5V quin<strong>di</strong> sto<br />
passando da 2.5V a 1.25V. Essendo Vsat circa 1.0V, sto in<br />
regione saturata (ve<strong>di</strong> figura della caratteristica).<br />
L’espressione della corrente in questa zona è:<br />
Tutto è in<strong>di</strong>pendente da Vds tranne l’ultimo termine. In generale, Vsat al quadrato è abbastanza<br />
piccolo e lo si può trascurare nella parentesi quadra se accade che:<br />
Vsat
Si può semplificare la formula se il termine col lambda è piccolo rispetto ad 1 (sviluppo in serie).<br />
La resistenza è in<strong>di</strong>pendente da C ed è inversamente proporzionale al rapporto W/L (che sta in<br />
Isat).<br />
R quin<strong>di</strong> è in<strong>di</strong>pendente da C ed è inversamente proporzionale a W/L.<br />
Semplificando ancora, si ha che (trascurando anche Vt rispetto a Vdd):<br />
Questo ci <strong>di</strong>ce che la resistenza è poco <strong>di</strong>pendente dalla tensione <strong>di</strong> alimentazione: in particolare<br />
decresce (anche se molto lievemente) all’aumentare della tensione <strong>di</strong> polarizzazione. Inoltre, la R<br />
<strong>di</strong>pende inversamente da Vsat. Ricor<strong>di</strong>amo che la Vsat tende a <strong>di</strong>ventare sempre più piccolo col<br />
migliorare della tecnologia. Ricapitolando: c’è una relazione inversa dal rapporto W/L e una<br />
<strong>di</strong>pendenza sensibile dalla tensione Vt. Abbiamo visto quando l’nmos opera da pull-down ovvero<br />
che scarica la capacità e dualmente quando un PMOS funziona da pull-up ovvero che carica la<br />
capacità.<br />
Ve<strong>di</strong>amo se con questo modello semplificato possiamo simulare bene una porta NAND a 2<br />
ingressi.<br />
Per questa NAND stu<strong>di</strong>amo il tempo <strong>di</strong> commutazione alto-basso: ci focalizziamo quin<strong>di</strong> sugli<br />
NMOS. Ci sono 2 possibili casi che fanno commutare il nostro circuito, dando quin<strong>di</strong> una<br />
commutazione alto-basso all’uscita. I due casi possibili sono:<br />
a) B=1 A=0 B=1 A=1<br />
b) B=0 A=1 B=1 A=1<br />
Ve<strong>di</strong>amo ora perché c’è <strong>di</strong>fferenza tra i due ritar<strong>di</strong> (dovuta alle Capacità).<br />
Caso a)<br />
Stu<strong>di</strong>amo il nostro circuito sostituendo ai <strong>di</strong>spositivi le resistenze e gli interruttori corrispondenti.<br />
Per la rete <strong>di</strong> pull-up, i transistori sono<br />
spenti e quin<strong>di</strong> non <strong>di</strong>segno le<br />
resistenze della rete. Devo evidenziare<br />
le capacità: una è quella sul nodo <strong>di</strong><br />
uscita Cp, poi c’è quella legata al nodo<br />
interno Cq.<br />
Ve<strong>di</strong>amo ora le con<strong>di</strong>zioni iniziali sulle<br />
due capacità: su Cp c’è Vdd mentre su<br />
Cq c’è Vdd-Vt, che approssimiamo<br />
comunque con Vdd. Quin<strong>di</strong>, le due<br />
capacità sono entrambe cariche a Vdd.<br />
L’approccio utilizzato per semplificare<br />
l’analisi è quello in cui si introduce una<br />
costante <strong>di</strong> tempo equivalente: la tensione <strong>di</strong> uscita è riconducibile ad una evoluzione che ha<br />
una unica costante <strong>di</strong> tempo<br />
dominante, una tau equivalente. Per<br />
calcolarla, si considerano le capacità<br />
singolarmente e si valuta la resistenza<br />
ai capi della stessa. Poi, si sommano.<br />
Una volta ottenuta la tau equivalente, il<br />
tempo <strong>di</strong> propagazione sarà:<br />
Tp=0.69τeq.<br />
La tecnica switch level quin<strong>di</strong> si esegue<br />
in 2 passaggi:<br />
a) sostituisco al posto <strong>dei</strong> mos delle<br />
resistenze e degli interruttori
) utilizzo il metodo delle costanti <strong>di</strong> tempo per calcolare τeq<br />
Fatto ciò, calcolo Tp=0.69τeq. Stimare questo tempo <strong>di</strong> propagazione in questo modo è<br />
semplicissimo!<br />
Caso b)<br />
Ve<strong>di</strong>amo ora cosa accade nella nostra porta NAND quando commuta l’ingresso B invece che A.<br />
La <strong>di</strong>namica <strong>di</strong> questo circuito è <strong>di</strong>versa da<br />
prima perché, se pure le resistenze e le<br />
capacità sono le stesse, ho che le capacità<br />
sono caricate inizialmente a valori <strong>di</strong>versi!!<br />
L’approccio deve essere <strong>di</strong>verso. E allora,<br />
proviamo a considerare due casi limite:<br />
a) Cq circa nulla:<br />
b) Cq infinita:<br />
τeq = (Rb+Ra)Cp<br />
τeq = Rp*Cp<br />
(perché la Cq tiene fisso a 0V il nodo Q e Ra si cortocircuita).<br />
In sintesi,<br />
τeq B = (Rb+Ra)Cp<br />
e si ha che: τeq B < τeq A . Questo <strong>di</strong>ce che l’ingresso B è privilegiato e in generale sono privilegiati<br />
i mos più vicini all’uscita! Questo effetto del 2 or<strong>di</strong>ne viene fuori facilmente grazie alla tecnica<br />
switch-level.<br />
In questo caso le con<strong>di</strong>zioni iniziali sui due condensatori sono <strong>di</strong>fferenti. Non si può applicare il<br />
metodo delle costanti <strong>di</strong> tempo come in precedenza.<br />
Se Cq=0: =><br />
Se Cq=∞ =><br />
Possiamo allora ottimizzare la porta NAND: scelgo per i due <strong>di</strong>spositivi A e B della rete N<br />
<strong>di</strong>mensioni <strong>di</strong>fferenti. Potremmo pensare <strong>di</strong> fare la W <strong>di</strong> B più piccola <strong>di</strong> A: questo fatto non<br />
andrebbe a peggiorare i ritar<strong>di</strong>.<br />
Nel caso peggiore avremo che:<br />
Quin<strong>di</strong> Ra moltiplica una capacità maggiore.<br />
Si ha che W del MOS pilotato da A maggiore rispetto all’altro MOS, si procede con un progressive<br />
sizing. (<strong>di</strong>mensionamento progressivo). I <strong>di</strong>spositivi si fanno più gran<strong>di</strong> man mano che vado<br />
dall’uscita verso la massa. Nella pratica non è così efficace perché è legata al modo col quale<br />
realizzo il layout <strong>dei</strong> nostri <strong>di</strong>spositivi.<br />
Secondo caso: NMOS come pull-up<br />
Ve<strong>di</strong>amo come utilizzare l’NMOS come pull-up. E’ un multiplexer. Gli<br />
interruttori sono in serie questa volta, sono semplici NMOS e conducono uno<br />
alla volta. La capacità <strong>di</strong> uscita potrà essere caricata o scaricata a seconda<br />
del caso. Questi nmos vengono ad operare come pullup. Gli nmos sono<br />
inefficaci come pull-up, funzionano meglio se devono portare un livello
asso. Modelliamo questo aspetto usando due resistenze <strong>di</strong>fferenti a seconda se il <strong>di</strong>spositivo<br />
opera come pull-up o pull-down. Se opera come pull-down la R l’ho già vista prima.<br />
Se opera come pull-up, la R sarà <strong>di</strong>versa: R’n. Questa nuova resistenza, per lo stesso identico<br />
<strong>di</strong>spositivo, sarà sicuramente maggiore perché deve modellare una minore efficacia <strong>di</strong><br />
trasferimento <strong>di</strong> segnale. Facendo una simulazione, calcoliamo la R’n (così come abbiamo fatto<br />
prima).<br />
In formule:<br />
Ripeto:<br />
R’n > Rn.<br />
Infine ricor<strong>di</strong>amo che la R’n la otteniamo per uno specifico MOS con determinate W e L. Per un<br />
altro MOS, scalerò opportunamente.<br />
Ve<strong>di</strong>amo <strong>di</strong> stimare analiticamente questa R’n. Il circuito più semplice <strong>di</strong> test che possiamo<br />
pensare è costituito da un unico NMOS che va a caricare in uscita la capacità inizialmente scarica.<br />
Questo sarà anche il circuito che andremo a simulare.<br />
Il circuito <strong>di</strong> test è:<br />
Il <strong>di</strong>spositivo in quale regione opererà? Una volta effettuata la commutazione, il <strong>di</strong>spositivo vede<br />
sul suo drain la vdd, la gate anche e quin<strong>di</strong> la Vds coincide con la Vgs (Vds=Vgs=V) inizialmente.<br />
La relazione che lega la I alla V, è quella <strong>di</strong> figura: prima della Vt il mos è spento. Appena V=Vgs-<br />
Vt <strong>di</strong>venta maggiore <strong>di</strong> 0 siamo in pinch-off, poi appena supera Vsat siamo in velocità saturata (e la<br />
<strong>di</strong>pendenza <strong>di</strong>venta da quadratica a lineare). Si noti però che c’è l’effetto <strong>di</strong> substrato (body) molto<br />
forte! Abbiamo fatto una<br />
serie <strong>di</strong> approssimazioni.<br />
Si noti che la V scritta<br />
non è quella ai capi della<br />
capacità, che è invece<br />
Vdd-V. Per vedere cosa<br />
accade alla corrente <strong>di</strong><br />
carica nella capacità,<br />
prendo la caratteristica<br />
scritta, la traslo e la ribalto ottenendo la curva <strong>di</strong> figura.<br />
Calcoliamo ora il tempo <strong>di</strong> propagazione.<br />
La relazione della corrente scritta vale solo nel campo <strong>di</strong> nostro interesse (velocità saturata). Si<br />
noti che nella formula c’è la V che compare 2 volte quin<strong>di</strong> non è esattamente lineare. Trascurando<br />
Vsat, si ha che la corrente è pari all’espressione scritta sopra.<br />
Per avere il tempo <strong>di</strong> propagazione basso alto, cioè quando si verificano le transizioni:
Vout: 0 Vdd/2<br />
ovvero:<br />
V: Vdd Vdd/2<br />
L’equazione <strong>di</strong>fferenziale da integrare è:<br />
Nell’integrale assumo l’approssimazione come prima. Avremo:<br />
Da questa ottengo una stima per R’n, ponendo come al solito il tempo <strong>di</strong> propagazione pari a<br />
0.69RC.<br />
Conviene fare qualche piccola manipolazione/semplificazione: sviluppo in serie <strong>di</strong> taylor il termine<br />
col λ.<br />
Abbiamo trovato l’espressione per R’n, confrontiamola con l’espressione trovata per Rn.<br />
Confronto fra le Rn<br />
e
Facendo il rapporto:<br />
Se confronto ora le due espressioni trovate nei due casi, si ha che si somigliano molto,<br />
tranne che con un termine moltiplicativo. Il termine 2*logaritmo ci aspettiamo sia maggiore<br />
<strong>di</strong> 1 (perché la R’n deve essere maggiore <strong>di</strong> Rn). Si noti che la c’è la Vt.<br />
Se:<br />
Vt0<br />
si ha un caso limite<br />
VtVdd/2<br />
si ha che tende ad infinito!<br />
Quin<strong>di</strong>, la R’n può tendere all’infinito se Vt=Vdd/2!<br />
Questo lo si ha perché nel caso limite, Vdd-Vt è proprio Vdd-Vdd/2 = Vdd/2 e a questo<br />
valore la tensione ai capi della capacità raggiunge in un tempo infinito il valore limite!<br />
Terzo parametro: effetto <strong>dei</strong> tempi <strong>di</strong> salita/<strong>di</strong>scesa <strong>dei</strong> segnali <strong>di</strong> ingresso<br />
C’è un terzo ed ultimo parametro che dobbiamo considerare.<br />
Questo porta in conto un altro fenomeno che è la <strong>di</strong>pendenza<br />
<strong>dei</strong> tempi <strong>di</strong> propagazione del circuito dalla non idealità del<br />
segnale <strong>di</strong> ingresso. Se per es. esso non è a gra<strong>di</strong>no ma ha<br />
<strong>dei</strong> tempi <strong>di</strong> salita e <strong>di</strong> <strong>di</strong>scesa non nulli, questi influenzano il<br />
ritardo della nostra porta logica!<br />
Si noti che in questa simulazione cambio la pendenza del<br />
segnale <strong>di</strong> ingresso. Il ritardo sarà più grande quanto più il<br />
segnale <strong>di</strong> ingresso è lento. È importante avere una stima <strong>di</strong><br />
questo parametro (pendenza del segnale <strong>di</strong> ingresso), in<br />
entrambi i ritar<strong>di</strong>. Come possiamo modellare questo fenomeno? Analiticamente, è complicato.<br />
Usiamo delle tecniche euristiche, approssimate<br />
Il circuito <strong>di</strong> test per trovare questo parametro è quello in basso:<br />
Consideriamo il circuito <strong>di</strong> test fatto da due invertitori e<br />
concentriamoci sul secondo. Consideriamo il tempo <strong>di</strong><br />
propagazione alto basso <strong>di</strong> questo secondo invertitore. Il<br />
fenomeno appena visto ci <strong>di</strong>ce che questo tphl2 sarà funzione <strong>di</strong><br />
tr1 (tempo <strong>di</strong> salita del primo invert) e sarà maggiore <strong>di</strong><br />
tphl2ideale (ovvero il caso in cui l’ingresso è a gra<strong>di</strong>no). Di<br />
quanto sarà maggiore? Dipende da quanto è lento il segnale <strong>di</strong><br />
ingresso:<br />
tphl2=f(tr1).<br />
Nel caso in cui il tr1=0 (ovvero ideale),<br />
f(0) = tphl2(step).<br />
Inoltre, sappiamo che<br />
tphl2 > tphl2(step),<br />
quin<strong>di</strong> è crescente.<br />
Per calcolare tutto dovremmo conoscere il tempo <strong>di</strong> salita del segnale <strong>di</strong> ingresso, ma non<br />
sappiamo farlo. Però, il tempo <strong>di</strong> salita del primo invertitore sarà tanto più grande quanto più<br />
grande sarà il tempo <strong>di</strong> propagazione del circuito stesso. Questa analisi qualitativa ci <strong>di</strong>ce che<br />
possiamo pensare <strong>di</strong> esprimere:<br />
tphl2 = g(tplh1)<br />
e mettendo insieme tutto:<br />
tphl2= tphl2(step)*F(tplh1)
in cui:<br />
Avremo una relazione empirica:<br />
F(0) = 1 e F() crescente<br />
La forma <strong>di</strong>pende dal simulatore: nel nostro si usa questa scritta sopra.<br />
Il K è un parametro che si esprime come rapporto tra una resistenza statica e la resistenza del<br />
mos calcolata prima. Introduciamo quin<strong>di</strong> questa resistenza statica RSn.<br />
Così facendo, riusciamo a calcolare il tempo <strong>di</strong> propagazione del secondo sta<strong>di</strong>o in maniera<br />
semplice perché, conoscendo il tp dello sta<strong>di</strong>o precedente e prese le resistenze, calcolo tutto.<br />
L’unico parametro che ci serve quin<strong>di</strong> è la RSn.<br />
Si noti che per RSn non si ha una espressione approssimata, l’unico modo è <strong>di</strong> procedere per via<br />
simulativa. Si prende il circuito <strong>di</strong> figura, fissati C1 e C2 si simula, si calcolano i tempi <strong>di</strong><br />
propagazione, anche quelli ideali e dai valori ottenuti si calcola RSn dalla formula <strong>di</strong> figura. Il valore<br />
che ne viene fuori <strong>di</strong>penderà dai valori delle capacità che scelgo e dallo specifico circuito <strong>di</strong> test, in<br />
modo particolare <strong>di</strong>penderà dalle capacità: l’unica cosa che si può fare è fissare per C1 e C2 <strong>dei</strong><br />
valori tipici. Quello che si ottiene è una stima.<br />
In pratica, da una simulazione SPICE si determinano i vari tp.Si applica la relazione precedente<br />
per determinare RSn<br />
Il valore <strong>di</strong> Rsn <strong>di</strong>pende dai valori <strong>di</strong> C1 e C2 (il modello è empirico).<br />
Sommario sul modello switch-level<br />
Tre R per gli NMOS:<br />
Rn (NMOS come pull-down)<br />
R’n (NMOS come pull-up)<br />
RSn (effetto della non-idealità del segnale <strong>di</strong> ingresso)<br />
Tre R per i PMOS:<br />
Rp (PMOS come pull-up)<br />
R’p (NMOS come pull-down)<br />
RSp (effetto della non-idealità del segnale <strong>di</strong> ingresso)<br />
In conclusione ho 3 resistenze che portano in conto ciò che è scritto tra parentesi nella slide. Per il<br />
PMOS si hanno 3 resistenze duali che portano in conto i rispettivi effetti. La prima esercitazione<br />
sarà quella <strong>di</strong> simulare questi circuiti <strong>di</strong> test e valutare queste resistenze.
Esempio analisi switch-level<br />
.<br />
1) Calcolo delle capacità<br />
2) Calcolo delle resistenze<br />
Capacità <strong>di</strong> carico porta in conto<br />
l’interconnessione più la gate.<br />
L’ultimo sta<strong>di</strong>o rappresenta la nand a<br />
2 ingressi, per il mos pilotato<br />
specifico entrambe le resistenze e<br />
poi c’è la C <strong>di</strong> uscita.
3) Tempi <strong>di</strong> propagazione<br />
Calcoliamo ora i ritar<strong>di</strong>: 1 sta<strong>di</strong>o: faccio il<br />
prodotto della capacità <strong>di</strong> carico per la<br />
resistenza equivalente del <strong>di</strong>spositivo. Il<br />
prodotto è <strong>di</strong> 54.2 ps. Si ricor<strong>di</strong> che il tempo<br />
<strong>di</strong> propagazione è 0.69RC. Questo 0.69<br />
viene spesso incluso nella resistenza <strong>dei</strong><br />
<strong>di</strong>spositivi per evitare <strong>di</strong> portarselo <strong>di</strong>etro<br />
ogni volta: la R quin<strong>di</strong> include lo 0.69. Il<br />
ritardo è C*Rn (con Rn che include 0.69).<br />
questo valore non va mo<strong>di</strong>ficato perché il<br />
segnale <strong>di</strong> ingresso è un gra<strong>di</strong>no ideale!<br />
Per il 2 sta<strong>di</strong>o: dobbiamo<br />
tenere conto che l’ingresso<br />
ha un tempo <strong>di</strong> salita<br />
<strong>di</strong>verso da 0. Ci calcoliamo<br />
il ritardo nel caso in cui il<br />
segnale <strong>di</strong> ingresso è<br />
ideale, questo è<br />
semplicemente la somma<br />
delle resistenze per la<br />
capacità <strong>di</strong> carico (unica).<br />
24fF* 4K che dà 96ps.<br />
Questo ritardo è nel caso<br />
<strong>di</strong> ingresso a gra<strong>di</strong>no: in<br />
realtà ciò nn è vero, quin<strong>di</strong><br />
in realtà il ritardo sarà<br />
maggiore <strong>di</strong> questo. La<br />
formula empirica è quella<br />
in figura. Il fattore correttivo<br />
porta in conto il ritardo dello sta<strong>di</strong>o precedente e la costante <strong>di</strong> tempo (ve<strong>di</strong> bene). Si noti che se lo<br />
sta<strong>di</strong>o precedente fosse stato più lento (per es. perché la C era maggiore) avremmo avuto un<br />
ulteriore ritardo. Complessivamente il ritardo è 109.6ps.<br />
Infine il ritardo dell’ultimo sta<strong>di</strong>o:<br />
calcoliamo prima quello ideale e<br />
poi lo correggiamo. Questa volta<br />
il ritardo dello sta<strong>di</strong>o precedente è<br />
abbastanza grande quin<strong>di</strong> si avrà<br />
un fattore correttivo alto. Il ritardo<br />
complessivo ideale è 48ps. Il<br />
fattore correttivo qui è 20ps che si<br />
moltiplica per il ritardo<br />
precedente! Quin<strong>di</strong> si ha in totale<br />
66ps! Passa da 48 a 66ps e<br />
questo è dovuto al fatto che<br />
l’ingresso <strong>di</strong> questo sta<strong>di</strong>o varia<br />
molto lentamente! Abbiamo<br />
calcolato il ritardo complessivo
del circuito!! L’algoritmo utilizzato è efficace: Le R si calcolano facilmente, anche la capacità. Poi i<br />
vari ritar<strong>di</strong> si calcolano uno <strong>di</strong>etro l’altro!<br />
Nell’esercitazione calcoleremo queste resistenze e poi usiamo il simulatore in switch-level.<br />
Variabilità <strong>dei</strong> parametri<br />
Una cosa importante da sottolineare è la variabilità <strong>dei</strong> parametri. Quando facciamo un circuito<br />
integrato, i <strong>di</strong>spositivi che realizziamo non vengono sempre fuori allo stesso modo ma i parametri<br />
(Vt, K’ ecc) evidenziano delle variazioni <strong>di</strong> tipo casuale legate alle incertezze del processo<br />
costruttivo. Fondamentalmente si in<strong>di</strong>viduano 2 tipi <strong>di</strong> variabilità: quelle nei <strong>di</strong>spositivi che<br />
appartengono allo stesso chip (quin<strong>di</strong> due <strong>di</strong>spositivi che teoricamente dovevano essere identici)<br />
ma, seppur realizzati sulla stessa piastrina <strong>di</strong> silicio con le stesse caratteristiche W/L, in realtà non<br />
mostrano gli stessi parametri! Ci sono delle tolleranze che possono essere dell’or<strong>di</strong>ne dello 0.1%!<br />
(within <strong>di</strong>e)!<br />
Tra due <strong>di</strong>spositivi ottenuti in tempi <strong>di</strong>versi per esempio da due fette <strong>di</strong> silicio <strong>di</strong>verse, le variazioni<br />
sono ancora più gran<strong>di</strong> (variazioni DIE TO DIE)! Questo è evidente perché i due wafer sono stati<br />
processati in con<strong>di</strong>zioni <strong>di</strong> processo <strong>di</strong>fferenti!! Questo fatto crea <strong>dei</strong> problemi perché noi dobbiamo<br />
essere in grado <strong>di</strong> garantire che il circuito, il sistema funzioni correttamente nonostante tutte<br />
queste possibili variazioni, queste incertezze sui parametri <strong>dei</strong> <strong>di</strong>spositivi. Queste non riguardano<br />
solo i parametri <strong>dei</strong> <strong>di</strong>spositivi ma anche i parametri delle interconnessioni, quelli parassiti. Si<br />
sottolinea che con le tecnologie attuali le incertezze tendono a crescere man mano che la<br />
tecnologia progre<strong>di</strong>sce perché si tende a spingere tutto al limite. Oltre a queste incertezze legate al<br />
processo costruttivo, ci sono due parametri che ci danno delle variazioni che sono la temperatura<br />
(perché uno stesso circuito opera a temperatura sempre <strong>di</strong>fferente) e la Vdd perché nessun<br />
generatore <strong>di</strong> tensione è ideale e anche perché la tensione <strong>di</strong> alimentazione sul circuito non è<br />
costante ma è soggetta ad una serie <strong>di</strong> <strong>di</strong>sturbi. Quin<strong>di</strong>, si hanno 3 cose che danno luogo ad una<br />
variazione delle prestazioni del circuito:<br />
1) Processo tecnologico<br />
2) Temperatura<br />
3) Vdd<br />
Che si in<strong>di</strong>cano con PVT (Process, Voltage, temperature)<br />
Dovremo fare in modo da ridurre queste variazioni.<br />
a) Progetto per il caso peggiore: si va a realizzare il circuito in modo tale che sod<strong>di</strong>sfi le<br />
specifiche assegnate anche se i parametri cambiano in modo così sfortunato da andare<br />
tutti nel senso <strong>di</strong> peggiorare le prestazioni del circuito. Ci mettiamo quin<strong>di</strong> nel caso<br />
peggiore in cui tutto congiura in peggio e si progetta tutto. Vorremmo che nel 100% <strong>dei</strong><br />
casi il circuito funziona bene. Da un lato, questa tecnica permette <strong>di</strong> avere una resa<br />
massima ma dall’altro lato è facile immaginare che questo approccio dà luogo ad una<br />
progettazione conservativa: la maggior parte <strong>dei</strong> circuiti prodotti così sarebbero<br />
capaci <strong>di</strong> funzionare a prestazioni molto superiori! Questo in generale si traduce in uno<br />
spreco <strong>di</strong> area perché il circuito me<strong>di</strong>amente è sovra<strong>di</strong>mensionato!!<br />
Si osservi che non è così ovvio in<strong>di</strong>viduare il caso peggiore (la combinazione peggiore<br />
<strong>dei</strong> parametri) ovvero quale è la combinazione che dà luogo al caso peggiore.<br />
b) Progetto basato sull’analisi Montecarlo: si utilizzano delle tecniche statistiche che<br />
fanno in modo da avere una certa percentuale <strong>di</strong> <strong>di</strong>spositivi funzionanti (per es. 95%) e<br />
si accetta una piccola percentuale <strong>di</strong> <strong>di</strong>spositivi che non è in grado <strong>di</strong> operare nel caso<br />
più sfortunato <strong>dei</strong> parametri. L’utilizzo <strong>di</strong> queste tecniche ci darà una resa inferiore ma i<br />
circuiti che si ottengono sono più efficienti in termini <strong>di</strong> area occupata.<br />
Complessivamente si risparmia generalmente <strong>di</strong> più sull’area e si recupera questo 5%<br />
<strong>di</strong> <strong>di</strong>spositivi persi. Me<strong>di</strong>amente quin<strong>di</strong> in questo caso i <strong>di</strong>spositivi sono più efficienti. Il<br />
problema è che è molto complicato seguire questa strada, anche dal punto <strong>di</strong> vista<br />
computazionale. Per le memorie per esempio, la tecnica montecarlo è quella utilizzata<br />
perché una volta progettata la cella, ripeto tutto milioni <strong>di</strong> volte ed ottengo la memoria.<br />
Nel caso <strong>di</strong> microprocessori è molto <strong>di</strong>fficile. Questa tecnica si chiama Design for<br />
manifacturability.
Riportiamo un esempio <strong>di</strong> analisi Montecarlo.<br />
Si assegnano delle tolleranze, <strong>dei</strong> parametri alle<br />
grandezze, al circuito <strong>di</strong> partenza e si scelgono<br />
parametri in modo casuale (all’interno sempre<br />
<strong>di</strong> un range stabilito). Per esempio, per un mos<br />
possiamo definire che la Vt=0.8V +o- 10%, e<br />
viene utilizzata una determinata <strong>di</strong>stribuzione <strong>di</strong><br />
probabilità per i valori. Il simulatore determina<br />
numerose simulazioni per i vari parametri.<br />
Vengono effettuate numerosissime simulazioni.<br />
Vengono fuori n valori <strong>di</strong> tempi <strong>di</strong> propagazione:<br />
il ritardo <strong>di</strong> propagazione complessivo <strong>di</strong> questo circuito è una variabile aleatoria.<br />
Alla fine queste variabili hanno tutte una <strong>di</strong>stribuzione gaussiana. Se ne valuta il valore me<strong>di</strong>o e la<br />
deviazione standard. Si progetterà quin<strong>di</strong> il<br />
circuito affinché esso rispetti la specifica sul<br />
ritardo massimo. Ci saranno alcune istanze del<br />
circuito che non andranno bene (corrispondenti<br />
all’area sottesa alla gaussiana dopo il Ritardo<br />
Max) ma ne sappiamo a priori la percentuale!!<br />
Per avere statistiche abbastanza ragionevoli<br />
bisogna determinare migliaia <strong>di</strong> valori al<br />
simulatore. Se il circuito è piccolo ok, se è<br />
complicato il tempo è inaccettabile e quin<strong>di</strong><br />
questa tecnica si utilizza per porzioni <strong>di</strong> circuito o<br />
comunque per circuiti ripetitivi!<br />
L’altro approccio, ovvero il progetto nel caso peggiore, è pessimistico, spreca area ma è più<br />
semplice. Come si determina il caso peggiore?<br />
Si introduce il concetto <strong>di</strong> angoli <strong>di</strong> processo.<br />
Data la variabilità <strong>dei</strong> parametri <strong>di</strong> processo, quali valori utilizzare in fase <strong>di</strong> simulazione?<br />
Ogni parametro (K’, VT, _ ecc.) avrà una propria <strong>di</strong>stribuzione che possiamo semplificare con:<br />
un valore me<strong>di</strong>o<br />
un valore minimo<br />
un valore massimo<br />
Questi valori il costruttore li ottiene dalle statistiche sui <strong>di</strong>spositivi da lui realizzati. Noi fissiamo<br />
l’attenzione su due parametri: K’n e K’p.<br />
Si può realizzare un grafico dove si mettono il K’n e K’p sugli assi. Si evidenzia nel piano un<br />
rettangolo. Ogni <strong>di</strong>spositivo può occupare uno <strong>dei</strong> punti all’interno <strong>di</strong> questo rettangolo. I casi più<br />
critici corrispondono ai vertici <strong>di</strong> questo rettangolo! Gli angoli<br />
<strong>di</strong> processo prendono i nomi scritti in figura.<br />
Per un CMOS, il caso peggiore è quello slow n slow p. Se<br />
avessi un pezzo <strong>di</strong> circuito pseudo-nmos e ne voglio vare una<br />
analisi alla Vol, il caso più critico è quello in cui la Vol verrà<br />
più grande se l’nmos è venuto meno efficiente e il pmos è<br />
venuto più efficiente: slow-n fast-p!! Bisogna fare quin<strong>di</strong> più<br />
simulazioni a seconda del parametro che vogliamo estrarre.<br />
Per il caso peggiore della Vol faccio una simulazione con una<br />
determinata combinazione, per il ritardo peggiore ne faccio<br />
un’altra con l’altra determinata combinazione! In definitiva, alla fine <strong>dei</strong> conti quando si produce un<br />
circuito tutto si fa meno che considerare il caso nominale!
Oltre ai parametri relativi al caso nominale, il costruttore fornisce i parametri per i casi fast e slow<br />
I parametri sono quelli <strong>dei</strong> <strong>di</strong>spositivi (schede .MODEL) e quelli relativi ai parametri parassiti relativi<br />
alle interconnessioni<br />
Al progettista spetta il compito <strong>di</strong> determinare il set <strong>di</strong> parametri da adoperare in fase <strong>di</strong> design.<br />
Si devono considerare anche i casi peggiori per Temperatura e Tensione <strong>di</strong> Alimentazione.<br />
Noi, come esempio, simuleremo solo nel caso nominale. Si noti che quando si progetta un<br />
<strong>di</strong>spositivo, bisogna saper scegliere la scheda model più appropriata.
Interconnessioni<br />
Cap. 4: The Wire: pag. 136-159; 171-174<br />
appunti su: Elmore delay<br />
Cap. 9: Coping with interconnect:<br />
pag. 446-451; 463-474<br />
Le interconnessioni: su uno schema usiamo <strong>dei</strong> cortocircuiti, conduttori ideali che collegano le<br />
uscite <strong>di</strong> alcune porte agli ingressi <strong>di</strong> altre porte. In<br />
pratica, non si hanno <strong>dei</strong> corti ma ci sono <strong>dei</strong><br />
opportuni layers <strong>di</strong> metallo, poly ecc. Si deve stu<strong>di</strong>are<br />
l’effetto <strong>di</strong> queste interconnessioni sulle prestazioni<br />
del nostro sistema. Sud<strong>di</strong>vi<strong>di</strong>amo le interconnessioni<br />
a seconda <strong>dei</strong> segnali o <strong>dei</strong> compiti che hanno:<br />
a) De<strong>di</strong>cate alle alimentazioni (stu<strong>di</strong>o a parte<br />
per via <strong>di</strong> problematiche specifiche)<br />
b) De<strong>di</strong>cate ai segnali logici (le ve<strong>di</strong>amo ora): c’è un segnale con particolare importanza, il<br />
clock (segnale <strong>di</strong> temporizzazione che dà la cadenza a tutto il circuito). Se questo<br />
segnale arriva sfasato in vari punti del circuito, il tutto non funziona. Ci sono, oltre al<br />
clock, altri segnali critici.<br />
I layer utilizzati per fare le interconnessioni sono i livelli <strong>di</strong> metal (le tecnologie attuali danno a<br />
<strong>di</strong>sposizione numerosi livelli <strong>di</strong> metal per ridurre l’area occupata), il poly e le <strong>di</strong>ffusioni. Questi layer<br />
non hanno le stesse caratteristiche.<br />
Esempio: in questo caso abbiamo due morsetti A e B accessibili in metal1 e <strong>di</strong> dover collegare tra<br />
loro i due morsetti. In verticale corrono 3 linee, metal1, metal2<br />
e metal3 che non vogliamo interrompere. Per collegare questi<br />
due no<strong>di</strong> potrei pensare <strong>di</strong> passare in metal4 ma nulla vieta <strong>di</strong><br />
fare un collegamento passando sotto ai 3 livelli <strong>di</strong> metal usando<br />
o il poly o le <strong>di</strong>ffusioni.<br />
Esempio <strong>di</strong> collegamento in <strong>di</strong>ffusione e in poly visto in<br />
sezione (il metal3 sta in alto, non si vede)<br />
Si ricor<strong>di</strong> che il poly si fa crescere sull’ossido sottile se deve<br />
realizzare la gate <strong>di</strong> un mos o sull’ossido spesso quando deve<br />
fare da interconnessione. È del tutto lecito fare in questo<br />
modo.<br />
Le prestazioni che si avranno sono peggiori <strong>di</strong> quello che<br />
ci aspetteremmo! Si guar<strong>di</strong> però che il collegamento in poly<br />
può avere luogo all’interno delle celle standard in cui<br />
sappiamo ci si deve limitare ad utilizzare il metal1 e 2. Lì,<br />
non avendo a <strong>di</strong>sposizione altro materiale, si può usare il<br />
poly.
Questi elementi parassiti si modellano con R<br />
L e C, C e L mutue. Questo dà luogo ad una<br />
complessità spaventosa. Una prima<br />
semplificazione la si fa osservando che le L<br />
sono sempre trascurabili: L0.<br />
Ricorda: Stiamo parlando <strong>di</strong><br />
interconnessioni su segnali logici. In<br />
realtà, quando dobbiamo fare degli oscillatori<br />
(e quin<strong>di</strong> realizzare una induttanza) è<br />
complicato. Per quanto riguarda le<br />
resistenze, non è così semplice. In primo<br />
luogo, trascuriamo le R. Per i segnali più<br />
critici però, possiamo subito <strong>di</strong>re che la R non si può trascurare. Andremo a considerare un<br />
modello basato solo su capacità!<br />
NOTA: Nel vedere il clock o altre interconnessioni lunghe, avremo anche la R.<br />
Per le capacità, ci sono due classi: C che vanno a massa e C che collegano due linee a<strong>di</strong>acenti. I<br />
fenomeni che inducono sono <strong>di</strong>versi! Delle capacità che ci sono tra due linee a<strong>di</strong>acenti, ne vanno<br />
calcolate solo alcune quin<strong>di</strong> le C che non sono collegate verso massa sono calcolate solo nel caso<br />
<strong>di</strong> due linee fisicamente vicine tra loro.<br />
È importante sottolineare che i parametri parassiti delle interconnessioni:<br />
Diminuiscono l’affidabilità<br />
Incidono sulle performance e sulla potenza <strong>di</strong>ssipata<br />
Esistono tre classi <strong>di</strong> parametri parassiti:<br />
Capacitivi<br />
Resistivi<br />
Induttivi<br />
Capacità<br />
Consideriamo la capacità verso il substrato: si calcola considerando due componenti: da un lato<br />
pensiamo <strong>di</strong> considerare l’interconnessione e il substrato come un condensatore a facce piane e<br />
parallele, quin<strong>di</strong> calcoliamo la capacità come una capacità per unità <strong>di</strong> area moltiplicata per l’area<br />
della interconnessione. Questo modello è particolarmente semplificato ed andrebbe bene solo se<br />
le linee <strong>di</strong> campo andassero verticalmente. Nel nostro caso il sistema è <strong>di</strong> tipo tri<strong>di</strong>mensionale<br />
(ve<strong>di</strong> figura a) quin<strong>di</strong> la capacità sarà maggiore rispetto a quella in<strong>di</strong>cata dallo stu<strong>di</strong>o semplificato<br />
appena detto. Si adottano allora delle formule <strong>di</strong>fferenti: si somma un contributo alla<br />
C=epsilon*A/d=Ca*A=Ca*L*W. Il contributo da sommare a questa espressione <strong>di</strong>pende non<br />
dall’area ma dal perimetro della linea e la si scriverà come:<br />
Nel caso <strong>di</strong> interconnessione rettangolare si<br />
avrebbe:<br />
C=Ca*L*W+2Cp*(L+W).<br />
Ct=Ca*A+Cp*P<br />
I parametri Ca e Cp vengono forniti dal<br />
costruttore espressi rispettivamente in: fF/um 2<br />
e fF/um. Questi parametri <strong>di</strong>pendono dal<br />
materiale che stiamo utilizzando come<br />
interconnessione. Per esempio, la capacità<br />
perimetrale è legata a quanto sarà alta la<br />
nostra linea (più è spessa, maggiore sarà la<br />
capacità perimetrale). Si avranno comunque due parametri per ogni tipo <strong>di</strong> layer.
Il problema <strong>di</strong>venta più complesso perché dobbiamo<br />
vedere le capacità tra due linee a<strong>di</strong>acenti e due linee<br />
che si trovano una sopra ed una sotto (la foto è in<br />
sezione). Ci sono <strong>dei</strong> sw <strong>di</strong> estrazione automatica che<br />
determinano le capacità.<br />
Ci sono delle tabelle sono riportate le capacità per<br />
unità <strong>di</strong> area e <strong>di</strong> perimetro per i vari layer. Le<br />
capacità cambiano a seconda <strong>di</strong> quello che c’è sotto<br />
(field=substrato, active= sotto c’è un mos ecc)<br />
Oltre a queste capacità, vale la pena osservare che ci<br />
sono capacità <strong>di</strong> gate e <strong>di</strong> <strong>di</strong>ffusione <strong>dei</strong> MOS. La<br />
capacità <strong>di</strong> gate è quella data dall’area <strong>di</strong> gate per la<br />
capacità dell’ossido e non c’è quella perimetrale perché qui lo spessore è talmente sottile che<br />
questo contributo si trascura. Per le capacità delle <strong>di</strong>ffusioni invece ci sono entrambi i contributi,<br />
<strong>di</strong>versi a seconda se è un P o un N MOS.<br />
Riportiamo un esempio <strong>di</strong> calcolo <strong>di</strong> una capacità.<br />
Calcoliamo le varie<br />
componenti. Per la<br />
<strong>di</strong>ffusione n calcoliamo<br />
area e perimetro, poi si<br />
calcola la capacità<br />
dell’area e del perimetro. I<br />
due contributi sono<br />
confrontabili tra <strong>di</strong> loro. La<br />
capacità totale sarà<br />
ovviamente la somma.<br />
Passiamo al primo livello <strong>di</strong><br />
metal: calcolo l’area e il<br />
perimetro, poi le capacità dovuti ad i due contributi. La capacità perimetrale predomina su quella<br />
dovuta all’area. Si noti che quella che si ottiene è 1 or<strong>di</strong>ne <strong>di</strong> grandezza inferiore a quella ottenuta<br />
per la <strong>di</strong>ffusione N!Questo ci fa vedere che il primo livello <strong>di</strong> metal è un or<strong>di</strong>ne <strong>di</strong> grandezza<br />
migliore rispetto alla <strong>di</strong>ffusione. Si noti che il calcolo della capacità per il primo livello <strong>di</strong> metal è<br />
complicato perché devo tenere conto della tri<strong>di</strong>mensionalità del problema! La capacità ottenuta è<br />
grande o piccola?<br />
Un MOS piccolo ha una capacità <strong>di</strong> 0.69fF che è ¼ della capacità della interconnessione!! Quin<strong>di</strong><br />
la capacità dell’interconnessione è tutt’altro che trascurabile! Soprattutto col fatto che con<br />
l’avanzare della tecnologia queste capacità aumentano!<br />
Un altro esempio è:<br />
Abbiamo due linee <strong>di</strong> metal 4. Queste<br />
due linee possono far parte <strong>di</strong> un bus<br />
(non ci si spaventi <strong>di</strong> fronte ai 600λ). Il<br />
metal4 è lontano rispetto al substrato,<br />
quin<strong>di</strong> le capacità saranno piccole. I<br />
valori <strong>di</strong> area e perimetro sono molto<br />
più gran<strong>di</strong> <strong>di</strong> prima ma la capacità<br />
totale <strong>di</strong> una linea verso massa è<br />
rimasta dell’or<strong>di</strong>ne <strong>di</strong> 2 fF! Grazie<br />
all’utilizzo <strong>di</strong> questo livello <strong>di</strong> metal<br />
molto alto rispetto al substrato si<br />
riesce a contenere le capacità. Si noti<br />
che anche questa volta la capacità
perimetrale pesa molto <strong>di</strong> più rispetto a quella dell’area. Questa capacità è della linea verso<br />
massa. C’è però una capacità tra le due linee!! Questa capacità tra le due linee è ben più grande<br />
perché la <strong>di</strong>stanza tra loro 2 è minore e perché sono molto lunghe! Questa capacità è collegata a<br />
ponte tra i due morsetti. Questa capacità, non essendo collegata a massa, farà nascere altri effetti:<br />
può far si che una commutazione su uno <strong>dei</strong> due no<strong>di</strong> dà luogo ad una commutazione indesiderata<br />
sull’altra linea. Non ho semplicemente un ritardo ma un effetto <strong>di</strong> <strong>di</strong>sturbo.<br />
Questo problema <strong>di</strong> capacità tra due linee è tanto più grande quanto più si utilizza un livello <strong>di</strong><br />
metal elevato! Se avessi usato metal6 questo fenomeno sarebbe stato ancora più evidente perché<br />
le capacità verso massa si riducono sempre <strong>di</strong> più e la capacità tra le linee tende a crescere:<br />
CROSS TALK (INTERFERENZA INDESIDERATA TRA DUE LINEE ADIACENTI).<br />
Nella slide precedente abbiamo visto che la capacità tra due linee a<strong>di</strong>acenti può essere molto<br />
maggiore <strong>di</strong> quella verso massa. Si manifesta questa cosa quando si hanno <strong>dei</strong> bus. La Cxy che<br />
non va verso massa dà luogo a<br />
problemi <strong>di</strong> cross-talk.<br />
Ve<strong>di</strong>amo alcuni esempi <strong>di</strong> questi<br />
problemi.<br />
Facciamo l’ipotesi che una <strong>di</strong> queste<br />
due linee effettui una commutazione<br />
(schematizzata con un generatore <strong>di</strong><br />
tensione 0-1). Accade che la<br />
transizione sulla linea X produce un<br />
<strong>di</strong>sturbo sulla linea Y: la linea X è un<br />
aggressore e Y è aggre<strong>di</strong>to.<br />
Bisogna <strong>di</strong>stinguere due casi:<br />
a) la linea aggre<strong>di</strong>ta è flottante ovvero quando avviene il <strong>di</strong>sturbo non è pilotata da nessuna porta<br />
(che evidentemente sono in alta impedenza): è il caso <strong>di</strong> logiche <strong>di</strong>namiche o registri <strong>di</strong>namici;<br />
nella logica domino per esempio, quando il clock passa da 1 in fase <strong>di</strong> Valutazione, in un latch<br />
<strong>di</strong>namico invece quando il <strong>di</strong>spositivo è in fase <strong>di</strong> memorizzazione, infatti la capacità è flottante. (Si<br />
noti che quella <strong>di</strong> cui si è parlato è solo la capacità Y, la capacità X è quella relativa ad un’altra<br />
linea che passa nelle vicinanze <strong>di</strong> questa ma che fa tutt’altro).<br />
Applicando un gra<strong>di</strong>no alla linea X, in corrispondenza della<br />
transizione il potenziale del nodo X manifesta una analoga<br />
commutazione indesiderata per via del partitore capacitivo<br />
tra Cxy e Cy! Il deltaVy=Vx*Cxy/(Cxy+Cy). Se le capacità<br />
hanno stesso or<strong>di</strong>ne <strong>di</strong> grandezza, la commutazione<br />
indesiderata è alta! Ed è una situazione critica perché il<br />
potenziale sulla linea Y può assumere un livello logico<br />
prossimo alla regione proibita o ad<strong>di</strong>rittura cambiare stato<br />
(passa da 0 a 1 o viceversa). A causa <strong>di</strong> ciò si hanno errori<br />
logici molto <strong>di</strong>fficili anche da in<strong>di</strong>viduare e molto casuali! Per<br />
risolvere questo problema non c’è altra soluzione che tenere<br />
il rapporto Cxy/(Cxy+Cy) molto basso!! Ne <strong>di</strong>scende un<br />
risultato abbastanza rilevante: per questo tipo <strong>di</strong> circuiti, non è possibile utilizzare celle standard!<br />
NO CELLE STANDARD con place-route automatico perché in questo caso la realizzazione delle<br />
interconnessioni sopra le celle è una cosa fatta normalmente. Quin<strong>di</strong>, i circuiti <strong>di</strong>namici vengono<br />
realizzati e progettati a parte. Nell’approccio basato su celle standard non si utilizzano logiche<br />
<strong>di</strong>namiche e registri <strong>di</strong>namici! Questi circuiti vengono realizzati se si vogliono massime prestazioni<br />
ma con stu<strong>di</strong>o de<strong>di</strong>cato!<br />
b) il secondo caso è quello in cui il nodo aggre<strong>di</strong>to è pilotato da un altro circuito. In questa nuova<br />
situazione il modello ovviamente cambia. Il circuito che pilota la linea Y (il driver) viene<br />
schematizzato con una resistenza collegata a massa o all’alimentazione. Ovviamente abbiamo<br />
sempre la Cy. Per capire il <strong>di</strong>sturbo che si vede sulla linea Y in questo nuovo caso, bisogna<br />
introdurre il tempo <strong>di</strong> salita del segnale <strong>di</strong> ingresso sulla linea X. Nel caso idealizzato in cui c’è un<br />
gra<strong>di</strong>no, la variazione istantanea <strong>di</strong> tensione che si valuta sul nodo Y è uguale a quello che si<br />
aveva in precedenza! La costante <strong>di</strong> tempo sarà R*(Cy+Cxy). Il <strong>di</strong>sturbo quin<strong>di</strong> svanisce nel tempo
e svanisce tanto più rapidamente quanto più è forte il driver <strong>di</strong> Y. Se il segnale <strong>di</strong> ingresso non è a<br />
gra<strong>di</strong>no ma ha un tempo <strong>di</strong> salita maggiore, si ha che tende a ridursi anche l’ampiezza del <strong>di</strong>sturbo<br />
iniziale sulla linea Y. In sintesi, ho che posso fare sia la R grande, sia che la pendenza del segnale<br />
<strong>di</strong> ingresso non è elevatissima.<br />
Corollario: la resistenza <strong>dei</strong> MOS deve<br />
essere tenuta bassa per attenuare questo<br />
fenomeno (i mos infatti pilotano queste<br />
linee..): questo fa si che nelle celle<br />
standard non trovo mai <strong>di</strong>spositivi a<br />
<strong>di</strong>mensioni minime! Non trovo mai la W<br />
minima.<br />
Avere tempi <strong>di</strong> salita brevissimi e quin<strong>di</strong><br />
segnali velocissimi è vantaggioso in termini<br />
<strong>di</strong> tempi <strong>di</strong> propagazione ma è<br />
svantaggioso in questi termini appena visti.<br />
Devo allora:<br />
evitare no<strong>di</strong> flottanti,<br />
proteggere i no<strong>di</strong> sensibili,<br />
fare i tempi <strong>di</strong> salita e <strong>di</strong>scesi più gran<strong>di</strong> possibili,<br />
evitare <strong>di</strong> fare linee troppo lunghe accoppiate,<br />
usare delle linee o strati usati come schemo!<br />
In pratica, metto una linea collegata a massa<br />
tra le due linee accoppiate, quin<strong>di</strong> la capacità<br />
viene spostata e quella che era una capacità<br />
<strong>di</strong> cross t. <strong>di</strong>venta una capacità verso massa!<br />
Questo ovviamente ha un prezzo in termini <strong>di</strong><br />
area e <strong>di</strong> costi. Quando si hanno due linee<br />
sullo stesso layer utilizzo queste linee <strong>di</strong><br />
schermatura, se invece le linee si trovano su<br />
due livelli <strong>di</strong>versi, devo realizzare uno<br />
schermo posto in mezzo ai due layer! Per<br />
Esempio se la prima linea sta nel metal4,<br />
devo realizzare l’altra nel metal2 e nel metal3 realizzo lo schermo. Queste tecniche comunque<br />
NON riducono la capacità complessiva, anzi spesso la AUMENTANO ma la SPOSTANO. Queste<br />
tecniche vengono utilizzate quando si ha il problema <strong>di</strong> questi bus.<br />
Oltre alla nascita <strong>di</strong> questi <strong>di</strong>sturbi, le capacità tra linee a<strong>di</strong>acenti influenzeranno i ritar<strong>di</strong> del<br />
circuito. A causa <strong>di</strong> queste capacità il ritardo <strong>di</strong>venta poco<br />
facilmente pre<strong>di</strong>cibile perché <strong>di</strong>pende dall’attività del circuito.<br />
Supponiamo <strong>di</strong> avere questo bus. Ad un certo punto il bus<br />
commuta. Che succede ai ritar<strong>di</strong>? Abbiamo delle capacità <strong>di</strong> crosstalk<br />
per le quali si può avere una commutazione su entrambi i<br />
morsetti perché commutano tutte e 2 le linee tra cui è connessa.<br />
In pratica il ritardo aumenta se le linee vicine alla linea vittima<br />
commutano in <strong>di</strong>rezione opposta.<br />
L’effetto Miller fa si che:<br />
Entrambi i terminali del capacitore sono switchati in<br />
<strong>di</strong>rezione opposta (0→Vdd, Vdd→0)<br />
La tensione effettiva è raddoppiata ed è necessaria ulteriore<br />
carica.
Consideriamo 3 linee, e ve<strong>di</strong>amo un primo scenario: tutte e 3 le linee commutano nella stessa<br />
<strong>di</strong>rezione da 0 a 1. L’effetto <strong>di</strong><br />
questa capacità Cc è NULLO<br />
perché le tensioni ai due morsetti<br />
variano nello stesso modo e il<br />
DeltaV nel tempo è nullo! Quin<strong>di</strong>,<br />
il tempo <strong>di</strong> propagazione <strong>di</strong>pende<br />
solo dalla capacità della linea<br />
verso massa e del fan-out ovvero<br />
<strong>dei</strong> mos pilotati dalla linea.<br />
Tp = R Cg = Tpo<br />
Supponiamo ora che, <strong>dei</strong> tre segnali, il secondo e il terzo commutano mentre il primo no. Per la<br />
seconda capacità non ci sono problemi, è come se non ci fosse. La prima invece, ha un morsetto<br />
collegato alla prima linea che sta<br />
ad un potenziale fisso, quin<strong>di</strong> è<br />
come se stesse collegata a<br />
massa!! E allora questa capacità<br />
si somma a quella della linea e<br />
del fan-out. Il ritardo quin<strong>di</strong><br />
aumenta in base a quanto è<br />
grande la Cc rispetto alla Cg (che<br />
è somma della capacità della<br />
linea verso massa e della capacità del fan out). Il ritardo <strong>di</strong> questo invertitore quin<strong>di</strong> <strong>di</strong>pende anche<br />
da quello che fa la linea a<strong>di</strong>acente superiore!<br />
Tp = R (Cg + Cc) = R Cg (1 + Cc/Cg)<br />
Tp = Tpo (1+r); con: r = Cc/Cg<br />
Abbiamo visto che succede se tutte le linee commutano nello stesso verso e se due commutano<br />
ed una no. Ve<strong>di</strong>amo ora che succede in altri casi: ora, la linea centrale commuta da 1 a 0 in<br />
ingresso mentre le<br />
altre due<br />
commutano in modo<br />
opposto da 0 a 1. La<br />
prima capacità vede<br />
un deltaV doppio<br />
rispetto a prima!<br />
Perché un nodo sale<br />
<strong>di</strong> Vdd e l’altro<br />
scende <strong>di</strong> Vdd quin<strong>di</strong> ha un delta pari a 2Vdd!<br />
Stesso <strong>di</strong>scorso per la seconda capacità! Quin<strong>di</strong> si ha che l’invertitore che pilota la linea centrale<br />
vede una capacità che è 4 volte la Cc! Questo è quin<strong>di</strong> il caso peggiore. C’è comunque una<br />
incertezza sul ritardo perché si capisce bene che tutto <strong>di</strong>pende da cosa accade alla <strong>di</strong>namica.<br />
Dovremo fare in modo che tutto funzioni in ogni caso! Questo problema, qui accennato per il bus,<br />
lo ritroveremo quando vedremo la <strong>di</strong>stribuzione del clock che è, come sappiamo, la linea più critica<br />
del sistema. Se il clock arriva con un certo ritardo il sistema può fallire a causa <strong>di</strong> mancate<br />
sincronizzazioni! Bisogna quin<strong>di</strong> progettare il sistema in modo che anche se il clock non arriva<br />
esattamente nell’instante desiderato il sistema funziona correttamente.<br />
Tp = g Tpo<br />
(r è il rapporto tra la capacità verso GND e quella vicina).
Lo spessore è un parametro tecnologico e la<br />
resistività <strong>di</strong>pende da come è fatto il layer: il<br />
termine ro/h è quin<strong>di</strong> un parametro ed è la<br />
resistenza <strong>di</strong> strato.<br />
Resistenze<br />
Per il polisilicio ho due valori: infatti, si ha il silicide che<br />
è un metallo ed ha una resistenza molto inferiore. Si<br />
fanno queste configurazioni per ridurre le resistenze<br />
delle interconnessioni!<br />
Per i livelli <strong>di</strong> metal la resistenza <strong>di</strong> strato assume i<br />
valori minimi. Il metal5 ha uno spessore <strong>di</strong> 4volte maggiore rispetto al metal1, ecco perché si<br />
hanno quei valori <strong>di</strong>versi.<br />
Ve<strong>di</strong>amo come si calcola la resistenza.<br />
Altro esempio è:<br />
Come si calcola la resistenza? È semplice: si<br />
moltiplica la resistenza <strong>di</strong> strato per il numero <strong>di</strong><br />
quadrati dove il numero <strong>di</strong> quadrati è pari a N=L/W.<br />
Si noti che non è semplice in<strong>di</strong>viduare le varie<br />
resistenze perché, per esempio, il quadrato posto<br />
nello spigolo peserà meno <strong>di</strong> 1 perché la corrente<br />
fluirà tutta in prossimità dello spigolo interno. Si<br />
vedrà che una interconnessione <strong>di</strong> poly così breve<br />
sarà trascurabile.<br />
Linea molto lunga: 600 lambda. La<br />
resistenza viene pari a 800 ohm e non è<br />
trascurabile.<br />
Come si può ridurre l’effetto <strong>di</strong> queste resistenze?<br />
a) Approccio tecnologico: si utilizzano materiali migliori per le interconnessioni<br />
b) Riduco le <strong>di</strong>mensioni delle linee<br />
c) Utilizzo più livelli <strong>di</strong> interconnessione così da ridurre le <strong>di</strong>mensioni del circuito e <strong>di</strong><br />
conseguenza i collegamenti saranno più brevi e quin<strong>di</strong> meno resistenze.<br />
Con il progre<strong>di</strong>re della tecnologia, le <strong>di</strong>mensioni <strong>dei</strong> <strong>di</strong>spositivi si riducono <strong>di</strong> un fattore <strong>di</strong> scaling:<br />
x >1<br />
Le interconnessioni come sono influenzate dallo scaling?<br />
interconnessioni locali : lunghezza ridotta del fattore x, cioè vanno ridotte <strong>di</strong> pari passo
interconnessioni interme<strong>di</strong>e : lunghezza costante, cioè rimangono della loro lunghezza<br />
nonostante lo scaling<br />
interconnessioni globali : lunghezza accresciuta <strong>di</strong> un fattore y, nostante lo scaling,<br />
perché per esempio ci metto 6 core invece <strong>di</strong> 2 e il processore è globalmente più grande,<br />
oppure ci metto più memoria, etc.<br />
Cosa accade ai ritar<strong>di</strong>?<br />
Immaginiamo che la W, la L e la H scalino con la tecnologia: tutte interconnessioni scalano<br />
Se scala solo L: altra situazione<br />
Se ora calcolo la Resistenza nel primo caso (W L ed H scalano insieme) la resistenza aumenta <strong>di</strong><br />
x per le interconnessioni locali, per le interme<strong>di</strong>e aumenta <strong>di</strong> un fattore x^2 e <strong>di</strong> x^2*y nel caso <strong>di</strong><br />
interconnessione globale!<br />
Ve<strong>di</strong>amo le Capacità considerando solo quella per unità <strong>di</strong> area (con Area =W*L/t). Con il<br />
progre<strong>di</strong>re della tecnologia quin<strong>di</strong> <strong>di</strong>minuisco le capacità ma aumento la resistenza. Quin<strong>di</strong>, il<br />
prodotto R*C NON varia per le interconnessioni locali, aumenta <strong>di</strong> x^2 per le interme<strong>di</strong>e e <strong>di</strong> x^2*y<br />
nel caso <strong>di</strong> interconnessioni globali!<br />
Per porre rime<strong>di</strong>o a questo problema si può non effettuare lo scaling dello spessore della linea: H<br />
invariata. La R migliora <strong>di</strong> un fattore x ed aumenta <strong>di</strong> meno nel caso <strong>di</strong> interconnessioni interme<strong>di</strong>e<br />
e globali. La capacità in prima approssimazione resta invariata, ma se considero la capacità<br />
perimetrale che in queste formule ho trascurato mi rendo conto che non è proprio vero. E allora,<br />
può essere una soluzione quella <strong>di</strong> non scalare l’altezza della linea. Si noti però che la capacità <strong>di</strong><br />
cross-t. tra due linee a<strong>di</strong>acenti aumenterà proporzionalmente al fattore H, inoltre ho un problema<br />
tecnologico perché non è semplice fare una cosa <strong>di</strong> questo tipo! E allora, tutto ciò si traduce in<br />
regole <strong>di</strong> layout restrittive, nel senso che la regola <strong>di</strong> separazione minima tra due linee peggiora: se<br />
prima potevo fare due linee <strong>di</strong> metal <strong>di</strong>stanti solo 3 lambda, col progre<strong>di</strong>re della tecnologia il<br />
lambda <strong>di</strong>venta 5 e seppure il lambda si è ridotto, può essere che in valore assoluto resta invariato,<br />
ma sicuramente non riesco a ridurlo.<br />
Posso allora fare che per alcuni livelli <strong>di</strong> interconnessione riduco H, mentre per altri livelli <strong>di</strong> metal<br />
H lo faccio uguale in modo da sfruttare la minore resistenza. In pratica si mantiene H costante solo<br />
per i livelli <strong>di</strong> metal superiori de<strong>di</strong>cato alle interconnessioni più lunghe in cui la R pesa molto.<br />
In generale se non si riduce H:<br />
aumentano le capacità <strong>di</strong> crosstalk<br />
le capacità perimetrali assumono un peso ancora maggiore.<br />
Si mantiene costante il valore <strong>di</strong> H soltanto per i livelli <strong>di</strong> metal superiore (ad esempio,<br />
metal4 e metal5) de<strong>di</strong>cati alle interconnessioni globali.<br />
Questi livelli <strong>di</strong> metal sono caratterizzati da:<br />
resistenze <strong>di</strong> strato inferiori<br />
maggori capacità intra-wire<br />
regole <strong>di</strong> progetto meno aggressive per quanto riguarda <strong>di</strong>mensioni minime e separazione<br />
minima.<br />
Ora sappiamo come calcolare le R e le C: come possiamo sfruttare queste informazioni per<br />
valutare i ritar<strong>di</strong>.<br />
Supponiamo <strong>di</strong> avere due porte logiche. Un approccio <strong>di</strong> livello 0 non considera nulla. Un<br />
approccio <strong>di</strong> livello 1 considera solo le capacità <strong>di</strong> interconnessione concentrate. Un modello più<br />
accurato porta in conto anche la resistenza delle interconnessioni. Il modello migliore ovviamente<br />
considera che la linea è a parametri<br />
<strong>di</strong>stribuiti. La scelta del modello va fatta in<br />
base al grado <strong>di</strong> approssimazione che si<br />
vuole avere. Come si calcolano i ritar<strong>di</strong> in<br />
un sistema RC?
Abbiamo già richiamato in passato il metodo delle<br />
costanti <strong>di</strong> tempo. Noi abbiamo ora un sistema in<br />
cui ci sono delle resistenze che collegano i vari<br />
no<strong>di</strong> e delle capacità verso massa che assumiamo<br />
all’inizio tutte cariche a Vdd. Supponiamo <strong>di</strong> avere<br />
un solo ingresso che commuta da 1 a 0. A regime,<br />
tutte le capacità andranno a 0. Ma con quale<br />
legge? E come posso approssimare la <strong>di</strong>namica<br />
completa con una sola costante <strong>di</strong> tempo?<br />
Per trovare la risposta usiamo la tecnica Elmore<br />
Delay.<br />
Valutiamo la <strong>di</strong>namica <strong>di</strong> questo sistema. Introduciamo le correnti nei condensatori. Ve<strong>di</strong>amo poi le<br />
tensioni sui no<strong>di</strong> considerando che l’ingresso ha già effettuato la commutazione da 1 a 0.<br />
Applichiamo il principio della sovrapposizione e calcoliamo il potenziale V3.<br />
che può essere riscritta in termini delle Rkj:<br />
Per calcolare una generica Rkj effettuo la seguente procedura:<br />
Elimino i condensatori<br />
Sostituisco il generatore <strong>di</strong> ingresso con un cortocircuito<br />
Considerano i due cammini: (dal nodo k a massa); (dal<br />
nodo j a massa)<br />
La Rkj è la somma delle resistenze comuni a i due<br />
cammini.<br />
Ovviamente queste resistenze sono simmetriche rispetto ai pe<strong>di</strong>ci<br />
k e j.<br />
Abbiamo quin<strong>di</strong>:<br />
Considero solo la I1 eliminando le altre capacità: la I1 va<br />
solo in R1 e in R3 non circola nulla quin<strong>di</strong> V3=V1=R1*I1.<br />
Facendo <strong>di</strong>scorsi analoghi per le altre correnti e<br />
sommando i vari contributi si ottiene l’espressione:<br />
L’espressione <strong>di</strong> Vj è un sistema <strong>di</strong> equazioni <strong>di</strong>fferenziali, esatto, ottenuto senza approssimazioni.<br />
C’è una matrice <strong>di</strong> RC, ovvero <strong>di</strong> costanti <strong>di</strong> tempo. Noi cerchiamo una soluzione approssimata che<br />
per definiziona dà luogo ad un errore ma che mi permette <strong>di</strong> esprimere la <strong>di</strong>namica in funzione <strong>di</strong><br />
una sola costante <strong>di</strong> tempo. L’approssimazione è sulle derivate, ovvero assumiamo che le derivate<br />
delle tensioni sui no<strong>di</strong> sono proporzionali:<br />
le costanti alfa sono incognite. Se applichiamo questa ipotesi, la Vj scritta prima <strong>di</strong>venta:
Con questa approssimazione la tensione sul nodo j non <strong>di</strong>pende dalla tensione degli altri no<strong>di</strong> e<br />
<strong>di</strong>pende da una sola costante <strong>di</strong> tempo. Queste costanti alfa le otteniamo cercando <strong>di</strong> minimizzare<br />
l’errore: Q.<br />
Come otteniamo le costanti αkj?<br />
Valuto l’errore che mi da l’approssimazione che ho appena fatto per ottenere l’equazione<br />
approssimata <strong>di</strong> Vj.<br />
L’errore è ovviamente la <strong>di</strong>fferenza della formula esatta e <strong>di</strong> quella approssimata.<br />
Quest’errore è funzione del tempo, io voglio renderlo piccolo e allora rendo piccolo quello me<strong>di</strong>o<br />
ovvero si sceglieranno delle costanti in modo tale che l’errore me<strong>di</strong>amente sarà nullo:<br />
Quin<strong>di</strong> dobbiamo scegliere le αkj in modo tale da annullare l’errore me<strong>di</strong>o. Svolgiamo l’integrale.<br />
Vj e Vk a 0 e all’infinito è semplice calcolarli: all’infinito tutti i no<strong>di</strong> si sono scaricati quin<strong>di</strong> Vj e Vk<br />
all’infinito valgono 0. All’istante 0 invece valgono proprio Vdd. Impongo la seconda parentesi tonda<br />
pari a 0 così da avere errore me<strong>di</strong>o nullo.<br />
Questa cosa si fa imponendo αkj=1 poiché Vj(0) e Vk(0) sono Vdd.<br />
Quin<strong>di</strong> Emean si annulla per:<br />
αkj=1<br />
e otteniamo:<br />
In definitiva questa tecnica ci <strong>di</strong>ce che la <strong>di</strong>namica è retta da un sistema <strong>di</strong> equazioni <strong>di</strong>fferenziali<br />
del primo or<strong>di</strong>ne. Questa <strong>di</strong>namica si approssima con una singola costante <strong>di</strong> tempo calcolabile<br />
con l’espressione appena scritta. L’errore me<strong>di</strong>o così facendo sarà nullo e abbiamo visto come si<br />
calcolano queste Rkj.<br />
Per calcolare la costante <strong>di</strong> tempo si considera<br />
una generica capacità e la si moltiplica per la<br />
resistenza Rkj che è quella comune ai due<br />
cammini. Si sommano i contributi e si ottiene la<br />
costante <strong>di</strong> tempo equivalente.<br />
Ve<strong>di</strong>amo qualche esempio <strong>di</strong> Elmore Delay.<br />
Caso idealizzato in cui una linea è pilotata da un generatore ideale <strong>di</strong> tensione<br />
ed è aperta all’altro estremo.<br />
Presa una linea, la si può scomporre in tanti ΔL caratterizzata da una R e una<br />
capacità verso massa a SX e a DX, ovvero abbiamo una linea a parametri<br />
<strong>di</strong>stribuiti (R e C per unità <strong>di</strong> lunghezza). Il caso più semplice è quello in cui la
linea è pilotata a sinistra da un <strong>di</strong>spositivo attivo. Il ritardo è in questo caso intrinseco. Nel caso<br />
ideale inoltre consideriamo che la R del generatore tenda a 0 e che la C del carico finale della linea<br />
tenda ad infinito.<br />
Decomponiamo la linea in tanti pezzettini ΔL, ognuno caratterizzato da c e r che sono resistenza e<br />
capacità per unità <strong>di</strong> lunghezza. Ovviamente, più è fitta la <strong>di</strong>scretizzazione più ci si avvicina al caso<br />
reale.<br />
Per valutare questo ritardo utilizziamo la tecnica<br />
Elmore Delay: inizialmente le capacità sono tutte<br />
allo stesso valore, e poi sono tutte C verso massa.<br />
Ricordando che la costante <strong>di</strong> tempo equivalente è<br />
pari alla sommatoria <strong>di</strong>: RkjCk, dobbiamo<br />
considerare tutte le capacità.<br />
Partiamo dall’ultima capacità e valutiamo i due cammini: quello che unisce il nodo <strong>di</strong> uscita con<br />
massa e il nodo della capacità verso massa (nota che la massa si trova dove c’è Vin). Partendo<br />
dall’ultima, la C è CΔL e i due cammini sono identici: la R da considerare è n*r ΔL con n=numero<br />
<strong>di</strong> pezzettini.<br />
Consideriamo ora la capacità n-1 esima (nel <strong>di</strong>segno non è riportata): le capacità hanno tutte lo<br />
stesso valore quin<strong>di</strong> la C è uguale al caso <strong>di</strong> prima, per valutare la R poi devo considerare i due<br />
cammini: il primo che porta questo nodo a massa e l’altro che collega l’uscita verso massa. La R<br />
comune è pari a (n-1)*r ΔL. Questo <strong>di</strong>scorso si ripete per tutte le capacità <strong>di</strong>stribuite presenti nel<br />
circuito e la sommatoria <strong>di</strong> questi contributi restituisce la costante <strong>di</strong> tempo.<br />
Questa è ovviamente la costante <strong>di</strong> tempo equivalente relativa all’uscita. Si noti poi che n è molto<br />
maggiore <strong>di</strong> 1, quin<strong>di</strong> si può scrivere come<br />
dove ncΔL è la capacità totale della linea e nr ΔL è la resistenza totale della linea. Quin<strong>di</strong>, la<br />
costante <strong>di</strong> tempo è sostanzialmente il 50% <strong>di</strong> RC della linea! È ovviamente un termine<br />
approssimato<br />
Si può quin<strong>di</strong> riportare la nostra linea ad un modello equivalente come in<br />
figura.<br />
Questo modello è a T ed è simmetrico tra ingresso e uscita.<br />
E si ottiene una costante <strong>di</strong> tempo pari a:<br />
Si faccia attenzione che questo modello semplificato vale per la <strong>di</strong>namica dell’uscita rispetto<br />
all’ingresso: se invece volessimo sapere il ritardo a metà della linea piuttosto che alla fine della<br />
linea, dovremmo riapplicare tutto il <strong>di</strong>scorso fatto per ottenere questa t. In dettaglio, bisogna<br />
considerare sia l’effetto delle capacità che stanno a sinistra sia quelle che stanno a destra. Tutte le<br />
capacità che stanno a destra dell’uscita considerata, hanno in comune con l’uscita solo le R che<br />
stanno a sinistra dell’uscita, quin<strong>di</strong> il contributo alla tau che danno è pari a CΔLRt/2, e saranno<br />
n/2 termini. Per le capacità che si trovano a sinistra dell’uscita invece, si ha che il contributo totale<br />
viene ½*Rt/2*Ct/2. Questo ovviamente è sempre frutto <strong>di</strong> una tecnica approssimata:<br />
l’approssimazione più evidente la si vede (in questo caso) nei termini che si trovano a destra<br />
dell’uscita considerata che vengono riportate in uscita 1 a 1.
Consideriamo come questo ritardo <strong>di</strong>pende dalle caratteristiche fisiche della nostra linea: la linea<br />
ha una resistenza <strong>di</strong> strato ρ 2 e una corrispondente resistenza totale pari a ρ 2 *L/W. Avrà poi una<br />
capacità data dalla capacità perimetrale e da quella col substrato.<br />
da cui si ottiene:<br />
Nell’ultima formula, ultimo passaggio in parentesi (tranne l’1) si ha l’aumento della capacità dovuto<br />
alla capacità perimetrale.<br />
Risultati: la costante <strong>di</strong> tempo va col quadrato della lunghezza, questo perché la sia la resistenza<br />
che la capacità raddoppiano con la L. Una cosa meno ovvia è che questo ritardo cresce al<br />
decrescere <strong>di</strong> W: questo è dovuto alla capacità perimetrale, se questa non ci fosse il ritardo<br />
sarebbe in<strong>di</strong>pendente da W (perché la C si <strong>di</strong>mezza e la R si raddoppia quin<strong>di</strong> gli effetti si<br />
compenserebbero). Si tenga presente che questo risultato è un ritardo intrinseco ovvero calcolato<br />
in assenza <strong>di</strong> carico! Nessuna linea si troverà mai in questa situazione.<br />
Analizziamo un altro caso.<br />
Questo caso è quello più realistico, ovvero si ha una porta logica<br />
che pilota una linea e un fan out, rappresentato da un invertitore.<br />
Ora si può analizzare il tutto molto facilmente: al posto del driver<br />
si mette la sua resistenza equivalente Rn, poi la linea si<br />
schematizza col modello a T, poi il carico che si schematizza<br />
come una capacità. La seconda figura rappresenta quin<strong>di</strong> il<br />
circuito equivalente per la determinazione del ritardo, della tau<br />
equivalente. Questo modello ovviamente è valido per calcolare il<br />
ritardo dal driver fino al carico (dove c’è scritto Vout). Calcoliamo<br />
la costante <strong>di</strong> tempo dell’uscita: la CG vede come resistenza la<br />
somma <strong>di</strong> Rn e 2 Rt/2, poi c’è il contributo della Ct che vede la<br />
serie delle sole prime due resistenze. Si può quin<strong>di</strong> stimare il<br />
ritardo in maniera abbastanza finale.<br />
Se si normalizza rispetto alla tau che si avrebbe senza l’interconnessione (RnCg) si ha<br />
l’espressione:<br />
Quin<strong>di</strong>, in definitiva il ritardo è “quello che si avrebbe senza l’interconnessione più qualcos’altro che<br />
<strong>di</strong>pende dall’interconnessione e dai suoi parametri”.<br />
Ve<strong>di</strong>amo quali sono i casi possibili:<br />
Nel modello <strong>di</strong> or<strong>di</strong>ne 0 trascuriamo l’interconnessione: ciò si può<br />
fare quando i termini in parentesi sono minori dell’unità: Ct
Modello <strong>di</strong> or<strong>di</strong>ne 1: Spesso queste due con<strong>di</strong>zioni non sono<br />
verificate, in particolare la con<strong>di</strong>zione sulle capacità. Quella sulle<br />
resistenze invece si verifica. Se è vero ciò, possiamo trascurare il<br />
terzo e il quarto termine in parentesi. Quin<strong>di</strong> la tau equivalente si scriverà come:<br />
In sostanza la mia linea <strong>di</strong>venta una capacità.<br />
Modello <strong>di</strong> or<strong>di</strong>ne 2: in questo caso non si possono<br />
trascurare nemmeno i termini resistivi, quin<strong>di</strong> va portato in<br />
conto un modello per l’interconnessione con R e C.<br />
Avremo quin<strong>di</strong> un espressione della costante <strong>di</strong> tempo pari a:<br />
Nella stragrande maggioranza <strong>dei</strong> casi comunque va bene il modello <strong>di</strong> or<strong>di</strong>ne 1, non è però<br />
sempre così.<br />
Ripetitori<br />
Abbiamo visto che il ritardo intrinseco tende a crescere col quadrato della lunghezza. Questa<br />
tecnica riduce il ritardo spezzando la linea (per esempio a metà) ed introducendo nel centro un<br />
invertitore che prende il nome <strong>di</strong> repeater. Questa tecnica si utilizza nel caso <strong>di</strong> linee<br />
estremamente lunghe.<br />
Calcoliamo il ritardo che si ottiene con una linea in metal1 estremamente lunga (1.2cm). Si hanno<br />
10 4 quadrati con una resistenza <strong>di</strong> 1Kohm. La capacità <strong>di</strong>venta in questo caso <strong>di</strong> 1.39pF.<br />
Supponiamo che il driver abbia una resistenza <strong>di</strong> 100 ohm e che ci sia una capacità <strong>di</strong> fF. In<br />
queste con<strong>di</strong>zioni, la tau viene estremamente elevata.<br />
Ve<strong>di</strong>amo la prima soluzione:<br />
Primo approccio: <strong>di</strong>vido la linea a metà e ci metto l’invertitore in<br />
mezzo. In questo caso ognuna delle due linee darà luogo ad<br />
un ritardo pari alla metà <strong>di</strong> prima ma l’invertitore a sua volta<br />
introduce un ritardo pari al suo ritardo <strong>di</strong> propagazione.
Ve<strong>di</strong>amo se questo ritardo introdotto è comunque minore del caso precedente.<br />
Si vede che c’è un 2 davanti a tutto perché sono 2 sta<strong>di</strong> uguali e c’è un fratto2 perché le capacità<br />
sono pari alla metà. Il ritardo è inferiore a prima.<br />
Sud<strong>di</strong>videndo la linea invece in K parti uguali si ha questa nuova formula. In parentesi c’è un<br />
termine che cresce con K (perché introduco<br />
K invertitori) e un termine che decresce con<br />
K (perché spezzo la linea).<br />
Per capire quale K sia meglio fissare, faccio la derivata.<br />
La K ottima calcolata, sostituita nella formula del ritardo, restituisce il ritardo minimo. Si noti che<br />
all’ottimo i due contributi in parentesi si eguagliano.
Nel caso che stavamo osservando, con K pari a 19 il ritardo passa da 856ps (senza repeaters) a<br />
234ps. Si noti che la gran parte del vantaggio si ha già <strong>di</strong>videndo poche volte la linea, non c’è<br />
bisogno <strong>di</strong> arrivare a 19 (bastano 2-3-4).<br />
Osservazioni<br />
La costante <strong>di</strong> tempo trovata è:<br />
In generale bisogna:<br />
Utilizzare il modello più semplice possibile, compatibilmente con la precisione richiesta<br />
Le C hanno un ruolo fondamentale e non possono quasi mai essere trascurate<br />
Le R entrano in gioco quando sono <strong>di</strong> valore confrontabile con quella del driver<br />
(interconnessioni globali)<br />
Caso particolare: <strong>di</strong>stribuzione del clock: le R sono FONDAMENTALI (un ritardo sul clock,<br />
che sincronizza il funzionamento del sistema, può causare errori <strong>di</strong> timing)<br />
Per la <strong>di</strong>stribuzione del clock, anche un piccolo ritardo lungo la linea ci può dare fasti<strong>di</strong>o.
Distribuzione delle Alimentazioni<br />
Le alimentazioni vengono <strong>di</strong>stribuite me<strong>di</strong>ante una interconnessione. Per questa abbiamo <strong>dei</strong><br />
problemi <strong>di</strong>versi, non ci sono ritar<strong>di</strong> <strong>di</strong> commutazione.<br />
In generale, il problema che si ha se c’è rumore (o<br />
<strong>dei</strong> <strong>di</strong>sturbi in generale) è questo: sul circuito a<br />
sinistra supponiamo ci sia esattamente la Vdd e la<br />
massa. A destra c’è una porta logica collegata alla<br />
Vdd con delle interconnessioni schematizzate con<br />
delle resistenze, ma non è detto che siano<br />
resistenze. Nelle interconnessioni ci sarà una<br />
certa corrente che sarà tutt’altro che costante. In<br />
prima approssimazione, la corrente nella R<br />
provoca una caduta e quin<strong>di</strong> l’invertitore <strong>di</strong> destra vede una tensione massima pari a Vdd-DeltaV<br />
mentre la tensione minima sarà deltaV quin<strong>di</strong> l’escursione <strong>di</strong> questo invertitore va da Vdd-deltaV a<br />
deltaV e può succedere che si va a finire nella regione proibita! Il caso critico è quello in cui la<br />
porta <strong>di</strong> destra pilota un circuito <strong>di</strong>namico: se il deltaV è superiore alla soglia, accende il mos e<br />
scarica la C.<br />
Questa <strong>di</strong>stribuzione è strettamente legata a come è organizzato un chip.<br />
Un chip è sud<strong>di</strong>viso in aree: la parte periferica esterna è de<strong>di</strong>cata ai terminali <strong>di</strong> ingresso è uscita.<br />
Questi terminali alcuni sono collegati<br />
all’alimentazione, altri includono i buffer che<br />
pilotano l’uscita o gli sta<strong>di</strong> <strong>di</strong> ingresso che<br />
prendono il segnale dall’esterno e lo inviano<br />
al nucleo elaborativo (core). L’area<br />
complessiva del chip è spesso limitata dal<br />
numero <strong>di</strong> pad per cui l’area finisce per<br />
essere limitata dal fatto che ci sono molti<br />
pad. In altri casi (foto <strong>di</strong> destra) l’area è limitata dal core.<br />
I problemi che si hanno sulle alimentazioni è la cosiddetta migrazione metallica o<br />
elettromigrazione. In foto c’è una pista che si è rotta per via <strong>di</strong> questo effetto. Se la J è troppo forte<br />
(J=densità <strong>di</strong> corrente), col passare del tempo i grani metallici si allontanano dalle zone strette e la<br />
sezione tende a ridursi ancora <strong>di</strong> più, la J<br />
aumenta ancora e così via fino a quando la<br />
pista metallica non si apre. Nel caso delle<br />
linee dell’alimentazione, la corrente non è<br />
costante. Allora consideriamo il suo valore<br />
me<strong>di</strong>o e la potenza è C*Vcc 2 f. L’unico<br />
parametro che abbiamo è la W: il costruttore<br />
ci <strong>di</strong>ce che la nostra linea sarà esente da<br />
questo effetto se la densità <strong>di</strong> corrente è<br />
sufficientemente bassa (1 mA/um), ovvero<br />
se per esempio hai una interconnessione<br />
larga W=1um, non si rompe se ci fai passare max 1mA . Ora, se P=VccI, I=P/Vcc da cui ricavo W.<br />
Facciamo un esempio: P=1W, Vdd=1V, I=1A. La W sarà = 1000um. È una W abbastanza grande.<br />
Si noti che le tecnologie attuali lavorano a basse tensioni <strong>di</strong> alimentazione e se le potenze in gioco<br />
sono pressoché costanti, la corrente tende ad aumentare e quin<strong>di</strong> le W devono essere gran<strong>di</strong>.<br />
Se conosciamo la R della linea e la I che deve circolare nell’interconnessione, il ΔV lo conosciamo<br />
imme<strong>di</strong>atamente come R*I. Fortunatamente, facendo le linee gran<strong>di</strong> la R è piccola e il ΔV è<br />
accettabile. In questo esempio si ha che la zona critica è al centro, ovvero nella zona più lontana<br />
dal bordo e cioè dove la linea ha lunghezza maggiore. In generale, la caduta resistiva non è un<br />
grosso problema.
I grossi problemi nascono dalle L in serie alle alimentazioni. Queste L ci<br />
danno fasti<strong>di</strong>o perché la caduata va con la derivata della corrente,<br />
quin<strong>di</strong> anche se il valore della I non è molto grosso ma questa varia<br />
velocemente, si hanno effetti pesanti. Dove sono queste L? Se<br />
rimaniamo sul silicio, le L sono trascurabili. Quelle che danno fasti<strong>di</strong>o<br />
nascono quando colleghiamo il chip col<br />
package.<br />
Nel caso <strong>di</strong> package DIL, l’induttanza<br />
sta nella bon<strong>di</strong>ng wire, ovvero nelle<br />
linee <strong>di</strong> collegamento che si fanno per<br />
collegare il chip con l’esterno! Inoltre<br />
queste L variano al variare della<br />
lunghezza <strong>di</strong> questo filo.<br />
Ci sono altri package che cercano <strong>di</strong><br />
ridurre questo effetto ma ci sono comunque problemi. Ci sono tecniche più efficienti che sono state<br />
sviluppate per ridurre questi effetti! Non si riescono ad azzerare gli effetti induttivi.<br />
Ve<strong>di</strong>amo come queste L determinano <strong>dei</strong> <strong>di</strong>sturbi: considerando il circuito a) , carichiamo la<br />
capacità attraverso l’induttanza. Avremo<br />
un <strong>di</strong>sturbo ΔV, stimiamolo (in via del<br />
tutto approssimata). Ipotizziamo che la<br />
tensione <strong>di</strong> uscita abbia una forma<br />
predeterminata, ovvero rappresentabile<br />
me<strong>di</strong>ante due archi <strong>di</strong> parabola.<br />
L’approssimazione è arbitraria e ci<br />
semplifica i calcoli. In questa<br />
approssimazione entra in gioco il<br />
parametro tr necessario per effettuare la<br />
transizione completa. Nel primo intervallo<br />
e nel secondo intervallo la Vo(t) sarà<br />
come in slide. Ovviamente, sono scritte<br />
così perché vogliamo che al termine del<br />
transitorio la tensione <strong>di</strong> uscita raggiunga<br />
la V <strong>di</strong> alimentazione. Il parametro a si<br />
sceglie facendo in modo che le due funzioni nel punto tr/2 siano uguali..<br />
Una volta scritta la tensione <strong>di</strong> uscita, si può scrivere la corrente che è quella che carica la capacità<br />
ovvero: ve<strong>di</strong> slide. Si può calcolare anche il valore massimo, ovvero il valore <strong>di</strong> picco. Si può quin<strong>di</strong><br />
calcolare il valore della tensione VL. Il nostro invertitore vedrà Vdd-ΔV. In pratica si osservano una<br />
serie <strong>di</strong> oscillazioni e non soltanto il <strong>di</strong>sturbo rettangolare come mostrato nella terza immagine<br />
sopra.<br />
Nella fase in cui l’uscita va dal livello alto al livello basso si avrà una scarica verso massa e il<br />
<strong>di</strong>sturbo sarà quin<strong>di</strong> sul terminale <strong>di</strong> massa. Prima era su quello <strong>di</strong> Vdd, entrambi i terminali allora<br />
saranno affetti <strong>di</strong> questo rimbalzo. Ve<strong>di</strong>amo l’entità <strong>di</strong> questi <strong>di</strong>sturbi.<br />
La capacità considerata è molto grande per i circuiti integrati, sarà per esempio una capacità <strong>di</strong><br />
uscita. La formula restituisce un <strong>di</strong>sturbo <strong>di</strong> 0.2V, circa il 10% della Vdd. Questo valore può essere<br />
assorbito sicuramente dai margini <strong>di</strong> rumore <strong>dei</strong> nostri circuiti <strong>di</strong>gitali. Se però commutano 8<br />
invertitori invece che 1 solo il <strong>di</strong>sturbo va moltiplicato per 8 e il <strong>di</strong>sturbo complessivo <strong>di</strong>venta <strong>di</strong><br />
1.6V. Si osservi che il caso non è assurdo, perché nei bus sappiamo che ciò accade. Si noti che gli<br />
effetti si sommano perché se è vero da un lato che l’induttanza è unica dal terminale <strong>di</strong><br />
alimentazione del package verso Vdd e unica dal terminale <strong>di</strong> massa alla massa, la corrente che vi<br />
scorre dentro è la SOMMA <strong>di</strong> tutte le correnti che devono caricare le capacità!! Il vero problema è<br />
che tutta la logica presente nel circuito integrato collegata alla stessa alimentazione risentirà <strong>di</strong>
questi <strong>di</strong>sturbi!! Poiché la con<strong>di</strong>zione <strong>di</strong> commutazione contemporanea è comune, bisogna<br />
prendere provve<strong>di</strong>menti che limitino questi <strong>di</strong>sturbi. Inoltre, l’entità del <strong>di</strong>sturbo è <strong>di</strong>rettamente<br />
legata alla capacità. Il problema quin<strong>di</strong> si pone per i terminali <strong>di</strong> ingresso e uscita.<br />
Per ridurre questi problemi si utilizzano quattro anelli <strong>di</strong> alimentazione.<br />
Vdd ext, GNDext per i pad <strong>di</strong> I/O<br />
Vdd int, GNDint per la logica interna<br />
Gli accorgimenti che si adottano non risolvono al 100% il problema. In pratica, faccio in modo che il<br />
nostro nucleo elaborativo del chip (il core, la logica) non veda questi <strong>di</strong>sturbi. Spezzo la linea che<br />
porta l’alimentazione al core. In questo modo, il core dovrà pilotare delle capacità interne che sono<br />
or<strong>di</strong>ni <strong>di</strong> grandezza più piccoli delle capacità esterne da 10pF circa!! In sostanza, basta spezzare le<br />
alimentazioni ed ho risolto! Il prezzo da pagare è il numero <strong>di</strong> pin maggiore richiesto. Quin<strong>di</strong>, in<br />
sintesi si separano le alimentazioni per i buffer <strong>di</strong> uscita e per il core. Si noti un’altra cosa: può<br />
accadere anche che le alimentazioni per il core e per i buffer sono <strong>di</strong>verse, quin<strong>di</strong> separare le<br />
alimentazioni può essere un buon modo per risolvere anche questo problema.<br />
Osservando la slide, si avrà un <strong>di</strong>sturbo per il core e un <strong>di</strong>sturbo per per l’IO che sarà molto più<br />
grande del precedente.<br />
Utilizziamo 4 anelli <strong>di</strong> alimentazione, ovvero quattro linee <strong>di</strong> alimentazione. Li chiameremo esterni<br />
ed interni rispettivamente per l’IO e per il core. Si chiameranno anelli perché corrono su tutta la<br />
periferia del chip. Si noti che ci sono altre due linee de<strong>di</strong>cate all’alimentazione per il core. Si noti<br />
che il vero numero <strong>dei</strong> terminali <strong>di</strong> alimentazione in questo esempio non sono 4 come <strong>di</strong>ce la teoria<br />
bensì 8.<br />
Mettendo due terminali <strong>di</strong> alimentazione piuttosto che uno solo per ogni Vdd e GND, si ottengono<br />
due induttanze in parallelo che sono la metà <strong>di</strong> una sola! Se mettessi 16 alimentazioni e 16 masse<br />
ottengo <strong>dei</strong> <strong>di</strong>sturbi che sono 16 volte inferiori rispetto al caso <strong>di</strong> un sol terminale. Nell’esempio, ho<br />
2 terminali per ogni tensione <strong>di</strong> riferimento.<br />
a) Le ricette per far fronte ai problemi sono:<br />
separare le alimentazioni e le masse <strong>dei</strong> circuiti <strong>di</strong> IO da quelle per il core.<br />
b) usiamo più terminali<br />
c) scegliamo in maniera ottimale quali pin utilizzare per l’alimentazione: osservando la slide<br />
10, non useremo i pin negli spigoli perché hanno un collegamento interno maggiore e<br />
quin<strong>di</strong> un’induttanza maggiore.<br />
d) cercheremo <strong>di</strong> aumentare i tempi <strong>di</strong> salita e <strong>di</strong> <strong>di</strong>scesa al massimo possibile: i pin <strong>di</strong> uscita<br />
non li porto alla massima velocità possibile, ma porto la velocità ad un valore compatibile<br />
col funzionamento del sistema complessivo<br />
e) si schedulano le transizioni che commutano: se ho un bus ad esempio, faccio sì che le<br />
commutazioni non sono esattamente simultanee ma introduco <strong>dei</strong> ritar<strong>di</strong> piccolissimi.<br />
f) utilizzare delle tecnologie <strong>di</strong> packaging più avanzate<br />
g) laddove ciò non basti, si possono aggiungere delle capacità <strong>di</strong> <strong>di</strong>saccoppiamento sulla<br />
scheda e sul chip. Le capacità <strong>di</strong> <strong>di</strong>saccoppiamento cosa sono? Sono condensatori messi<br />
tra il terminale <strong>di</strong> Vdd ed il terminale <strong>di</strong> massa. Se sono <strong>di</strong> valore grande, la loro presenza<br />
riduce in maniera sensibile i <strong>di</strong>sturbi: più grande è la capacità <strong>di</strong> <strong>di</strong>saccoppiamento, meglio
sarà! Dove si piazza? Sotto le linee <strong>di</strong> alimentazione che comunque utilizzerebbero area<br />
sul chip. Il problema esiste allo stesso modo anche sul circuito stampato<br />
Le capacità <strong>di</strong> <strong>di</strong>saccoppiamento si pongono:<br />
sulla board (giusto sotto i pin <strong>di</strong> alimentazione)<br />
sul chip (sotto le linee <strong>di</strong> alimentazione, vicino a gran<strong>di</strong> buffer)<br />
Possono essere utilizzate anche tecniche <strong>di</strong> packaging particolari per ridurre il problema:<br />
Per esempio il processore Intel Core 2 Duo include un <strong>di</strong>ssipatore integrato.<br />
Nei system in package si cerca <strong>di</strong> fare una integrazione a livello <strong>di</strong> package: si cerca <strong>di</strong> integrare<br />
più chip all’interno dello stesso contenitore collegati con il bon<strong>di</strong>ng. Questi Chip possono essere<br />
anche <strong>di</strong> produttori <strong>di</strong>fferenti.
<strong>Sistemi</strong> Combinatori<br />
Layout & gate level<br />
Dopo lo stu<strong>di</strong>o sulle interconnessioni, seguiamo l’approccio bottom up per capire come si<br />
organizza il layout <strong>di</strong> un circuito semplice per vedere poi le celle che<br />
utilizzeremo nelle esercitazioni. Il layout <strong>di</strong> un circuito integrato riporta tutti i<br />
layer che servono per realizzare il circuito. Per <strong>di</strong>segnarli bisogna rispettare<br />
delle regole <strong>di</strong> progetto.<br />
Riporta tutti i layers necessari alla realizzazione delle maschere<br />
fotolitografiche:<br />
Deve rispettare le regole <strong>di</strong> progetto<br />
Dimensione minima<br />
Distanza minima<br />
Composizione<br />
Almeno in fase iniziale è più opportuno <strong>di</strong>segnare lo stick <strong>di</strong>agram ovvero una versione<br />
semplificata del layout: segnamo i vari rettangoli con delle linee <strong>di</strong> colore <strong>di</strong>verso o tratteggio<br />
<strong>di</strong>verso e non ci preoccupiamo delle <strong>di</strong>stanze minime ecc. Quin<strong>di</strong> lo stick <strong>di</strong>agram ci dà solo una<br />
informazione su dove piazzare i vari rettangoli.<br />
Scelta la convenzione sulle linee da utilizzare, cosa succede se due <strong>di</strong> queste<br />
(una verticale ed<br />
una orizzontale)<br />
si intersecano?<br />
Fra poly e<br />
metal1 nulla. Se<br />
vogliamo farci un<br />
collegamento tra<br />
queste due linee, bisogna piazzare<br />
un quadratino. Se invece<br />
intersechiamo due linee <strong>di</strong> poly,<br />
queste saranno per forza collegate<br />
tra loro, ovvero in corto. Se<br />
intersechiamo invece una linea <strong>di</strong><br />
poly con una <strong>di</strong> <strong>di</strong>ffusione, stiamo<br />
creano un mos. Si noti che è illegale intersecare una <strong>di</strong>ffusione n ed una p: anzi, ricor<strong>di</strong>amo che<br />
una delle regole più stringenti è la <strong>di</strong>stanza tra una linea n ed una p per via della nwell da creare<br />
per realizzare una linea p!<br />
A lato abbiamo lo stick <strong>di</strong>agram <strong>di</strong> un invertitore.<br />
Si noti che l’alimentazione e al massa sono scritte con un<br />
punto esclamativo finale (significa VARIABILE GLOBALE).<br />
Le due linee sono parallele tra loro. Le prese <strong>di</strong> substrato<br />
sono la x sulla vdd e sulla massa. In generale, abbiamo che<br />
si tenta sempre <strong>di</strong> seguire questa strategia:<br />
una linea orizzontale in alto per l’alimentazione ed una in<br />
basso per la massa. Imme<strong>di</strong>atamente sotto la linea <strong>di</strong> Vdd ci<br />
saranno i vari PMOS in orizzontale: questo perché si<br />
favorisce il piazzamento <strong>di</strong> un gran numero <strong>di</strong> prese <strong>di</strong><br />
substrato. Inoltre, anche gli nmos vengono messi in<br />
orizzontale e vicino alla linea <strong>di</strong> massa così da riuscire a<br />
rispettare facilmente la regola <strong>di</strong> progetto x la <strong>di</strong>stanza<br />
minima dmin. Non si fa una <strong>di</strong>stribuzione a caso <strong>di</strong> pmos ed nmos. Inoltre si cerca <strong>di</strong> fare in modo<br />
che le celle abbiano la stessa altezza h in modo tale che si possono poi alimentare semplicemente<br />
accostandole.
Supponiamo ora <strong>di</strong> voler collegare i due punti K sullo stick <strong>di</strong>agram: per risolvere questo problema,<br />
utilizzo il polisilicio (è vero che non è un gran che come collegamento, ma il tratto è piccolissimo)<br />
per fare il collegamento verticale e poi uso il metal per fare il collegamento tra K e K. Infine, si noti<br />
che l’ingresso è in poly e l’uscita in metallo.<br />
Si ricor<strong>di</strong> che è importante mettere i nomi ai no<strong>di</strong> (label) soprattutto per la simulazione.<br />
Progetto dell’ad<strong>di</strong>zionatore PICO<br />
Ora supponiamo <strong>di</strong> voler fare il layout <strong>di</strong> un buffer: approccio<br />
gerarchico. Lo stick <strong>di</strong>agram è in figura: ci sono due copie,<br />
due istanze della cella realizzata prima. Se la cella si chiama<br />
inv, la prima istanza sarà inv_0 e la seconda onv_1.<br />
Lo stick <strong>di</strong>agram quin<strong>di</strong> prevede l’accostamento <strong>dei</strong> due<br />
rettangoli (si noti che c’è un errore: l’ingresso <strong>di</strong> ogni istanza è<br />
in poly mentre io li ho collegati con un metal: devo mettere<br />
allora un contatto e fare un collegamento in metal in<br />
OGNUNA delle due istanze). Il nodo interno tra le due istanze<br />
avrà due nomi, alias (sarà out1 o in2).<br />
Ve<strong>di</strong>amo l’ad<strong>di</strong>zionatore: ha 2 ingressi a n bit, eventualmente un riporto<br />
ad 1 bit (che non utilizzeremo) ed in uscita abbiamo la somma a n bit<br />
(avremmo in teoria anche un riporto <strong>di</strong> uscita, ma noi non lo utilizziamo).<br />
Un ad<strong>di</strong>zionatore veloce si può fare in 3-4 <strong>di</strong>versi mo<strong>di</strong>. La struttura più<br />
semplice è quella a propagazione del riporto (carry ripple) ma è<br />
anche quella più lenta.<br />
Cominciamo a vedere quelle che saranno i vari<br />
blocchi che realizzeremo per le nostre<br />
esercitazioni:<br />
avremo un microprocressore, una alu, etc.<br />
È costituito da una cascata <strong>di</strong> celle elementari ognuna delle quali<br />
somma 1 bit <strong>dei</strong> due operan<strong>di</strong>: il circuito rispecchia l’algoritmo della somma. In sostanza ho<br />
bisogno <strong>di</strong> un <strong>di</strong>spositivo che somma 3 bit <strong>di</strong> ingresso (2 bit + il riporto Cin) e fornisce in uscita 2<br />
segnali (1 che è la somma S e 1 bit <strong>di</strong> riporto Cout che ha peso<br />
doppio rispetto a S): FULL ADDER. Se non ho necessità <strong>di</strong><br />
sommare il riporto, uso un HALF ADDER che somma 2 bit <strong>di</strong><br />
ingresso e restituisce in uscita il bit S e il bit <strong>di</strong> riporto Cout.
Un ad<strong>di</strong>zionatore ad n bit richiede n full adder. Basta quin<strong>di</strong><br />
progettare un solo full adder e poi metterli in serie.<br />
Full adder: Scriviamoci la tabella <strong>di</strong> verità del full adder,<br />
ovvero della somma <strong>dei</strong> tre termini a, b e c. Spesso questo<br />
circuito viene chiamato anche compressore 32 perché il<br />
contenuto informativo espresso su 3 bit me lo esprime su 2<br />
bit!<br />
Per capire come ottenere il Cout, si esprimono i casi in cui si ha 1 e viene come in figura. è in<br />
pratica la or <strong>di</strong> 3 and. Se metto poi la c in evidenza ottengo l’altra espressione. Si ottiene con una<br />
AndOrInvert seguita con un invertitore. La somma è un XOR, una OR esclusivo. Questa funzione<br />
compare molto spesso nei circuiti <strong>di</strong>gitali ma non si presta bene ad essere integrata! La XOR in<br />
generale è alta quando sono alti un numero <strong>di</strong>spari <strong>di</strong> ingressi, è quin<strong>di</strong> la funzione <strong>di</strong>sparità. Con<br />
una AOI sarebbe molto complicato. Allora, facciamo così: pren<strong>di</strong>amo la colonna <strong>di</strong> Cout negato<br />
tanto ce l’abbiamo già gratis: si vede che è identica alla S tranne nel primo e nell’ultimo caso!! E<br />
allora si può scrivere come in slide. Un inconveniente è che per calcolare S devo aspettare che<br />
Cout negato sia <strong>di</strong>sponibile!<br />
Ecco il circuito dell’AOI. Si noti che la C che prima ho messo in<br />
evidenza, ora lo metto vicino all’uscita! In sostanza lo sto<br />
privilegiando perché ricor<strong>di</strong>amo che abbiamo visto che i mos più<br />
vicini all’uscita devono caricare meno capacità! Questo circuito<br />
comunque può essere ottimizzato: infatti, si nota che la rete pmos<br />
condurrà quando A e B sono accesi e in pratica il ramo <strong>di</strong> destra<br />
pmos può essere staccato.<br />
L’ingresso C è privilegiato, quando conduce la rete evidenziata?<br />
quando A=0 ed inoltre B=0, in questo caso il parallelo <strong>dei</strong> PMOS<br />
comandati da A e B è sempre in conduzione.<br />
È possibile ottimizzare la cella carry utilizzando quest’altra<br />
configurazione a sinistra.<br />
Facendo in questo modo, la rete pmos è esattamente DUALE rispetto<br />
alla nmos!!! Il circuito è mirror, a specchio!<br />
I vantaggi che si hanno sono sicuramente in termini <strong>di</strong> layout<br />
simmetrico, ma soprattutto il numero massimo <strong>di</strong> <strong>di</strong>spositivi in serie è<br />
passato da 3 a 2!!! Infine, possiamo ottimizzare l’ingresso C anche<br />
nella rete pmos!
Questo è un esempio <strong>di</strong> Stick <strong>di</strong>agram. Si noti che le linee<br />
grigie saranno in metal2: ci sarà comodo in seguito poter<br />
passare in orizzontale una linea <strong>di</strong> metal1!! In sostanza tutti<br />
i collegamenti verticali vengono fatti o in poly o in metal2. Il<br />
<strong>di</strong>agramma non è completo, perché vanno collegati A ed A,<br />
B e B.<br />
Lo stick <strong>di</strong>agram definitivo è quello riportato nella figura sottostante:<br />
L’altra funzione logica da realizzare è quella che calcola la funzione<br />
somma. L’altra la possiamo realizzare guardando l’espressione logica:<br />
nella rete <strong>di</strong> pull down abbiamo il parallelo <strong>di</strong> due reti, una che realizza<br />
la and <strong>di</strong> A B e C e una che realizza la And tra NotCout e la or tra A,B<br />
e C. La rete <strong>di</strong> pull-up poi si realizza per dualità. Il circuito ovviamente<br />
calcola S negato, quin<strong>di</strong> è necessario un invertitore per ottenere S.<br />
Semplifichiamo: quando conduce il ramo <strong>di</strong> pull-up evidenziato?<br />
A lo facciamo passare in parallelo alla linea <strong>di</strong><br />
massa sotto alla massa e B sopra alla linea <strong>di</strong><br />
alimentazione. Il segnale C invece lo facciamo<br />
uscire a destra, così come Cout e Cout’ che mi<br />
servirà per calcolare la S. In questa versione gli<br />
ingressi A e B vengono portati su due linee<br />
parallele alle linee <strong>di</strong> alimentazione, l’ingresso C<br />
sulla sinistra così come Cout e Cout negato.<br />
Quando A B e C sono entrambi bassi, allora possiamo spezzare la rete e ottenere questo:<br />
Lo stick <strong>di</strong>agram lo otteniamo dal circuito<br />
semplicemente. Anche in questo caso, A e B<br />
stanno su due linee parallele all’alimentazione,<br />
proprio come abbiamo fatto per la porta logica<br />
che calcola il carry. Inoltre, C e NotCout li<br />
ren<strong>di</strong>amo <strong>di</strong>sponibili sulla sinistra della cella, così<br />
da poterli collegare facilmente alla cella carry. Si<br />
nota anche l’invertitore finale che da NotS dà S.<br />
Anche in questo caso le due reti <strong>di</strong> pull-up e <strong>di</strong> pull down sono<br />
esattamente simmetriche. I vantaggi nell’usare questa versione della<br />
porta sono: simmetria nel layout e un MOS in serie in meno nella rete<br />
<strong>di</strong> pull-up. Abbiamo privilegiato un ingresso: NotCout! Infatti i<br />
<strong>di</strong>spositivi <strong>di</strong> questo sono vicino all’uscita. Perché? Ovviamente<br />
perché ha un ritardo maggiore, proviene da una rete <strong>di</strong> carry.
Ora ve<strong>di</strong>amo le due celle, una a fianco all’altra: per come le abbiamo organizzate, sarà semplice<br />
collegare le masse, le alimentazioni, B ed A. Il segnale C potrà essere facilmente applicato ad<br />
entrambe le celle, l’uscita Coutnegato va facilmente con Coutnegato alla cella che fa la somma, il<br />
Cout poi è il riporto uscente che andrà collegato al fulladder successivo, quin<strong>di</strong> va portato proprio<br />
fuori.<br />
Ricor<strong>di</strong>amo le espressioni che ci permettono <strong>di</strong> calcolare il Cout e la somma:<br />
ed an<strong>di</strong>amo a mostrare lo schema a blocchi complessiva della cella Sum+Carry:<br />
Cout va sul lato superiore della cella perché andrà al fulladder successivo, il C invece va in basso.<br />
Per la realizzazione dell’adder a 8 bit basterà fare un array. Se la cella è progettata bene, fare un<br />
ad<strong>di</strong>zionatore a 16 o 64 bit è semplicissimo: basta richiamare il comando array. Ovviamente<br />
cambieranno le prestazioni del circuito, ma a livello <strong>di</strong> realizzazione <strong>di</strong> layout è semplicissimo.<br />
Questa è una struttura bit-slice, ovvero realizzato con strisce <strong>di</strong> bit. La struttura è duttile. In questo<br />
caso abbiamo un flusso <strong>di</strong> dati. C’è poi un segnale <strong>di</strong> controllo che è il riporto che si propaga, ed è<br />
proprio ortogonale al flusso <strong>di</strong> dati: bisogna stare attenti che nel layer questi viaggiano<br />
ortogonalmente al flusso dati.<br />
Struttura bit-slice<br />
DATA-PATH
<strong>Sistemi</strong> Combinatori<br />
Timing Analysis<br />
Come si fa la timing analysis <strong>di</strong> sistemi combinatori?<br />
Pren<strong>di</strong>amo quest’esempio a lato: 5 ingressi e 3 uscite. Come valutiamo il ritardo <strong>di</strong> questo circuito?<br />
La cosa più semplice è quella <strong>di</strong> realizzare una simulazione. Ragionando, è facile capire che<br />
questa non è così semplice. Supponiamo <strong>di</strong> avere questi n (=5)<br />
ingressi: quali saranno le sequenze da applicare per valutare i<br />
ritar<strong>di</strong>? Per es passo da 00000 a 1101 e facciamo una prima<br />
simulazione. Quale sarà quella che mi darà il massimo ritardo?<br />
Devo effettuare tutte le possibili transizioni degli ingressi!! Con 5<br />
ingressi, dovrò fare 2 5 -1 simulazioni per ogni ingresso fissato!!<br />
Quin<strong>di</strong>, complessivamente dovrò effettuare 2 5 (2 5 -1) simulazioni!<br />
In generale, si hanno da fare 2 2N simulazioni e con N grande <strong>di</strong>venta inaccettabile!!<br />
Con 16 bit per esempio devo fare 2 alla 32 simulazioni!! Ci vogliono altre tecniche che riescono a<br />
darci stime <strong>dei</strong> ritar<strong>di</strong>, ovvero tecniche che realizzano una analisi statica <strong>dei</strong> ritar<strong>di</strong> (static timing<br />
analisys).<br />
Questa analisi procede così: noi per semplicità assumiamo che ogni porta logica sia caratterizzata<br />
da uno specifico valore <strong>di</strong> ritardo, mentre questi tool potenti hanno a <strong>di</strong>sposizione una<br />
caratterizzazione delle celle. In pratica, tutte le celle devono essere in precedenza analizzate e<br />
simulate per cui per la generica porta saranno scritte delle informazioni in un file specifico<br />
(per es: tp A 10 , B=0, Cin=10fF, tr=50ps 250ps e questo per tutte le combinazioni). Una<br />
parte <strong>di</strong> caratterizzazione quin<strong>di</strong> è in<strong>di</strong>spensabile e richiede delle simulazioni che però vengono<br />
fatte una volta per tutte su delle celle piccole, con pochi ingressi. Questa analisi viene fatta per<br />
tutte le con<strong>di</strong>zioni (tempi <strong>di</strong> salita degli ingressi, tensioni logiche ecc). Ci sono quin<strong>di</strong> delle librerie<br />
standard molto ricche <strong>di</strong> informazioni relative alla caratterizzazione. Nel nostro esempio ripetiamo<br />
che il ritardo della cella è unico.<br />
Ci servono altre informazioni oltre ai ritar<strong>di</strong> delle celle.<br />
Abbiamo informazioni relative ai tempi <strong>di</strong> arrivo <strong>dei</strong> segnali <strong>di</strong> ingresso: in generale i segnali non<br />
arriveranno contemporaneamente perché provengono comunque da altra logica. Rispetto<br />
all’instante <strong>di</strong> riferimento del clock gli ingressi I3 e<br />
I4 arrivano imme<strong>di</strong>atamente, I5 arriva dopo 60ps e<br />
I1 e I2 arrivano dopo 20ps. In blu quin<strong>di</strong> sono<br />
espressi in blu.<br />
Poi, servono i tempi richiesti per le uscite. Sono<br />
<strong>dei</strong> vincoli sulle uscite, ovvero “le uscite dovranno<br />
essere <strong>di</strong>sponibili entro un certo tempo”. A seconda<br />
delle esigenze, questi vincoli saranno più o meno<br />
stringenti. Nel nostro esempio, i tempi richiesti in<br />
rosso li abbiamo fissati a 350ps.<br />
Una volta definiti i tempi <strong>di</strong> arrivo e i tempi richiesti ed avendo a <strong>di</strong>sposizione i ritar<strong>di</strong> delle celle,<br />
possiamo procedere all’analisi <strong>dei</strong> ritar<strong>di</strong>.<br />
La prima operazione che facciamo è trasformare la<br />
nostra rete logica in un grafo: ogni nodo elettrico<br />
viene trasformato in un nodo del grafo, anche i no<strong>di</strong><br />
interni. La relazione ingresso-uscita la traduciamo in<br />
archi che collegano i no<strong>di</strong> <strong>di</strong> ingresso e i no<strong>di</strong> <strong>di</strong><br />
uscita. Questi archi sono pesati in base al ritardo<br />
relativo alla porta logica. Per esempio, il nodo I1 è<br />
collegato al nodo A per mezzo della NAND, stesso
<strong>di</strong>scorso per I2. Il peso <strong>di</strong> questi due archi sarà proprio il ritardo della nand pari a 100. Avendo a<br />
<strong>di</strong>sposizione una caratterizzazione come quella descritta prima, più accurata, non sarà unico il<br />
peso dell’arco. Nel nostro caso otteniamo un grafo<br />
orientato pesato.<br />
A questo punto, possiamo propagare all’interno del grafo i<br />
tempi assegnati, sia quelli <strong>di</strong> arrivo sia quelli richiesti.<br />
Come propaghiamo i tempi <strong>di</strong> arrivo? La cosa importante è<br />
che per i no<strong>di</strong> in cui ci sono più ingressi e quin<strong>di</strong> <strong>di</strong>versi<br />
tempi, prendo il peggiore! Per esempio, per il nodo E, il<br />
valore del tempo <strong>di</strong> arrivo che metterò su E sarà il<br />
massimo tra quello<br />
dovuto ad A e a C (ve<strong>di</strong><br />
quad b)). Osserviamo<br />
che la propagazione <strong>dei</strong><br />
tempi <strong>di</strong> arrivo si realizza<br />
col grafo e procede secondo la schematizzazione vista.<br />
La propagazione <strong>dei</strong> tempi <strong>di</strong> arrivo si effettua facilmente,<br />
calcolando quin<strong>di</strong> il massimo <strong>dei</strong> tempi <strong>di</strong> arrivo più i ritar<strong>di</strong> legati<br />
ai vari archi.<br />
Si può procedere similmente riguardo ai tempi richiesti. In questo caso ci muoviamo da destra<br />
verso sinistra: l’uscita Y3 sappiamo deve essere<br />
<strong>di</strong>sponibile entro il tempo 500. Quin<strong>di</strong>, il D dovrà<br />
essere <strong>di</strong>sponibile al tempo 500-150=350 e così via.<br />
In questo caso si hanno situazioni come quella<br />
relativa al nodo E: questo<br />
deve sod<strong>di</strong>sfare 2 con<strong>di</strong>zioni<br />
che riguardano il nodo Y3 e<br />
Y2. Per quanto riguarda Y3,<br />
E deve essere <strong>di</strong>sponibile al<br />
massimo al tempo 500-<br />
150=350. Per quanto<br />
riguarda l’uscita Y2 invece, il tempo deve essere 500-60=440. Il tempo<br />
richiesto per il nodo E sarà il più stringente tra i due. La relazione allora<br />
sarà <strong>di</strong>versa.<br />
Qui calcoliamo il cammino critico: calcoliamo la <strong>di</strong>fferenza tra il tempo richiesto e il tempo <strong>di</strong> arrivo<br />
(questa <strong>di</strong>fferenza si chiama SLACK). Affinché tutte le specifiche saranno rispettate se su tutti i<br />
no<strong>di</strong> si avrà uno SLACK > 0 (ovvero il segnale arriva prima <strong>di</strong> quanto necessario). Il nostro tool ci<br />
<strong>di</strong>rà, in questo caso, che tutti i vincoli saranno rispettati. Il cammino critico del circuito è quello<br />
evidenziato in verde, in cui lo slack per ogni<br />
nodo assume lo stesso valore pari a 30 ed è il<br />
MINIMO! Essendo comunque un valore positivo,<br />
non c’è bisogno <strong>di</strong> intervenire. Se però lo slack<br />
fosse stato NEGATIVO, a quel punto bisognava<br />
cambiare qualcosa nel nostro circuito SOLO sul<br />
cammino critico, ovvero SOLO dove i vincoli non<br />
sono rispettati. Un’altra forma <strong>di</strong> ottimizzazione<br />
può essere questa: se lo slack è positivo (vincoli<br />
temporali rispettati), ve<strong>di</strong>amo se è possibile<br />
usare <strong>di</strong>spositivi più piccoli e quin<strong>di</strong> che<br />
occupano meno area, <strong>di</strong>ssipano <strong>di</strong> meno ecc. E<br />
allora, se nella libreria c’è, uso un <strong>di</strong>spositivo più<br />
piccolo! Quin<strong>di</strong> invece <strong>di</strong> rendere il <strong>di</strong>spositivo<br />
più veloce, se le specifiche vengono rispettate
posso ottimizzare il circuito in termini <strong>di</strong> efficienza (area occupata, potenza <strong>di</strong>ssipata). Si sottolinea<br />
che il parametro da osservare per questa analisi è sempre lo SLACK.<br />
slack=Trichiesto – Tarrivo<br />
L’insieme <strong>di</strong> no<strong>di</strong> con slack minimo rappresenta il CAMMINO CRITICO del circuito, il cammino<br />
critico si ottiene senza dover simulare il circuito: STATIC TIMING ANALYSIS.<br />
Vantaggi <strong>di</strong> questa analisi: l’analisi della rete è veloce, si fa<br />
velocemente anche per sistemi estremamente complicati; se la<br />
libreria è completa (in termini <strong>di</strong> caratterizzazione <strong>dei</strong> ritar<strong>di</strong> vari<br />
ecc), i valori predetti dalla timing analisys sono molto atten<strong>di</strong>bili;<br />
la timing analisis ci dà <strong>di</strong>rettamente delle in<strong>di</strong>cazioni su dove<br />
agire per ottimizzare il circuito! Inoltre, la timing analisys ci dà<br />
<strong>di</strong>rettamente il cammino critico! Inoltre, si può richiedere al<br />
software <strong>di</strong> provare a cambiare le porte nella speranza <strong>di</strong> ridurre i ritar<strong>di</strong> (oppure <strong>di</strong> cambiare le<br />
<strong>di</strong>mensioni <strong>dei</strong> <strong>di</strong>spositivi).Si noti che, in<strong>di</strong>viduato il cammino critico, si può estrarre solo questa<br />
parte <strong>di</strong> circuito (se per esempio si ha il dubbio che la caratterizzazione nelle librerie non è fatta<br />
bene oppure si vuole analizzare bene in spice a livello transistor per avere informazioni<br />
dettagliate).<br />
Esiste però il problema <strong>dei</strong> cammini falsi: false path. Ve<strong>di</strong>amo ora un esempio <strong>di</strong> un possibile<br />
cammino falso. Si hanno 5 ingressi e 2 uscite. Per fare<br />
l’analisi del circuito bisognerebbe assegnare tempi <strong>di</strong><br />
arrivo e tempi richiesti. Supponiamo tempi <strong>di</strong> arrivo tutti<br />
pari a 0 e tempi richiesti tutti uguali. In questo caso, il<br />
ritardo max sembrerebbe essere 50 + 10 + 15 + 10 = 85<br />
MA non è vero! Perché se si osserva il multiplexer,<br />
questo cammino non si attiva MAI per una questione <strong>di</strong><br />
logica quin<strong>di</strong> nel grafo ci sarà ma NON si attiverà mai!<br />
Questi cammini creano <strong>dei</strong> problemi abbastanza<br />
fasti<strong>di</strong>osi nei tool <strong>di</strong> simulazione. Comunque, qui il cammino critico è 20+10+15+10 = 55.<br />
Ora, applichiamo questi concetti per un full adder. Scriviamone il<br />
grafo <strong>dei</strong> ritar<strong>di</strong> (ve<strong>di</strong> slide). Il cammino critico dov è? Dovremmo<br />
mettere il peso degli archi, i tempi <strong>di</strong> arrivo e richiesti. Però se i<br />
tempi <strong>di</strong> arrivo ed i tempi richiesti sono uguali (e se i<br />
ritar<strong>di</strong> <strong>dei</strong> vari archi sono simili), ad occhio, si ha che il cammino<br />
critico, a partire dagli ingressi, è quello che passa per b,<br />
NotCout, NotS e S.<br />
Che succede per un ad<strong>di</strong>zionatore a propagazione <strong>di</strong> riporto? Il<br />
cammino critico qual è? Sempre nell’ipotesi <strong>di</strong> archi con peso uguale e tempi <strong>di</strong> arrivo uguali, si ha<br />
che qui il cammino critico prevede 5 archi! Per un ad<strong>di</strong>zionatore a n<br />
bit il cammino critico sarà un cammino che ha n-1 ritar<strong>di</strong> <strong>di</strong> riporto e<br />
un ritardo della somma. Si capisce subito che se il ritardo <strong>di</strong> carry è<br />
notevole, questo sarà il peso più significativo nel ritardo totale. Ecco<br />
perché abbiamo privilegiato i Cout nel realizzare il layout della singola<br />
cella per la somma. Per ogni full adder allora, se vogliamo realizzare<br />
questa applicazione bisogna privilegiare l’ingresso carry rispetto agli<br />
altri.<br />
Tp=(n-1)Tcarry + Tsum
Possiamo allora ottimizzare il nostro ad<strong>di</strong>zionatore? Si, basiamoci sulle<br />
funzioni logiche implementate nel full-adder. Qui, abbiamo due porte<br />
logiche che calcolano i negati e noi ci abbiamo inserito i due invertitori<br />
(ve<strong>di</strong> figura a sinistra). In un ad<strong>di</strong>zionatore ad n bit, sulla catena del riporto<br />
ci sono n invertitori (che <strong>di</strong> volta in volta a partire da NotCout mi danno<br />
Cout) che introducono n ritar<strong>di</strong>!! Come posso eliminarli?<br />
Pren<strong>di</strong>amo la tabella <strong>di</strong> verità del full adder. Questa è simmetrica rispetto alla linea tratteggiata in<br />
figura. In sostanza, se nego gli ingressi, ottengo l’uscita negata!<br />
Come realizzo il circuito migliorato?<br />
Partiamo dall’ad<strong>di</strong>zionatore che somma i termini <strong>di</strong><br />
peso 0 (i meno significativi). Questo sarà uguale a<br />
prima. Ora, poiché in uscita al primo ad<strong>di</strong>zionatore<br />
non ho C1 ma NotC (ho tolto l’invertitore), in ingresso<br />
metto rispettivamente un invertitore per A1 e uno per<br />
B1 così da sommare tutti ingressi negati. Eliminando<br />
anche l’invertitore in uscita all’ad<strong>di</strong>zionatore, ottengo<br />
proprio S1! In sostanza, questo circuito nel<br />
complesso mi somma una coppia <strong>di</strong> bit con un<br />
invertitore in meno rispetto a prima (3 invece <strong>di</strong> 4) e<br />
quin<strong>di</strong> occupa meno area però, cosa importante, ho tolto due invertitori dalla linea del riporto!<br />
Nella realtà, non risparmio area perché le celle sono alternativamente uguali, ovvero 1-3-5-7 uguali<br />
e 2-4-6-8 uguali. Sprecherò area, però posso realizzare l’ad<strong>di</strong>zionatore totale replicando 4 volte<br />
questo circuito.<br />
Per un carry ripple avrò:
<strong>Sistemi</strong> Combinatori<br />
Electrical & Logical effort<br />
L’argomento che trattiamo ora è il ritardo <strong>dei</strong> sistemi combinatori. Soffermiamoci sulla generica<br />
gate. Doman<strong>di</strong>amoci: come possiamo valutare il ritardo? Come possiamo ottimizzarla in termini <strong>di</strong><br />
<strong>di</strong>mensionamento? Introduciamo allora l’impegno elettrico(electrical effort) e l’impegno<br />
logico(logical effort).<br />
Come esempio applicativo consideriamo la cella carry. Abbiamo visto che il ritardo <strong>di</strong> questa cella<br />
rappresenta il cammino critico dell’ad<strong>di</strong>zionatore a propagazione del riporto. Chie<strong>di</strong>amoci: qual è la<br />
con<strong>di</strong>zione <strong>di</strong> ottimizzazione del circuito? Ve<strong>di</strong>amo come si <strong>di</strong>mensiona la porta.<br />
Assumiamo per semplicità che, a parità <strong>di</strong> <strong>di</strong>mensioni, le R <strong>dei</strong><br />
PMOS siano il doppio <strong>di</strong> quelle degli NMOS.<br />
RETE NMOS: identifichiamo il cammino col numero massimo <strong>di</strong><br />
<strong>di</strong>spositivi in serie: in questo caso i cammini sono tutti<br />
equivalenti quin<strong>di</strong> tutti i <strong>di</strong>spositivi avranno la stessa Wnc. La<br />
Weq sarà allora Wnc/2, la metà perché ci sono due <strong>di</strong>spositivi in<br />
serie. La Wnc è per ora un parametro, un grado <strong>di</strong> libertà.<br />
RETE PMOS: La Weq in questo caso sarà ancora Wpc/2. Ora,<br />
questi due ritar<strong>di</strong> equivalenti sono legati perché vogliamo che<br />
sia simmetrico (in modo tale da equilibrare tphl e tplh). Il legame<br />
è gamma che <strong>di</strong>pende dalla tecnologia, sappiamo che l’or<strong>di</strong>ne <strong>di</strong><br />
grandezza (campo tipico <strong>di</strong> vali<strong>di</strong>tà <strong>di</strong> gamma) è 1,8-2,5. Supponiamo per semplicità <strong>di</strong> calcolo<br />
gamma=2. Dalla con<strong>di</strong>zione imposta viene che:<br />
Wpc=2Wnc<br />
Nota che i valori <strong>di</strong> W non sono ancora tutti definiti, abbiamo ancora un grado <strong>di</strong> libertà che è<br />
proprio Wnc. Posso sceglierlo pari al minimo o pari ad un valore grande a piacere. A seconda <strong>dei</strong><br />
casi, avrò una cella piccola (capace <strong>di</strong> pilotare piccola capacità) o una cella grande e capace <strong>di</strong><br />
pilotare gran<strong>di</strong> carichi. Per la nostra gate allora abbiamo un grado <strong>di</strong> libertà. Stesso <strong>di</strong>scorso vale<br />
anche per l’invertitore <strong>di</strong> figura, in cui ci sono solo 2 mos. Il PMOS viene pari al doppio in modo tale<br />
da equilibrare tphl e tplh.<br />
Il <strong>di</strong>mensionamento in figura garantisce la simmetria <strong>dei</strong> tp. Abbiamo quin<strong>di</strong> due gra<strong>di</strong> <strong>di</strong> libertà:<br />
Wnc e Wni<br />
COME SCEGLIAMO QUESTI PARAMETRI?<br />
Per partire, comincio da un invertitore poi estenderemo i risultati ad una porta qualunque.<br />
Nell’invertitore <strong>di</strong> figura il pmos è il doppio dell’nmos. Inolte, l’invertitore è ad area minima (infatti<br />
Wn è pari a W0). Le L ovviamente sono minime (fuori <strong>di</strong>scussione). Per valutare i ritar<strong>di</strong>,<br />
consideriamo le capacità <strong>di</strong> carico che sono la somma <strong>di</strong> un certo numero <strong>di</strong> componenti: capacità<br />
interna alla stessa porta logica (dovuta alle <strong>di</strong>ffusioni delle regioni <strong>di</strong> drain dell’nmos e del pmos,<br />
oltre che alle interconnessioni interne) che è un termine costante perché la porta quella è, e poi c’è<br />
un termine dovuto al fanout, ovvero <strong>di</strong>pende dalle porte pilotate. Noi trascuriamo le capacità<br />
interne per semplicità. Quale sarà la capacità <strong>di</strong> ingresso del nostro invertitore? Questa sarà pari<br />
alla somma della capacità <strong>di</strong> ingresso dell’nmos e del pmos. La R0 in questo caso per l’nmos e per<br />
il pmos è uguale. Il tempo <strong>di</strong> propagazione è:<br />
Tp = 0.69 Ro (Cext) = 0.69 Ro Cgo (Cext/Cgo)<br />
Nel secondo passaggio <strong>di</strong>vido e moltiplico per la capacità Cgo. La riscrivo allora come:<br />
Tp=Tp0*h<br />
h è detto electrical effort: h=Cext/Cgo (è il rapporto tra la capacità <strong>di</strong> carico e la capacità <strong>di</strong><br />
ingresso dell’invertitore).
Tp0 è un parametro caratteristico della tecnologia, non <strong>di</strong>pende da nient’altro.<br />
h <strong>di</strong>pende solo dal <strong>di</strong>mensionamento della porta logica. Esso sarebbe il ritardo <strong>di</strong> un invertitore che<br />
pilota un altro sta<strong>di</strong>o perfettamente identico. Questo numero è in<strong>di</strong>pendente dal <strong>di</strong>mensionamento<br />
del nostro circuito, del nostro invertitore.<br />
Tpo : ritardo intrinseco: 0.69 Ro Cgo<br />
Tpo è un parametro caratteristico della tecnologia,<br />
h : electrical effort: h=Cext/Cgo<br />
h è il rapporto fra la capacità <strong>di</strong> carico e la capacità <strong>di</strong> ingresso della gate.<br />
Tp0 quin<strong>di</strong> porta in conto la tecnologia (e quin<strong>di</strong> il costo), h porta in conto il <strong>di</strong>mensionamento.<br />
Se aumentiamo le <strong>di</strong>mensioni del nostro invertitore <strong>di</strong> un fattore X che succede?<br />
La capacità <strong>di</strong> ingresso sarà maggiore <strong>di</strong> X, la R equivalente si ridurrà del fattore X. Il prodotto<br />
allora resta costante.<br />
Se aumento il sizing allora, Tp0 rimane costante e h si riduce.<br />
La formula Tp=Tp0*h ci fa capire che è<br />
facile calcolare il ritardo. Infatti, Tp0 lo<br />
calcolo una volta per tutte poiché è vero<br />
per tutta la tecnologia utilizzata, l’h<br />
invece lo calcolo volta per volta.<br />
Facendone il prodotto ottengo il ritardo<br />
dell’invertitore, o comunque della gate<br />
considerata.<br />
Tpo è un parametro caratteristico della tecnologia mentre h è il rapporto fra la capacità <strong>di</strong> carico e<br />
la capacità <strong>di</strong> ingresso della gate => h <strong>di</strong>pende dal sizing.<br />
Ve<strong>di</strong>amo cosa accade se invece dell’invertitore consideriamo una porta logica, tipo una nand a 2<br />
ingressi. Dimensioniamola in modo da renderla equivalente all’invertitore <strong>di</strong>mensionato prima:<br />
Nell’invertitore avevamo un solo <strong>di</strong>spositivo <strong>di</strong> <strong>di</strong>mensione W 0, qui ne<br />
ho 2 in serie quin<strong>di</strong> la loro <strong>di</strong>mensione sarà pari a 2W0 che in serie<br />
equivalgono a W0. Per i PMOS, la W sarà ancora pari a 2W0 in modo<br />
tale che quando conduce un solo pmos esso è equivalente<br />
all’invertitore <strong>di</strong> prima. La capacità che vedo su uno degli ingressi della<br />
nand è maggiore. In particolare è maggiore <strong>di</strong> 4/3. Il ritardo della nostra<br />
nand, quando piloto una certa capacità <strong>di</strong> uscita, sarà Tp. Come prima,<br />
moltiplico e <strong>di</strong>vido per la C <strong>di</strong> ingresso Cg,nand.
Il tutto lo riscrivo come Tp0*h*g dove g una costante e prende il nome <strong>di</strong> logical effort. Questo g<br />
mi <strong>di</strong>ce <strong>di</strong> quanto è più lenta una porta logica rispetto ad un invertitore a parità <strong>di</strong><br />
<strong>di</strong>mensionamento. Infatti, in questo caso la nand è <strong>di</strong>mensionata in modo equivalente all’invertitore<br />
ma è più lenta <strong>di</strong> un fattore 4/3!<br />
Il logical effort ricordo è il rapporto tra capacità <strong>di</strong> carico e capacità <strong>di</strong> ingresso. Per le varie porte<br />
vale:<br />
.<br />
Nel caso <strong>di</strong> una NAND a 3 ingressi NAND3 per renderla equivalente all’invertitore, gli NMOS<br />
hanno 3W perché ce ne sarannoo 3 in serie, i PMOS invece saranno uguali a prima perché nel<br />
caso peggiore ne conduce sempre uno solo.<br />
Calcoliamo la capacità relativa ad un ingresso e la capacità <strong>di</strong> ingresso dell’invertitore. Il rapporto<br />
ci dà g. Se considerassi una porta a N ingressi, si ha che la capacità complessiva è pari a 2+ N e<br />
h <strong>di</strong>venta 2+N/3 per una generica NAND a N ingressi.<br />
Ve<strong>di</strong>amo cosa accade per la NOR.<br />
Dimensioniamo la porta affinché abbia la stessa resistenza <strong>di</strong> ingresso dell’invertitore:<br />
Per gli NMOS la W è W0, per i PMOS sarà 4W0. L’h sarà 4+1/3.<br />
Se fosse una NOR a N ingressi, la W <strong>dei</strong> pmos sarebbe 2N, quin<strong>di</strong> g sarà 2N+1/3.<br />
Ve<strong>di</strong>amo un esempio <strong>di</strong> ciò che abbiamo detto. Le nand sono X volte più gran<strong>di</strong> <strong>di</strong> quella ad area<br />
minima. Quale sarà il ritardo <strong>di</strong> questo circuito?<br />
Tp0 sarà un certo numero, g <strong>di</strong>pende dalla logica (NAND<br />
a 2 ingressi: g=4/3) e h <strong>di</strong>pende da x. Per Cwire elevata,<br />
conviene prendere una X elevata. Ad ogni modo, questo<br />
ritardo non potrà essere mai inferiore a 4/3Tp0. Quin<strong>di</strong>, in<br />
sintesi, per collegamenti con capacità elevate conviene<br />
prendere <strong>di</strong>spositivi grossi, in maniera tale da ottenere un<br />
ritardo che non <strong>di</strong>pende dalla capacità delle
interconnessioni. Se le capacità delle interconnessioni sono brevi, si può scegliere un<br />
<strong>di</strong>mensionamento per i <strong>di</strong>spositivi non elevato così da ridurre l’area occupata.<br />
In formule, avremo che il ritardo della prima NAND si scriverà:<br />
Aumentando x, riduco Tp<br />
Il Tp minimo è 4/3 Tpo<br />
E’ necessario utilizzare celle con MOS gran<strong>di</strong>, quando si devono pilotare capacità elevate<br />
Calcoliamo, come esempio, il ritardo su un cammino in cui abbiamo una cascata <strong>di</strong> <strong>di</strong>verse porte<br />
logiche che in questo caso hanno tutte un <strong>di</strong>mensionamento uguale (x=1). Il ritardo per ogni porta<br />
logica Tp=Tp0*gihi.<br />
Il ritardo sul cammino è:<br />
con:<br />
quin<strong>di</strong> avremo in definitiva:<br />
Domanda: possiamo ottimizzare il ritardo con un <strong>di</strong>mensionamento <strong>di</strong>fferente? Nell’esempio in<br />
figura, il fattore <strong>di</strong> <strong>di</strong>mensionamento sarà 1 per la prima, 2 per la seconda, 3 ecc..<br />
Esiste un <strong>di</strong>mensionamento ottimo!<br />
Definiamo il logical effort complessivo che è pari alla produttoria <strong>dei</strong> vari coefficienti g ricavati<br />
prima.
Definiamo anche l’electrical effort complessivo che è invece la produttoria delle h. Questa H è<br />
molto semplice da calcolare! Infatti:<br />
Si noti che:<br />
Si può <strong>di</strong>mostrare che il <strong>di</strong>mensionamento ottimo si ha quando i ritar<strong>di</strong> <strong>di</strong> tutti gli sta<strong>di</strong> sono<br />
uguali tra loro!<br />
g1h1=g2h2= .. =(gh)opt<br />
quin<strong>di</strong>:<br />
il ritardo minimo è quin<strong>di</strong>:<br />
Ricor<strong>di</strong>amo che i ritar<strong>di</strong> sono Tp0*g*h, quin<strong>di</strong> si deve avere che sono tutti uguali i vari g*h! Si<br />
ottiene che il (gh)opt è pari alla ra<strong>di</strong>ce ennesima <strong>di</strong> GH. In questo caso, il ritardo minimo sarà pari a<br />
n volte il ritardo della singola porta logica della cascata.<br />
Questa formula ci permette <strong>di</strong> ottenere il <strong>di</strong>mensionamento ottimale, ovvero la x ottimale per le<br />
varie porte.<br />
Infatti, se per il l’invertitore 1 deve accadere che hg=1,93, esplicitando h1 e g1 si ricava X2. A<br />
seguire si ricava X3. Infine, X4. Ciò che accade è che la cella che viene fatta più grande è<br />
l’invertitore finale.<br />
Applichiamo il concetto appena visto al full-adder.<br />
NMOS: la <strong>di</strong>mensione la scriviamo come 2W0*Xc con<br />
Xc=fattore <strong>di</strong> scala(il 2 è dovuto al fatto che ci sono 2 nmos in<br />
serie, quin<strong>di</strong> per Xc=1 si ha proprio 2W0 e la W equivalente<br />
della serie viene proprio W0). Per l’invertitore finale si ha W0Xi<br />
con Xi=fattore <strong>di</strong> scala per l’invertitore.<br />
Valutiamo il logical effort rapportando la capacità degli ingressi<br />
(per es A).<br />
In questo caso è molto inefficiente poiché ci sono 4 <strong>di</strong>spositivi,<br />
due <strong>dei</strong> quali sono PMOS. Per l’ingresso B è uguale, perché è<br />
simmetrico.<br />
Per l’ingresso C invece le cose sono <strong>di</strong>verse perché esso è<br />
stato collegato ad un numero <strong>di</strong>verso <strong>di</strong> <strong>di</strong>spositivi. Si ha un g
pari a 2. L’ingresso C è privilegiato, lo sappiamo.<br />
Cerchiamo <strong>di</strong> <strong>di</strong>mensionare la nostra cella. Per farlo, ve<strong>di</strong>amo dove è inserita nell’ad<strong>di</strong>zionatore a<br />
propagazione <strong>di</strong> riporto. Il cammino più lungo<br />
sappiamo che è quello che prevede tante celle <strong>di</strong><br />
carry in cascata. Dobbiamo minimizzare il ritardo<br />
della serie delle due porte logiche Xc e Xi.<br />
Calcoliamo l’electrical effort complessivo (pari al<br />
rapporto tra la capacità finale e la capacità<br />
iniziale) e il logical effort complessivo che è il<br />
prodotto <strong>dei</strong> due. Il fattore gh ottimale è la ra<strong>di</strong>ce<br />
quadrata <strong>di</strong> GH. Sfruttiamo questo risultato per<br />
<strong>di</strong>mensionare Xi e Xc. Si noti che il ritardo minimo viene pari a 2*ra<strong>di</strong>ce<strong>di</strong>2 Tp0 (2 perché sono 2<br />
porte in cascata <strong>di</strong> pari ritardo). Il nostro ad<strong>di</strong>zionatore a propagazione del riporto non potrà mai<br />
andare più veloce <strong>di</strong> questo.<br />
Imponendo il fattore trovato, si ha che le <strong>di</strong>mensioni dell’invertitore devono essere maggiori delle<br />
<strong>di</strong>mensioni della cella carry <strong>di</strong> un fattore ra<strong>di</strong>ce<strong>di</strong>2. Si noti che non si ricava MAI il valore esatto<br />
delle 2 porte, ma si ottiene un fattore dato dal rapporto tra le due <strong>di</strong>mensioni. Si noti che conviene<br />
fare più grande l’invertitore piuttosto che la cella carry.<br />
Ricor<strong>di</strong>amo che abbiamo<br />
trascurato le capacità verso la<br />
cella somma: posso farlo solo se<br />
la Cs è molto più piccola della<br />
capacità <strong>di</strong> ingresso<br />
dell’invertitore. Da questa<br />
con<strong>di</strong>zione trovo una con<strong>di</strong>zione<br />
su Xi. In maniera analoga<br />
ragiono per Xc. Dalle due<br />
con<strong>di</strong>zioni <strong>di</strong>ciamo che: il ritardo minimo è 2ra<strong>di</strong>ce2Tp0 e lo ottengo quando le <strong>di</strong>mensioni<br />
dell’invertitore e della cella carry sono abbastanza gran<strong>di</strong> in modo da poter trascurare le capacità<br />
della cella somma ed inoltre devono essere in rapporto ra<strong>di</strong>ce2. Una scelta ragionevole è fare Xi 5<br />
VOLTE più grande del rapporto Cs/Cgo.<br />
Valutiamo infine il ritardo in cui non ci siano<br />
invertitori dal cammino critico (per portarli in<br />
serie agli ingressi, visto nella lezione <strong>di</strong> ieri).<br />
Se facciamo questa operazione, nel cammino<br />
critico c’è solo la cella carry. Se trascuriamo le<br />
capacità della cella somma, l’electrical effort è<br />
1 perché le 2 capacità sono uguali, quin<strong>di</strong> la Tp<br />
viene 2Tp0. Xc lo <strong>di</strong>mensioniamo facendo in<br />
modo che il contributo delle capacità della cella<br />
somma siano trascurabili. In definitiva togliere l’invertitore è appagante, attenzione però perché le<br />
<strong>di</strong>mensioni <strong>dei</strong> <strong>di</strong>spositivi della cella carry saranno più gran<strong>di</strong>. È vero che il circuito è più veloce ma<br />
attenzione perché i <strong>di</strong>spositivi della cella carry saranno più gran<strong>di</strong> rispetto al caso in cui ci sono gli<br />
invertitori in serie.<br />
Trascuriamo le capacità della cella somma:<br />
Tp=Tp0*h*g=2Tp0<br />
Per poter trascurare le capacità della cella somma:
ALU<br />
Discutiamo della struttura dell’unità logica aritmetica che realizzeremo nelle esercitazioni.<br />
Questa ALU è un sistema combinatorio che <strong>di</strong>spone <strong>di</strong> due ingressi A e B a N bit (noi utilizziamo<br />
un data path a 8 bit) dove arrivano i due operan<strong>di</strong> da trattare. L’altro ingresso (co<strong>di</strong>ce operativo)<br />
espresso su m bit definisce l’operazione che si deve effettuare sui due operan<strong>di</strong> (somma,<br />
<strong>di</strong>fferenza, ecc). Avendo m bit, possiamo co<strong>di</strong>ficare 2 m operazioni possibili, anche se in realtà c’è<br />
ridondanza e le operazioni veramente<br />
possibili saranno <strong>di</strong> meno. Avremo due<br />
tipi <strong>di</strong> operazioni:<br />
Operazioni logiche: AND, XOR, …<br />
TUTTI 0, TUTTI 1…Sono<br />
operazioni molto semplici,<br />
vengono fatte su coppie <strong>di</strong> bit!<br />
Non sono nemmeno operazioni<br />
critiche dal punto <strong>di</strong> vista del<br />
ritardo<br />
Operazioni aritmetiche: somma,<br />
incremento, decremento, sottrazione. Non preve<strong>di</strong>amo la moltiplicazione o la <strong>di</strong>visione per<br />
le quali si adottano <strong>dei</strong> blocchi a parte. In questo corso vedremo più avanti come vengono<br />
realizzati i moltiplicatori. Con queste poche operazioni elementari realizzate in hardware<br />
possiamo affidarci a cicli software per realizzare per es la moltiplicazione come<br />
successione <strong>di</strong> somme. Le operazioni <strong>di</strong> incremento e decremento sono fondamentali per<br />
accesso ad in<strong>di</strong>ci <strong>di</strong> matrici ecc.<br />
Le operazioni aritmetiche sono più complicate delle logiche, saranno il collo <strong>di</strong> bottiglia della ALU in<br />
termini <strong>di</strong> velocità.<br />
Per le operazioni aritmetiche, è importante vedere quale sarà la rappresentazione utilizzata per i<br />
numeri. Ne esistono <strong>di</strong>verse, ma noi utilizziamo quella in complementi alla base.<br />
Noi dobbiamo trattare numeri con segno.<br />
Per rappresentare un numero negativo si segue questo semplice algoritmo:
Nella rappresentazione in complementi alla<br />
base le cifre hanno i pesi presentati in<br />
figura. Si noti che il più significativo ha peso<br />
-32, è l’unico ad avere un peso negativo. Si<br />
capisce subito che se devo rappresentare<br />
un numero negativo, il bit più significativo<br />
deve essere per forza alto perché è l’unico<br />
a darmi un contributo negativo. Il numero<br />
più negativo è ovviamente 1000000 ovvero<br />
-2 n-1 .<br />
Ve<strong>di</strong>amo la struttura interna della nostra ALU, particolarmente semplice. Divi<strong>di</strong>amo il nostro<br />
sistema in due blocchi: uno effettua soltanto delle operazioni aritmetiche e un blocco che è<br />
progettato per eseguire solo operazioni<br />
logiche. Per le aritmetiche abbiamo 3<br />
bit <strong>di</strong> co<strong>di</strong>ce operativo, mentre ne<br />
abbiamo 4 per le operazioni logiche. Il<br />
multiplexer sceglierà quale delle 2<br />
uscite. Il bit <strong>di</strong> selezione farà parte<br />
anch’esso del co<strong>di</strong>ce operativo.<br />
Aritmetiche: con 3 bit <strong>di</strong> co<strong>di</strong>ce op. si<br />
possono effettuare max 8 operazioni,<br />
ne saranno <strong>di</strong> meno e lo vedremo.<br />
Parte Aritmetica<br />
Supponiamo <strong>di</strong> fare un circuito che sappia fare solo la somma o la <strong>di</strong>fferenza (ad<strong>di</strong>zionatore<br />
sottrattore). Per fare la <strong>di</strong>fferenza, possiamo usare ancora un ad<strong>di</strong>zionatore realizzando<br />
l’operazioni A+(-B). Quin<strong>di</strong>, prima <strong>di</strong> sommare, bisognerà cambiare segno all’operando B. Quin<strong>di</strong>,<br />
dobbiamo complementare tutti i bit <strong>di</strong> B e aggiungere un LSB. Il circuito che realizza questa<br />
operazione è a lato: si hanno un insieme <strong>di</strong> XOR<br />
dove uno degli ingressi è l’iesimo bit <strong>di</strong> B e l’altro<br />
ingresso è in comune e vale m (m ci <strong>di</strong>rà se<br />
voglio fare la somma o la sottrazione). La Xor è<br />
quin<strong>di</strong> un complementatore (ve<strong>di</strong> quad (a)). Se<br />
m=1 faccio A-B, se m=0 faccio A+B.<br />
Il blocco b-op realizza la tabella <strong>di</strong> verità sotto.<br />
Se attivo l’invert e non 0, B sarà negato, se<br />
attivo lo Zero e non l’invert tutte le uscite<br />
saranno 0, se attivo sia invert che 1 tutte le<br />
uscite saranno 1. Come possiamo realizzarlo? Usando un complementatore pilotato da Invert I<br />
(ovvero un xor con I) ma non gli mando <strong>di</strong>rettamente B, gli mando B and Zero negato.
Quali sono le operazioni aritmetiche realizzabili con<br />
questo circuito?<br />
Il nostro circuito <strong>di</strong> fatto somma A con B1 col riporto<br />
c.La tabella a lato mostra i vari casi. Il secondo caso<br />
non è molto utile, ma c’è e ce lo teniamo. Il terzo<br />
caso è molto utile. Il quarto caso incrementa A. Il<br />
quinto caso fa la sottrazione tra A e B e decrementa<br />
(anche questa non è <strong>di</strong> grande interesse). Il sesto<br />
caso fa effettivamente A – B. Il caso successivo<br />
decrementa A. L’ultimo caso restituisce ancora A.<br />
Parte logica<br />
La parte logica è il blocco booleano ed ha 4 bit <strong>di</strong> co<strong>di</strong>ce op. Il cuore <strong>di</strong> questa parte logica è<br />
realizzata da multiplexer 4 a 1. Saranno<br />
8 mux 4a1. Gli ingressi saranno f0f1f2f3<br />
mentre i bit i-esimi <strong>di</strong> A e B saranno gli<br />
ingressi <strong>di</strong> selezione. Con <strong>dei</strong> mux<br />
possiamo realizzare qualsiasi funzione<br />
logica degli ingressi perché sono blocchi<br />
universali. Per <strong>di</strong>mostrarlo, usiamo la<br />
Formula <strong>di</strong> Espansione <strong>di</strong> Shannon.<br />
Supponiamo <strong>di</strong> avere una funzione<br />
booleana (o logica) <strong>di</strong> n variabili. Questa<br />
funzione, può essere scritta come in<br />
slide. La <strong>di</strong>mostrazione è ovvia perché<br />
se X1=1 sopravvive solo il primo termine<br />
(x1*f(1,x2,x3,…,xn) mentre se è pari a 0 sopravvive solo il secondo termine.<br />
Questa OR la posso vedere come un multiplexer. Se ho quin<strong>di</strong> una funzione booleana <strong>di</strong> n variabili<br />
booleane la posso realizzare con un multiplexer e con 2 funzioni <strong>di</strong> n-1 variabili. Ragionando in via<br />
iterativa:<br />
Algebricamente accade quello visto in figura. In<br />
pratica, si ottiene una OR a 4 ingressi ognuno <strong>dei</strong><br />
quali è <strong>di</strong> n-2 variabili. Circuitalmente si realizza<br />
come in slide. In pratica, posso realizzare un<br />
multiplexer grande semplicemente mettendo in<br />
cascata tanti multiplexer semplici.<br />
Nel nostro caso abbiamo funzioni a due variabili. I<br />
termini f sono costanti. Cambiando i quattro ingressi<br />
f, riesco a fare una generica funzione <strong>di</strong> x1 e x2 che<br />
in questo caso sono gli ingressi <strong>di</strong> selezione del<br />
mux.
Ve<strong>di</strong>amo le operazioni realizzabili.<br />
Per es, se voglio fare la funzione “A”,<br />
devo mettere 1100 ad f3f2f1f0.<br />
Ve<strong>di</strong>amo come possiamo<br />
complessivamente organizzare il<br />
nostro co<strong>di</strong>ce operativo.<br />
Abbiamo in totale 4 bit per la<br />
booleana, 3 per l’aritmetica e una per<br />
il multiplexer. Si hanno quin<strong>di</strong> 8 bit. In<br />
modalità aritmetica il bit f3 è non influente (guardando già la seconda organizzazione <strong>di</strong> bit).<br />
Il sistema viene organizzato così:
Useremo un approccio bit slice come quello visto nel caso dell’ad<strong>di</strong>zionatore. I bit <strong>di</strong> controllo Zero<br />
e Invert saranno comuni a tutto l’array, quin<strong>di</strong> viaggeranno in verticale. Stesso <strong>di</strong>scorso per f0f1f2f3<br />
e per il bit <strong>di</strong> selezione sel. L’ALU a n bit sarà realizzata sovrapponendo n istanze della bit-slice. I<br />
dati viaggiano da sinistra a destra, i segnali <strong>di</strong> controllo dal basso verso l’alto.<br />
L’uscita della alu verrà inviata ad un accumulatore, la cui uscita sarà la parte A dell’alu.<br />
Possiamo vedere a lato il layout della<br />
cella accumulatore:<br />
e il datapath complessivo:<br />
La cella “accumulatore” sfrutta l’uscita della ALU<br />
ed il bus A.<br />
Il bus B non è utilizzato dall’accumulatore.
<strong>Sistemi</strong> sequenziali:<br />
temporizzazione<br />
(cap.10)<br />
In una logica sequenziale i registri sono comandati da un clock. Esistono due mo<strong>di</strong> per realizzare<br />
un sistema <strong>di</strong> memoria:<br />
Con feedback positivo<br />
basato su carica<br />
Per quanto riguarda le convenzioni sulle<br />
denominazioni:<br />
un latch è un sistema sensibile al livello del<br />
clock,<br />
un registro è sensibile ai fronti <strong>di</strong><br />
commutazione del clock.<br />
In varie letterature un circuito sensibile ai fronti <strong>di</strong> commutazione del clock è chiamato anche flipflop.<br />
Un latch ha una fase <strong>di</strong> trasparenza e una fase <strong>di</strong> memorizzazione: nella trasparenza l’uscita<br />
segue l’ingresso. In un registro o in un flip-flop invece, l’ingresso viene campionato in<br />
corrispondenza del fronte e viene riportata in<br />
uscita. L’uscita non segue più l’ingresso come<br />
per il latch.<br />
Esistono due tipi <strong>di</strong> latch:<br />
positivo<br />
negativo<br />
quello che cambia il livello del clock su cui<br />
sono in memorizzazione(e dualmente<br />
trasparenti).<br />
Noi ci riferiamo ai registri: elementi attivi sui fronti<br />
del clock. Questo perché i latch servono per<br />
realizzare i registri ma come elementi <strong>di</strong><br />
sincronizzazione si usano i registri. Parliamo ora<br />
della <strong>di</strong>namica <strong>di</strong> un registro, ovvero <strong>dei</strong> tempi<br />
caratteristici.<br />
Supponiamo un registro attivo sui fronti <strong>di</strong> salita.<br />
Nessun sistema è ideale, ovvero in grado <strong>di</strong><br />
campionare in maniera ideale il dato <strong>di</strong> ingresso,<br />
devono essere rispettati <strong>dei</strong> vincoli temporali.<br />
Innanzitutto, il dato <strong>di</strong> ingresso deve essere<br />
stabile sia per un certo tempo PRIMA del fronte<br />
del clock sia per un certo tempo DOPO del fronte<br />
del clock. In particolare, il tempo richiesto <strong>di</strong><br />
stabilità prima del fronte viene chiamato tempo <strong>di</strong><br />
setup mentre il tempo richiesto dopo il fronte<br />
viene chiamato tempo <strong>di</strong> hold. L’uscita sarà<br />
stabile dopo un certo tempo chiamato clock to q.<br />
Quin<strong>di</strong> un registro è caratterizzato da questi 3 ritar<strong>di</strong>. Se non sono rispettati questi vincoli sul tempo<br />
<strong>di</strong> setup e <strong>di</strong> hold, l’uscita sarà impre<strong>di</strong>cibile! L’uscita <strong>di</strong>viene metastabile. Inoltre il clock to q<br />
<strong>di</strong>viene imprecisato. Si ha un errore <strong>di</strong> sincronizzazione.
Un'altra applicazione tipica è quella in cui abbiamo un blocco combinatorio, un registro <strong>di</strong> ingresso<br />
e un registro <strong>di</strong> uscita. In realtà i vincoli che ora<br />
scriviamo sono vali<strong>di</strong> in generale, sia per una<br />
macchina a astati <strong>di</strong>segnata in alto sia per un<br />
circuito aperto come quello in basso.<br />
Quali sono questi vincoli da rispettare affinché il<br />
circuito operi correttamente?<br />
Nell’esempio, si ha un banco <strong>di</strong> registri a n bit, il<br />
segnale X in uscita è ancora a n bit, viene<br />
elaborato dal blocco combinatorio e poi l’uscita Y<br />
viene memorizzata nel registro 2. I parametri<br />
necessari sono quelli <strong>dei</strong> registri: il clock to q, il<br />
setup e l’hold. Poi abbiamo bisogno <strong>dei</strong> parametri<br />
del sistema combinatorio: ritardo combinatoriale<br />
massimo e ritardo combinatoriale minimo. In figura<br />
c’è una possibile evoluzione temporale. Il corrispondenza del primo pronte <strong>di</strong> <strong>di</strong>scesa del clock il<br />
dato X viene memorizzato<br />
(osserviamo che X non cambia<br />
subito dopo il clock, ma dopo<br />
1pò). Quando X varia, dopo un po’<br />
Y comincia a variare perché<br />
lavora la logica combinatoria.<br />
Dopo un po’ <strong>di</strong> tempo, la Y<br />
smetterà <strong>di</strong> commutare e sarà<br />
stabile, sarà a regime dopo un<br />
ritardo massimo. A questo punto,<br />
il nuovo valore <strong>di</strong> Y viene<br />
memorizzato nel registro numero<br />
2.<br />
I vincoli sono sul:<br />
tempo <strong>di</strong> setup: il nuovo valore deve assestarsi sufficientemente prima del fronte n+1 del<br />
clock. Questo fronte lo abbiamo dopo un T<br />
che deve essere sufficientemente grande<br />
da consentire la commutazione del<br />
registro, la commutazione <strong>di</strong> Y e deve<br />
garantire il margine sul tempo <strong>di</strong> setup. Se<br />
questa con<strong>di</strong>zione non viene verificata, si<br />
viola il tempo <strong>di</strong> setup. Si ha un errore <strong>di</strong><br />
sincronizzazione legato al tempo <strong>di</strong> setup.<br />
Questo vincolo mi stabilisce la frequenza<br />
massima del segnale <strong>di</strong> clock. Si osservi<br />
che il periodo del clock è dettato dal ritardo<br />
combinatoriale massimo. Per i registri, il<br />
loro contributo in questo caso è dato dalla<br />
somma <strong>di</strong> tq + ts. Questo parametro rappresenta la<br />
velocità del registro! Quin<strong>di</strong> un registro veloce deve<br />
avere un ritardo tq+ts il più piccolo possibile!<br />
tempo <strong>di</strong> hold: ve<strong>di</strong>amo cosa accade in corrispondenza del fronte n-esimo del clock e non<br />
n+1 come prima. Quando avviene il fronte, contemporaneamente memorizzo il valore<br />
precedente yn dell’uscita perché il clock agisce su entrambi i 2 registri. L’uscita, dopo il<br />
fronte del clock, comincerà a commutare: dobbiamo fare in modo che ci sia un tempo<br />
sufficiente in cui l’uscita rimane stabile anche dopo il fronte del clock altrimenti yn non verrà
memorizzato correttamente nel registro 2 <strong>di</strong><br />
uscita. Dopo quanto tempo l’uscita commuta?<br />
Dopo il tq + il tcminimo. Affinché il circuito<br />
funzioni bene allora, tq+tcmin deve essere<br />
sufficientemente grande: l’uscita y deve<br />
rimanere stabile per un tempo adeguato, pari al<br />
tempo <strong>di</strong> hold. In questa osservazione non<br />
entra il periodo del clock: può essere verificata<br />
o meno in<strong>di</strong>pendentemente dal periodo del<br />
clock! Se il vincolo sul tempo <strong>di</strong> hold non viene<br />
sod<strong>di</strong>sfatto, non potrò mai fare in modo che il<br />
circuito funzioni perché seppure abbassassi la<br />
frequenza del clock, le cose non cambiano! Inoltre questo<br />
vincolo è legato al ritardo minimo del sistema<br />
combinatorio! Quanto maggiore è questo ritardo minimo,<br />
meglio è. Inoltre, sono presenti due tempi caratteristici del registro: tq e th. Quanto vale il<br />
ritardo minimo? Dipende dal sistema. Ci possono essere situazioni in cui il tcmin è nullo<br />
(interconnessione): in questo caso il sistema funzionerà o meno soltanto se è verificata una<br />
con<strong>di</strong>zione che è legata soltanto i registri: tq>th.<br />
Warning: quando vedremo la non idealità del clock queste relazioni dovranno essere<br />
riviste.<br />
Riepilogando avremo:<br />
Vincolo sul tempo <strong>di</strong> setup:<br />
Vincolo sul tempo <strong>di</strong> hold:<br />
Questi vincoli impongono le seguenti con<strong>di</strong>zioni:<br />
Il vincolo sul tempo <strong>di</strong> setup determina la max frequenza <strong>di</strong> clock, che è limitata dal<br />
massimo ritardo del sistema combinatorio;<br />
La figura <strong>di</strong> merito del registro è la somma del tempo <strong>di</strong> setup+ritardo clock-to-q<br />
Il vincolo sul tempo <strong>di</strong> hold <strong>di</strong>pende dal minimo ritardo del sistema combinatorio.<br />
Con<strong>di</strong>zione più critica per il tempo <strong>di</strong> hold: ritardo combinatoriale minimo<br />
Il vincolo sul tempo <strong>di</strong> hold NON DIPENDE dal periodo del clock<br />
Se per ogni registro: Tq > Th il vincolo sul tempo <strong>di</strong> hold sembra essere automaticamente<br />
verificato.<br />
Ve<strong>di</strong>amo come valutare il ritardo minimo <strong>di</strong> un sistema combinatorio.<br />
In altri capitoli abbiamo valutato il ritardo<br />
massimo. Si procede in maniera simile. Per gli<br />
ingressi associamo i tempi <strong>di</strong> arrivo minimi (in<br />
genere <strong>di</strong>versi da quelli usati per il calcolo del<br />
ritardo massimo), per le uscite si in<strong>di</strong>cano i<br />
tempi richiesti minimi (ancora una volta <strong>di</strong>versi<br />
da quelli usati nel calcolo del ritardo max).<br />
Si fa innanzitutto il grafo <strong>dei</strong> ritar<strong>di</strong>, poi<br />
propaghiamo i tempi <strong>di</strong> arrivo e analogamente i<br />
tempi richiesti.
I tempi <strong>di</strong> arrivo li propaghiamo da sinistra a destra. Al nodo<br />
F ci sarà il tempo <strong>di</strong> arrivo minimo, in questo caso quin<strong>di</strong><br />
propaghiamo il minimo e non più il massimo <strong>dei</strong> ritar<strong>di</strong>!<br />
Ricor<strong>di</strong>amo per tracciare il grafo <strong>dei</strong> ritar<strong>di</strong>:<br />
Ad ogni nodo del circuito => un nodo del grafo<br />
Un arco del grafo => corrisponde ad una coppia I/O<br />
<strong>di</strong> una gate<br />
Peso associato all’arco => delay<br />
→<br />
Ve<strong>di</strong>amo cosa accade per i tempi richiesti: ci muoviamo da destra a sinistra e poi mettiamo il<br />
massimo come valore su ogni nodo.<br />
→<br />
Per ogni nodo abbiamo il tempo richiesto, il tempo <strong>di</strong> arrivo e lo slack questa volta definito come il<br />
tempo <strong>di</strong> arrivo meno il tempo richiesto. Infatti<br />
il segnale deve arrivare dopo il tempo<br />
richiesto. Si chiama Early slack. Osserviamo<br />
che su Y1 il vincolo sul tempo non è<br />
rispettato, infatti lo slack è negativo!! Abbiamo<br />
quin<strong>di</strong> questo nodo con uno slack pari a -30.<br />
Andando a ritroso, ve<strong>di</strong>amo che ci sono altri<br />
no<strong>di</strong> con stesso slack e che costituiscono un<br />
cammino tra ingresso e uscita. Questo<br />
insieme <strong>di</strong> no<strong>di</strong> mi definisce il cammino critico:<br />
è in sostanza il cammino più veloce del<br />
circuito!! Quando ci sono vincoli non rispettati,<br />
bisognerà cambiare il circuito in modo da rispettare questi vincoli.
Bisognerà rendere più lento quel cammino in verde.<br />
Se Early slack>0 allora i vincoli <strong>di</strong> timing sono<br />
rispettati<br />
L’insieme <strong>di</strong> no<strong>di</strong> con Early slack minimo rappresenta<br />
il CAMMINO CRITICO PER IL VINCOLO DI HOLD.<br />
Nel nostro caso abbiamo la cascata <strong>di</strong> una nand e <strong>di</strong> un invertitore. È necessario aumentare il<br />
cammino critico almeno <strong>di</strong> 30 Per rallentare, inserisco un<br />
buffer! E ne aggiungo tanti in cascata fino a quando i<br />
vincoli temporali vengono finalmente rispettati.<br />
Con l'inserimento del buffer il vincolo <strong>di</strong> timing è<br />
sod<strong>di</strong>sfatto. Risolvere i problemi <strong>di</strong> timing sul ritardo<br />
minimo è abbastanza semplice. Inserire questi buffer non<br />
è a costo zero, poiché aumentano area e potenza<br />
<strong>di</strong>ssipata! Ovviamente un'altra strada è quella <strong>di</strong> fare un<br />
down-sizing del circuito (faccio i <strong>di</strong>spositivi più piccoli). È ovvio che quando inseriamo <strong>dei</strong> buffer<br />
inseriamo una logica ridondante. Bisognerà quin<strong>di</strong> segnalare che i due invertitori non devono<br />
essere toccati perché stanno lì proprio per rallentare il cammino e non per fare logica.<br />
Si noti che inserendo <strong>dei</strong> buffer aumenta la lunghezza dell’interconnessione, aumenta anche la<br />
capacità e nascono delle interazioni tra tempo <strong>di</strong> setup e tempo <strong>di</strong> hold.<br />
Quin<strong>di</strong> in generale:<br />
Il vincolo sul tempo <strong>di</strong> hold può essere sod<strong>di</strong>sfatto in maniera relativamente semplice,<br />
inserendo <strong>dei</strong> buffer per aumentare il ritardo sui cammini più veloci.<br />
L'inserimento <strong>dei</strong> buffers aumenta l'area e la <strong>di</strong>ssipazione <strong>di</strong> potenza<br />
L'aumento dell'area aumenta la lunghezza me<strong>di</strong>a delle interconnessioni si può avere un<br />
certo peggioramento anche <strong>dei</strong> cammini più lenti (setup).<br />
Ve<strong>di</strong>amo una tecnica che permette <strong>di</strong> aumentare la frequenza operativa.<br />
Consideriamo un circuito come quello in figura a lato.<br />
Un circuito così fatto fornirà un uscita per ogni clock,<br />
nell’ipotesi che <strong>di</strong>amo dati vali<strong>di</strong> in ingresso. Il periodo<br />
minimo sarà pari al clocktoq+setup+sommaritar<strong>di</strong> massimi.<br />
Ogni T secon<strong>di</strong>, otterremo un dato valido.
La versione pipelined è fatta da datapath più<br />
piccoli: il singolo percorso è più piccolo.<br />
Se supponiamo uguali i registri, otteniamo il<br />
minimo periodo del clock come in slide. Il periodo a<br />
destra è minore perché abbiamo un solo termine<br />
relativo al ritardo combinatorio. Il circuito <strong>di</strong> destra<br />
è più veloce: ovviamente il circuito <strong>di</strong> destra deve<br />
restituire un risultato valido.<br />
Supponiamo <strong>di</strong> mettere A1 e B1 in ingresso: dopo<br />
un clock, l’ad<strong>di</strong>zionatore avrà calcolato la somma e<br />
il primo registro potrà memorizzare. In questo ciclo<br />
<strong>di</strong> clock possiamo sia calcolare la somma sia<br />
mettere nuovi dati in ingresso. Nel clock successivo mettiamo i dati calcolati nel secondo registro,<br />
calcoliamo la somma <strong>dei</strong> secon<strong>di</strong> dati e forniamo in ingresso anche altri dati A3 e B3. Dopo un<br />
altro clock, tutto scala in avanti. Il circuito non è che è più veloce, semplicemente elabora più dati<br />
contemporaneamente. A parte i primi clock iniziali, per<br />
ogni clock abbiamo dati vali<strong>di</strong> in uscita!! Quin<strong>di</strong><br />
per<strong>di</strong>amo una latenza iniziale ma abbiamo il tutto più<br />
veloce nel caso in cui dobbiamo elaborare molto! Il<br />
pipelining come tecnica introduce una latenza ma<br />
permette <strong>di</strong> far lavorare il circuito più velocemente. È<br />
una tecnica generale che si può utilizzare per parecchie<br />
tipologie <strong>di</strong> circuiti. Tiriamo fuori la regola generale per<br />
implementarlo. Quello che si fa è:<br />
piazzare registri nel percorso critico e tagliare a metà il<br />
circuito per evitare <strong>di</strong> lasciare qualcosa fuori.<br />
Se voglio applicarlo all’ad<strong>di</strong>zionatore carry ripple, qui non è facile capire come spezzare a metà il<br />
pipeline. Nella seconda figura, ogni puntino rappresenta un livello della pipe, ovvero un registro!<br />
Ogni linea deve tagliare a metà! In sostanza bisogna tagliare proprio praticamente a metà ogni<br />
linea!! Poiché il full adder lo supponiamo come blocco atomico (non tagliabile), il periodo minimo<br />
del clock è pari a quello dato dall’espressione in figura.<br />
Quin<strong>di</strong> in pratica con la pipelining aumento la Fclk ma introduco latenza.<br />
Possiamo considerare un esempio <strong>di</strong> pipelining per un adder carry-ripple.<br />
Avremo per il Tmin:<br />
Ogni punto corrisponde ad un registro e tutti i<br />
registri hanno il clock in comune.
Elementi <strong>di</strong> non-idealità del clock<br />
Immaginiamo il clock come segnale ideale: frequenza fissa e attiva simultaneamente tutti i registri<br />
del circuito.<br />
Non è così ovviamente, ecco<br />
perché devo portare in conto varie<br />
non idealità:<br />
Clock skew: non idealità<br />
dovuta al ritardo sul sistema<br />
<strong>di</strong> <strong>di</strong>stribuzione del clock, ha<br />
una componente<br />
deterministica(pre<strong>di</strong>cibili in<br />
fase <strong>di</strong> progetto) ed una<br />
casuale;<br />
Clock jitter: Variazione temporale fra due fronti consecutivi del clock (frequenza non<br />
perfettamente costante): modulation + random noise. Si <strong>di</strong>stinguono:<br />
o Jitter cycle-to-cycle (short-term) tJS, massima <strong>di</strong>fferenza del periodo tra due cicli <strong>di</strong><br />
clock successivi<br />
o Jitter assoluto<br />
Se consideriamo due clock che si trovano nel mio circuito, essi saranno sfalsati tra loro, inoltre ci<br />
sarà una componente aleatoria nell’istante <strong>di</strong> commutazione.<br />
Il clock non è ideale per molti motivi: normalmente ho un generatore <strong>di</strong> clock unico e una rete <strong>di</strong><br />
<strong>di</strong>stribuzione che consiste in buffer, linee <strong>di</strong> interconnessione ecc. Ogni linea finirà su flip flop più<br />
gran<strong>di</strong> o minori. Le cause quin<strong>di</strong> sono: generatore, incertezze legate ai <strong>di</strong>spositivi che pilotano le<br />
linee, linee stesse, alimentazione che causa rimbalzi, accoppiamento capacitivo, temperatura, flip<br />
flop <strong>di</strong> carico.<br />
Quando si progetta l’albero <strong>di</strong> clock vorremmo<br />
ottenere che il clock arrivi in maniera<br />
SINCRONA a tutto il circuito. Non ci interessa<br />
molto che ci sia ritardo tra il generatore e il pin<br />
vero e proprio!<br />
Tra le cause dello skew troviamo:<br />
interconnessioni e buffer delle linee potrebbero non essere bilanciati: i percorsi alcuni<br />
saranno più veloci <strong>di</strong> altri. Capiamo che è un fattore deterministico che in fase <strong>di</strong><br />
progettazione si può risolvere;<br />
variazioni <strong>dei</strong> parametri <strong>dei</strong> <strong>di</strong>spositivi che causeranno <strong>di</strong>fferenti ritar<strong>di</strong> (casuale);<br />
delle wire saranno più lunghe <strong>di</strong> altre quin<strong>di</strong> le C e le R possono variare rispetto ai valori<br />
attesi(casuale).<br />
Il problema del jitter è che il clock lo vedo come una componente me<strong>di</strong>a e una aleatoria a me<strong>di</strong>a<br />
nulla. Il jitter assoluto quin<strong>di</strong> è uno scostamento assoluto mentre il jitter ciclo a ciclo è la <strong>di</strong>fferenza<br />
del periodo tra due clock consecutivi ed è quello più importante.<br />
Il periodo del clock non è costante: ha un valore me<strong>di</strong>o T cui si somma una componente aleatoria<br />
a me<strong>di</strong>a nulla (jitter):<br />
jitter assoluto: massimo scostamento del periodo rispetto al valore me<strong>di</strong>o<br />
jitter cycle-to-cycle: massima variazione fra due perio<strong>di</strong> consecutivi del clock.
Le cause del jitter sono:<br />
generatore che non dà una forma perfettamente quadra;<br />
Vdd che può variare nel tempo a causa <strong>di</strong> rimbalzi e produrre <strong>di</strong>fferente ritardo nei buffer;<br />
temperatura; accoppiamento capacitivo tra le linee del clock e le altre linee. Questo dà<br />
fasti<strong>di</strong>o perché è una capacità NON costante!! Se ho una commutazione su un nodo che è<br />
accoppiato ad un altro nodo, a seconda delle commutazioni c’è un effetto capacitivo<br />
<strong>di</strong>verso! L’abbiamo visto nell’accoppiamento capacitivo tra linee.<br />
Variazioni <strong>dei</strong> ritar<strong>di</strong> dovute a variazioni della temperatura;<br />
Variazioni <strong>dei</strong> ritar<strong>di</strong> dovute a cross-coupling con linee a<strong>di</strong>acente (effetto Miller).<br />
Come si gestiscono queste 2 non idealità?<br />
Clock skew<br />
Lo skew ha alcune cause deterministiche: supponiamo <strong>di</strong> aver ottenuto le due situazioni in figura.<br />
Nella prima figura abbiamo un delay crescente man mano che mi sposto lungo il datapath del<br />
circuito, avremo quin<strong>di</strong> il cosiddetto Positive skew:<br />
Nella figura in basso il delay decresce man mano che mi sposto lungo il datapath. La <strong>di</strong>rezione <strong>di</strong><br />
riferimento è quella lungo cui si propagano i dati, avremo quin<strong>di</strong> il cosiddetto Negative skew:<br />
Per quanto riguarda il<br />
Positive skew la situazione<br />
che si presenta è<br />
rappresentata in figura:<br />
È come se il periodo del<br />
clock si fosse allungato!<br />
Perché il tempo che la rete<br />
combinatoria ha a<br />
<strong>di</strong>sposizione è quello che<br />
va da un fronte all’altro (in rosso), in pratica il periodo è determinato dai fronti <strong>di</strong> salita 1 e 4.<br />
Caso duale: se lo skew è<br />
negativo, è come se il<br />
periodo del clock si fosse<br />
ridotto, come ve<strong>di</strong>amo in<br />
figura:
Ve<strong>di</strong>amo gli effetti del positive skew:<br />
Per il tempo <strong>di</strong> hold, il delta deve essere minore <strong>di</strong> una certa quantità!<br />
Ricapitolando:<br />
Per il vincolo sul tempo<br />
<strong>di</strong> setup si ha un<br />
beneficio con skew<br />
positivo: la regola si<br />
mo<strong>di</strong>fica infatti come in<br />
slide. Al crescere del<br />
ritardo delta il circuito<br />
può andare più veloce o<br />
comunque la<br />
<strong>di</strong>suguaglianza è più<br />
facile da verificare.<br />
Se questa relazione non si verifica, il circuito non funziona<br />
proprio!! Usare lo skew per andare più veloci quin<strong>di</strong> può<br />
causare grossi problemi sul funzionamento del circuito<br />
stesso!!<br />
Uno skew positivo (Δ>0) è benefico per le prestazioni (posso aumentare la frequenza <strong>di</strong> clock,<br />
sebbene <strong>di</strong> poco) ma è MOLTO pericoloso per il funzionamento del sistema (vincolo <strong>di</strong> hold).<br />
Uno skew negativo (Δ
Le formule da usare quale saranno? Supponiamo <strong>di</strong> conoscere in linea <strong>di</strong> massima lo skew e jitter:<br />
Devo ragionare sempre in via peggiorativa. Nella formula sottraggo 2 volte il jitter perché ho due<br />
fronti del clock. Si vede che il periodo <strong>di</strong> clock peggiore.<br />
Ci dobbiamo assicurare che il tempo combinatoriale<br />
minimo sia abbastanza grande. Se non dovesse<br />
esserlo, aggiungiamo <strong>dei</strong> buffer.<br />
Immagineremo che la frequenza massima sia limitata anche da jitter e skew!<br />
Spesso, per fare ciò, devo inserire della logica fittizia(buffer) per aumentare il ritardo<br />
combinatoriale minimo:<br />
Distribuzione del clock<br />
Come <strong>di</strong>stribuisco, quale strategia uso per <strong>di</strong>stribuirlo in un circuito integrato con molti transistor e<br />
molto estesi come superficie? La strategia deve ridurre lo skew nelle componenti note (non<br />
aleatorie) e si può usare una: strategia con <strong>di</strong>stribuzione ad albero in modo che il ritardo tra il<br />
generatore e il flip flop sia sempre uguale. I flip flop sono le foglie. Per fare ciò, devo sapere dove<br />
sono i flip flop sul silicio esattamente; una strategia con <strong>di</strong>stribuzione a griglia: si cerca <strong>di</strong> fare i<br />
ritar<strong>di</strong> quanto più piccoli è possibile. Si useranno <strong>dei</strong> buffer molto grossi in grado <strong>di</strong> erogare molta<br />
corrente!<br />
Immagino <strong>di</strong> avere 2 registri piazzati in due punti <strong>di</strong>fferenti. Dopo il buffer, ci saranno le 2 wire che<br />
arrivano ai due registri. Avremo una C <strong>di</strong> carico <strong>dei</strong> registri <strong>di</strong>verse e quelle della linee <strong>di</strong>verse. Si<br />
può schematizzare la linea con una rete a T.
→<br />
Per calcolare lo skew tra le due foglie dell’albero, bisogna valutare il ritardo che il clock impiega per<br />
arrivare nei due punti e farne la <strong>di</strong>fferenza.<br />
Dal circuito <strong>di</strong> sinistra ricaviamo(Elmore delay):<br />
Facendo la <strong>di</strong>fferenza tra le due espressioni, lo skew avrà l’espressione:<br />
Quanto vale? Non si capisce, però il ritardo skew che si ottiene <strong>di</strong>pende dalle capacità <strong>di</strong> carico e<br />
soprattutto dalle capacità e dalle resistenze delle LINEE <strong>di</strong> interconnessione!<br />
Per avere una idea, mettiamo <strong>dei</strong> numeri e<br />
ve<strong>di</strong>amo cosa otteniamo: supponiamo <strong>di</strong><br />
avere <strong>dei</strong> flip flop realizzati con latch a porte<br />
<strong>di</strong> trasmissione (quin<strong>di</strong> sono 8 pmos e<br />
8nmos).<br />
Calcolate le C, portiamo in conto anche la<br />
resistenza per fare due conti. Ho linee in<br />
metal1, supponiamo che la prima linea sia<br />
anche più corta e supponiamo <strong>di</strong> ottenere<br />
quelle resistenze. Lo skew è <strong>di</strong> 25.50 ps! Se<br />
usassimo un registro da 64 lo skew <strong>di</strong>venta veramente grosso!! Se scambiamo però le 2 linee,<br />
possiamo andare molto meglio, e otteniamo uno skew che è più piccolo del primo caso!
Si vorrebbe quin<strong>di</strong> bilanciare tutti i ritar<strong>di</strong>, tutte le foglie dell’albero. Una topologia realizzativa<br />
dell’albero è quello dell’albero ad h: ho il clock che tramite un buffer è collegato alla parte centrale<br />
dell’h, poi alla fine <strong>di</strong> ogni linea verticale ho delle h, se si va a<br />
vedere, i percorsi dal centro alla foglia sono sempre gli stessi! Se<br />
sulla singola foglia dell’albero ho registri <strong>di</strong>versi, dovrò compensare<br />
usando <strong>dei</strong> buffer <strong>di</strong>versi. Se i no<strong>di</strong> cui <strong>di</strong>stribuire il clock non sono<br />
perfettamente identici, si può agire sul sizing degli invertitori e sulle<br />
interconnessioni per bilanciare i ritar<strong>di</strong>.<br />
Supponiamo queste 2 situazioni: il clock ha una capacità piuttosto<br />
elevata (in alto) e l’invertitore è 4x. Le capacità in<strong>di</strong>cate in basso<br />
sono quelle delle linee <strong>di</strong> trasmissione. Per questo esempio e la<br />
maggior parte <strong>dei</strong> progetti così si comportano, si trascurano le<br />
resistenze. Calcoliamo allora il ritardo con l’elettrical effort (il logical<br />
dovrebbe essere sempre 1 perché sono invertitori).<br />
La capacità <strong>di</strong> gate <strong>di</strong> un invertitore 1X sia 10fF<br />
Il tempo caratteristico della tecnologia (ritardo <strong>di</strong> un<br />
inverter che pilota un altro inverter identico):<br />
t0=10ps<br />
La figura riporta le sole capacità <strong>di</strong><br />
interconnessione, cui vanno aggiunte<br />
la capacità <strong>di</strong> ingresso degli inverters e <strong>dei</strong> registri<br />
Trascuriamo le resistenze delle interconnessioni,<br />
per semplicità.<br />
Valutiamo i ritar<strong>di</strong>:<br />
Valutiamo la <strong>di</strong>fferenza:<br />
Per migliorare questo skew, basta cambiare le <strong>di</strong>mensioni dell’invertitore in rosso. Lo porto da area<br />
minima a 2x, così ottengo che il primo ritardo nella Ta<br />
peggiora ma migliora <strong>di</strong> molto e complessivamente il<br />
ritardo verso il punto a è <strong>di</strong>minuito quin<strong>di</strong> lo skew è<br />
passato a 7.5ps! cambiando le <strong>di</strong>mensioni <strong>dei</strong> buffer<br />
ottengo miglioramenti notevoli!<br />
Abbiamo quin<strong>di</strong> un miglioramento:
Abbiamo detto che la seconda strategia per <strong>di</strong>stribuire il clock<br />
è quella in cui si vuole minimizzare il ritardo dal generatore <strong>di</strong><br />
clock verso tutte le foglie! Si fa una griglia con capacità molto<br />
elevata perché copre tutto il chip: <strong>di</strong>ssiperà molto. La<br />
strategia <strong>di</strong>ce che se minimizzo tutti i ritar<strong>di</strong>, questi saranno<br />
uguali tra loro! Inoltre, poiché la griglia copre tutto, se in<br />
ultima fase <strong>di</strong> progetto devo cambiare un mos o un qualcosa,<br />
non devo toccare nulla perché alla fine la griglia sta ovunque<br />
e sto coperto!<br />
Il driver centrale è quello che fa da carico al generatore del clock, e<br />
poi ci sono le due SPINE (le due linee<br />
fatte tutte <strong>di</strong> buffer).<br />
Si noti come in questo esempio la capacità è dell’or<strong>di</strong>ne<br />
<strong>dei</strong> nF e la potenza <strong>di</strong>ssipata è il 40 % della totale!!! Si<br />
usano due livelli <strong>di</strong> <strong>di</strong>stribuzione: c’è un primo sta<strong>di</strong>o <strong>di</strong><br />
buffer più piccoli che pilotano un secondo sta<strong>di</strong>o <strong>di</strong> buffer<br />
più gran<strong>di</strong> che pilotano tutto. Il driver misura 58mm<br />
complessivamente!<br />
Lo skew non è del tutto ottimizzato. Se<br />
il ritardo massimo è basso, lo skew<br />
complessivo è piccolo a piacere ma<br />
ovviamente più abbasso l’immagine più<br />
<strong>di</strong>ssipo!<br />
Esistono più strategie utilizzate: quella vista è la<br />
centrale, si usa un solo driver centrale; nota i valori <strong>di</strong><br />
capacità <strong>di</strong>versi e i valori <strong>di</strong> potenza <strong>di</strong>ssipata <strong>di</strong>versi.<br />
Per capire quanto può essere grande lo skew in un<br />
circuito integrato in funzione della frequenza del<br />
processore, ve<strong>di</strong>amo il grafico. Il valore percentuale<br />
rientra SEMPRE nella fascia del 10% del periodo <strong>di</strong><br />
clock, ovviamente se aumenta la frequenza, in<br />
valore assoluto questo skew <strong>di</strong>minuirà!
Con una <strong>di</strong>stribuzione perfettamente bilanciata la<br />
temperatura non è il fattore che incide <strong>di</strong> più, bensì<br />
incide maggiormente in assoluto il mismatch <strong>dei</strong><br />
<strong>di</strong>spositivi!<br />
Altro esempio reale<br />
che mostra come il<br />
clock nel P4 viene<br />
<strong>di</strong>stribuito: è un<br />
misto tra albero e<br />
piccole griglie.<br />
Nella tecnologia a 90nm (sempre P4) ci si mantiene sotto i 3-4 ps!<br />
Sempre nel p4, si usano tecniche specifiche: una delle cause era l’alimentazione. Si filtrano allora<br />
le variazioni sulle tensioni <strong>di</strong> alimentazioni. Quello che si sosteneva, è che se si ha un rimbalzo del<br />
10% sulla tensione <strong>di</strong> alim. Il buffer vede solo una variazione del 2%.<br />
Generazione del clock<br />
Ve<strong>di</strong>amo ora come si genera il clock. I circuiti moderni funzionano con clock <strong>di</strong> alcuni GHz.<br />
Questo crea 2 problemi:<br />
1. generazione (generatori a ridotto jitter basati sull’oscillatore al quarzo non forniscono GHz<br />
ma al max 100MHz);<br />
2. se porto il clock on board a 3GHz, devo far commutare delle capacità enormi!! Quello che<br />
si fa è generare un clock a frequenza più bassa e poi portarlo su in frequenza.<br />
La prima strada per generare il segnale <strong>di</strong> clock è usare anelli ad aggancio <strong>di</strong> fase (PLL).<br />
In pratica si utilizza un oscillatore a quarzo, per generare un segnale <strong>di</strong> riferimento a bassa<br />
frequenza, poi degli anelli ad aggancio <strong>di</strong> fase (PLL) vengono utilizzati on-chip per moltiplicare il<br />
segnale <strong>di</strong> riferimento esterno e generare il clock alla frequenza desiderata<br />
Quin<strong>di</strong> il meccanismo degli anelli ad aggancio <strong>di</strong> fase permette <strong>di</strong> moltiplicare la frequenza <strong>di</strong><br />
un’onda quadra. Sono fatti così:
Sistema a ciclo chiuso. La frequenza prodotta dall’oscillatore controllato in tensione (VCO) viene<br />
controllata in modo tale che, in con<strong>di</strong>zioni <strong>di</strong> aggancio i segnali “reference clock” e “local clock”<br />
sono identici (stessa frequenza e fase).<br />
Poiché la frequenza del “local clock” è pari a quella del “system clock”/N, in con<strong>di</strong>zioni <strong>di</strong> aggancio<br />
la frequenza del “system clock” è N volte quella del “reference clock”.<br />
I PLL sono sistemi misti Analogico-Digitali (la tensione <strong>di</strong> controllo del VCO è un segnale<br />
analogico, il filtro <strong>di</strong> anello è un filtro RC ecc.).<br />
Il filtro <strong>di</strong> anello deve essere progettato in modo da garantire la stabilità del sistema. Inoltre dal filtro<br />
<strong>di</strong> anello, oltre che dal VCO, <strong>di</strong>pende il jitter del “system clock”.<br />
I PLL:<br />
1. vengono messi in ingresso ai circuiti <strong>di</strong>gitali per elevare la frequenza del clock;<br />
2. serve per <strong>di</strong>stribuire il clock a due <strong>di</strong>spositivi <strong>di</strong>gitali ed avere un sincronismo. Il pll fa da<br />
buffer senza ritardo. I due clock in ingresso <strong>dei</strong> sistemi <strong>di</strong>gitali sono esattamente in fase! Il<br />
buffer ovviamente mi servirà sempre, per rendere uguali i ritar<strong>di</strong> però annullo i ritar<strong>di</strong> <strong>dei</strong><br />
buffer con i pll.<br />
3. posso usare il pll per sincronizzare il trasferimento dati tra 2 circuiti.<br />
I PLL operano come <strong>dei</strong> buffer a ritardo nullo. Il trasferimento dati fra chip1 e chip2 avviene a<br />
frequenza inferiore rispetto al system clock. I dati<br />
trasmessi sono sincroni con il reference clock<br />
Nel chip 2 si utilizza un PLL per annullare gli<br />
effetti del ritardo del clock buffer (de-skewing): il<br />
segnale <strong>di</strong> clock al registro del chip2 è<br />
perfettamente allineato con il reference clock,<br />
nonostante la presenza del clock buffer.<br />
Oltre ai PLL posso usare i DLL, circuiti simili che<br />
hanno una struttura simile ai pll ma non c’è<br />
<strong>di</strong>visione <strong>di</strong> frequenza e invece <strong>di</strong> avere un oscillatore controllato in tensione ho una delay line<br />
controllata in tensione. Ve<strong>di</strong>amo il confronto degli schemi a blocchi:<br />
Riferendoci allo schema del DLL possiamo <strong>di</strong>re che:<br />
Un DLL non ha un oscillatore controllato in tensione, ma una linea <strong>di</strong> ritardo controllata in<br />
tensione.<br />
In con<strong>di</strong>zioni <strong>di</strong> aggancio, fo ed fREF sono<br />
perfettamente allineati fra <strong>di</strong> loro (deskewing)<br />
I DLL non consentono <strong>di</strong> moltiplicare la<br />
frequenza <strong>di</strong> fREF<br />
Sono sistemi incon<strong>di</strong>zionatamente stabili ed<br />
affetti da minore jitter.<br />
Non posso usarli per moltiplicare il clock, ma<br />
NEL circuito posso usare i DLL per la<br />
temporizzazione/sincronizzazione!<br />
Ecco un modo per avere un buffer a ritardo nullo (VCDL: voltage controlled delay line):
Gli elementi <strong>di</strong> memoria saranno basati sulla<br />
bistabilità. Non consideriamo elementi <strong>di</strong><br />
memoria <strong>di</strong>namici.<br />
Progetto <strong>di</strong> Latch e Registri a<br />
livello Transistor<br />
Cap. 7<br />
Ricor<strong>di</strong>amo la <strong>di</strong>stinzione tra latch e registri:<br />
un latch memorizza quando il clock è<br />
basso (o dualmente alto)<br />
un registro memorizza sul fronte del<br />
clock, che sia <strong>di</strong> salita o <strong>di</strong> <strong>di</strong>scesa.<br />
Il latch lo ve<strong>di</strong>amo riportato in questa figura sotto,<br />
a porte <strong>di</strong> trasmissione. Le due porte <strong>di</strong><br />
trasmissione le possiamo schematizzare come due interruttori. Quando il clk è 1 la porta in alto è<br />
spenta mentre quella in basso è accesa. Il segnale D si riporta in uscita. Siamo quin<strong>di</strong> in fase <strong>di</strong><br />
TRASPARENZA. Viceversa, quando il clock è 0, il sistema si riconfigura come due invertitori<br />
collegati uno <strong>di</strong>etro<br />
l’altro e siamo in fase<br />
<strong>di</strong> hold. I due<br />
invertitori<br />
rappresentano<br />
l’elemento <strong>di</strong><br />
memoria. Se ci serve<br />
un latch che opera sui<br />
livelli opposti, inverto<br />
tra loro clock e clock negato. Nota che ci sono quattro <strong>di</strong>spositivi pilotati dal clock che danno una<br />
certa capacità che comporta una P<strong>di</strong>ssipata e introduce delle problematiche per il clock skew<br />
(maggiore è la capacità della linea, più <strong>di</strong>fficile è controllare lo skew).<br />
Come si può vedere vi è un elevato carico capacitivo sul clock (4 MOS), quin<strong>di</strong>:<br />
Elevata Pd per pilotare il clock<br />
Maggiori <strong>di</strong>fficoltà per clock skew<br />
Si osservi che queste due porte <strong>di</strong> trasmissione collegate in questo modo<br />
realizzano un multiplexer. Il D-Latch lo possiamo vedere logicamente<br />
come la struttura <strong>di</strong> destra.
A livello layout, è più compatto perché non dovendo<br />
mettere un contatto tra due pmos e due nmos (quei<br />
contatti necessari per fare il collegamento che poi ho<br />
eliminato). Si legge che ha un ritardo maggiore, quin<strong>di</strong><br />
una resistenza leggermente maggiore!<br />
Abbiamo visto che è presente la cascata <strong>di</strong> un<br />
invertitore con una porta <strong>di</strong> trasmissione.<br />
Questa può essere vista come tristate.<br />
Esiste allora una configurazione migliore per<br />
realizzare una porta tristate? Si, è quello <strong>di</strong> figura<br />
sotto.<br />
Come si vede dalla figura a lato il clocked<br />
inverter presenta due contatti in meno nel<br />
layout.<br />
Con questo si può anche fare un multiplexer<br />
con i clocked inverter(ve<strong>di</strong> figura sotto).<br />
In basso metto un invertitore standard al posto del clock inverted. Si risparmia il carico sul clock,<br />
non tanto l’area. Ottengo proprio un bistabile. In fase <strong>di</strong> memorizzazione non ci sono problemi.<br />
Ora si alza il clock, siamo in fase <strong>di</strong> trasparenza. In questa fase c’è un problema <strong>di</strong><br />
DIMENSIONAMENTO!<br />
Il W/L equivalente del clocked inverter (pilotato da D) deve essere più grande rispetto ai <strong>di</strong>spositivi<br />
che stanno nell’invetitore <strong>di</strong> feedback. Nel conflitto al nodo P deve essere più forte il clocked<br />
inverter!<br />
Ve<strong>di</strong>amo cosa deve accadere: questa situazione <strong>di</strong> errore<br />
vista (che il livello resta a metà e abbiamo <strong>di</strong>ssipazione <strong>di</strong><br />
potenza statica) si avrebbe solo se l’uscita dell’invrtitore in<br />
alto fosse FISSATA A 0.<br />
L’uscita <strong>di</strong>pende dal nodo P con un feedback.<br />
Se il potenziale <strong>di</strong> P si abbassa sufficientemente da essere visto come livello BASSO, l’invertitore<br />
in alto commuta e l’uscita va ad 1. In questo modo, si spegne il pmos in basso e si alza l’nmos e il<br />
nodo P va a 0!<br />
Tutto si basa su un opportuno <strong>di</strong>mensionamento a rapporto: la serie <strong>dei</strong> due nmos deve essere<br />
tale da far abbassare il potenziale P sufficientemente!<br />
Quin<strong>di</strong> il pmos deve essere piccolo, i due nmos in serie devono essere grande.<br />
E’ una delle poche applicazioni un cui si usa una L maggiore della Lminima! Questa è una rara<br />
eccezione!
Slave con porte <strong>di</strong> trasmissione:<br />
Si notino il numero <strong>di</strong> <strong>di</strong>spositivi pilotati!<br />
Ora passiamo ai registri Master-<br />
Slave. Il sistema complessivo non è<br />
mai trasparente, non c’è mai un<br />
collegamento <strong>di</strong>retto tra D e Q.<br />
L’uscita Q cambia quando lo slave<br />
<strong>di</strong>venta trasparente. Dunque, un<br />
registro master slave è realizzato<br />
con due latch attivi sul fronte <strong>di</strong><br />
salita (per es) collegati così. Se<br />
volessi farlo attivo sui fronti <strong>di</strong><br />
<strong>di</strong>scesa, devo togliere l’invertitore<br />
dal primo latch e metterlo al<br />
secondo.<br />
In basso possiamo vedere la<br />
realizzazione <strong>di</strong> un registro Master-<br />
Questa è la più semplice che possiamo realizzare. Cerchiamo <strong>di</strong> stimare in maniera<br />
approssimativa i tempi caratteristici del registro: tsetup, thold, tcq. <strong>Quelli</strong> più influenti sono il tsetup<br />
e il tcq.<br />
Facciamo un stima del tempo <strong>di</strong> setup<br />
tsetup: tempo prima del fronte del clock<br />
nel quale il dato deve rimanere stabile.<br />
Questo latch è attivo sul fronte alto del<br />
clock (per capirlo, basta vedere quando<br />
il secondo latch <strong>di</strong>venta trasparente,<br />
ovvero quando la porta T3 è aperta!)<br />
Inizialmente siamo nella con<strong>di</strong>zione in<br />
cui Clock=0. Se il clock è 0, il dato <strong>di</strong> ingresso fluisce attraverso T1 e I3 ed è <strong>di</strong>sponibile a I4. Nota<br />
che il dato <strong>di</strong> ingresso è <strong>di</strong>sponibile anche a I2 ma T2 è spenta. Appena commuta il clock (<strong>di</strong>venta<br />
1), la porta T2 si apre e se il dato è stabile da parecchio non ci sono problemi perché in ingresso e<br />
in uscita alla T2 ho lo stesso livello logico!! Se invece il dato commuta in prossimità del clock, in<br />
ingresso e in uscita <strong>di</strong> T2 posso avere segnali <strong>di</strong>fferenti e non so cosa succede! Il ritardo che si ha<br />
sul cammino è pari a 3 volte il ritardo dell’invertitore più un ritardo della porta <strong>di</strong> trasmissione:<br />
Ts=3Ti+Tm<br />
Tq=Ti+Tm<br />
Ve<strong>di</strong>amo il ritardo clock to q. Questo<br />
si stima come il ritardo <strong>di</strong> T3+il<br />
ritardo <strong>di</strong> I6 (in prima<br />
approssimazione).<br />
Clock to Q: in corrispondenza del<br />
fronte <strong>di</strong> salita del clock il dato deve<br />
propagarsi attraverso T3 ed I6 per<br />
raggiungere Q
Infine, ve<strong>di</strong>amo il tempo <strong>di</strong> hold. Durante il fronte <strong>di</strong> salita, T2 si chiude e T1 si apre (<strong>di</strong>sattiva). Se<br />
ciò accadesse istantaneamente, non avrei problemi.<br />
Possiamo trarre 2 conclusioni:<br />
1) la frazione <strong>di</strong> periodo consumata dal registro è estremamente grande!<br />
tsetup+tc=4ti+2tm ovvero si mangia 4 volte il ritardo <strong>di</strong> un invertitore e 2 volte il ritardo <strong>di</strong><br />
una porta <strong>di</strong> trasmissione. Il tempo minimo è proprio il tempo <strong>di</strong> hold che però non rientra<br />
nella figura <strong>di</strong> merito velocità del nostro sistema in esame.<br />
2) Posso realizzare un registro a scorrimento? Il ritardo combinatoriale è praticamente 0<br />
(tcmin=0) e la con<strong>di</strong>zione <strong>di</strong>venta quello <strong>di</strong> figura. Se però c’è un ritardo sul clock, la<br />
con<strong>di</strong>zione cambia!<br />
In definitiva, sul master slave ho grande carico, il sistema è lento perché il tempo <strong>di</strong> setup è grande<br />
(ma anche il tcq), è robusto!<br />
Possiamo vedere il grafico del ritardo Tcq:<br />
e come la variabilità del segnale <strong>di</strong> ingresso<br />
possa inficiare il corretto funzionamento del circuito:<br />
VIOLAZIONE DEL TEMPO DI<br />
SETUP<br />
FUNZIONAMENTO CORRETTO
C’è un'altra problematica che ve<strong>di</strong>amo sul flip flop: Clock e clock<br />
negato non sono esattamente uno l’inverso dell’altro, ci sono<br />
degli istanti <strong>di</strong> tempo in cui si sovrappongono a causa proprio<br />
dell’inserimento dell’invertitore sulla linea <strong>di</strong> clock!!<br />
A causa <strong>di</strong> queste “finestre”, potrebbe accadere che:<br />
sono trasparenti entrambi i latch e il dato <strong>di</strong> ingresso<br />
potrebbe scappare verso l’uscita durante il fronte<br />
sbagliato!<br />
durante la fase <strong>di</strong> sovrapposizione 1-1, tutti gli nmos delle porte <strong>di</strong> trasmissione conducono!<br />
Analogamente, se ci sono fasi in cui clock e clock negato sono entrambi 0, conducono tutti i<br />
pmos! E cosa succede in questi casi?? Problema!!<br />
L’unico modo che abbiamo per fare in modo che il circuito funzioni correttamente, è rendere<br />
questa fasi brevissime: posiziono questo invertitore vicinissimo ai latch, le <strong>di</strong>mensioni vanno scelte<br />
in maniera molto critica e soprattutto vanno fatte simulazioni da tutti i punti <strong>di</strong> vista!<br />
Reset sincrono ed ascincrono<br />
Il reset serve per inizializzare un registro, per portare tutte le uscite a 0. Non è sincrono.<br />
Se il reset è alto, metto D a 0. Q non va a 0, andrà a 0 al successivo fronte del clock. Il reset<br />
SINCRONO non ha problemi <strong>di</strong> sorta riguardo la realizzazione hardware. Il mux non è altro che<br />
una and.<br />
Il reset serve per portare il registro in uno stato predefinito (Q=0)<br />
Reset sincrono: il comando <strong>di</strong> reset non è efficace<br />
imme<strong>di</strong>atamente, ma in corrispondenza del successivo fronte<br />
attivo del clock<br />
Reset asincrono: cambia lo stato del registro, portando Q=0, in<strong>di</strong>pendentemente dal clock<br />
Il reset asincrono deve funzionare anche<br />
quando non c’è clock. Si deve mo<strong>di</strong>ficare<br />
quin<strong>di</strong> la struttura interna del registro.<br />
Per effettuare il reset asincrono devo:<br />
spezzare i loop <strong>di</strong> reazione<br />
portare lo stato <strong>dei</strong> no<strong>di</strong> interni ai valori<br />
in figura<br />
La soluzione al problema è riportata in figura a lato: al posto dell’altro invertitore che stava nel loop<br />
<strong>di</strong> retroazione metto una NOR il cui ulteriore<br />
ingresso è il reset. Se questo reset vale 0,<br />
dobbiamo verificare che il sistema si comporti<br />
normalmente: in questo caso,la NOR è a tutti gli<br />
effetti un invertitore. Quando il reset è 1, i no<strong>di</strong><br />
in uscita alle NOR si resettano e vanno a 0. Si<br />
noti che rispetto a prima non ci sono invertitori<br />
in serie, in questo modo ho fatto una struttura<br />
NON invertente nel complesso data dalla<br />
cascata <strong>di</strong> due blocchi invertenti.
Molto spesso è necessario introdurre un segnale <strong>di</strong> “enable” che consente, se attivo, <strong>di</strong> caricare il<br />
registro.<br />
La soluzione più intuitiva è il clock-gating che però:<br />
RICHIEDE PARTICOLARE ATTENZIONE<br />
Si introduce un clock skew rilevante<br />
Il registro può acquisire i dati in corrispondenza delle commutazioni <strong>di</strong><br />
en, invece che del clock!<br />
Il clock gating è utile per ridurre la <strong>di</strong>ssipazione <strong>di</strong> potenza (lo<br />
stu<strong>di</strong>eremo in quel contesto).<br />
Caricamento con<strong>di</strong>zionale <strong>di</strong> un registro: inserisco un nuovo segnale <strong>di</strong><br />
abilitazione che consente <strong>di</strong> caricare il registro o meno. Con la soluzione <strong>di</strong> figura, introduco un<br />
ritardo sul clock e un problema relativo all’enable (leggi in rosso). Questa tecnica è però utile per<br />
ridurre la <strong>di</strong>ssipazione <strong>di</strong> potenza: sappiamo che il segnale <strong>di</strong> clock è uno <strong>dei</strong> più critici. In questo<br />
modo, applicando per esempio l’enable ad un intero modulo, si riduce <strong>di</strong> molto la pd. Bisogna<br />
comunque stare molto attenti quando si adotta tale soluzione.<br />
Se voglio evitare <strong>di</strong> usare l’enable sulla linea <strong>di</strong> clock, uso un multiplexer<br />
sul dato <strong>di</strong> ingresso!<br />
In vhdl il caricamento con<strong>di</strong>zionale segue proprio questo schema. Se ho un<br />
processo, questo si attiva solo se cambia il clock. Avrò l’if prioritario che è<br />
sul fronte attivo del clock e un if più interno che agisce sul dato iniziale.<br />
Registri avanzati<br />
Esistono altri tipi <strong>di</strong> registri:<br />
SRAM-based<br />
Sense-amplifier<br />
Latch pulsate<br />
SRAM-based<br />
Abbiamo un bistabile fatto con 2 invertitori, i due rami del bistabile<br />
possono essere portati a 0: un ramo tramite D e clk e l’altro tramite<br />
Dnegato e clk.<br />
Il principio <strong>di</strong> funzionamento <strong>di</strong> questo circuito è:<br />
per clock=0, spengo i due nmos e il bistabile sta in<br />
memorizzazione.<br />
per clock=1, vogliamo che il sistema sia trasparente. Se per<br />
esempio D=0, l’nmos <strong>di</strong> sinistra è spento, quello <strong>di</strong> destra è acceso! Ho<br />
la serie <strong>di</strong> 2nmos accesi e cercano <strong>di</strong> portare l’uscita Q a 0. Il circuito<br />
deve essere <strong>di</strong>mensionato a rapporto! La serie <strong>dei</strong> due nmos Dnegato e<br />
clock deve essere più forte del PMOS dell’invertitore in alto (che è quello che cercherebbe<br />
<strong>di</strong> tenerlo ALTO nel caso in cui Q era 1).<br />
Si effettua un <strong>di</strong>mensionamento a rapporto, il PMOS dell’invertitore deve essere “debole” rispetto<br />
alla serie <strong>dei</strong> due NMOS.<br />
Faccio un miglioramento sul registro sram ottenendo il LATCH<br />
SINGLE TRANSISTOR CLOCKED. L’idea è semplice: metto in<br />
comune l’nmos del clock. Ho ridotto il numero <strong>di</strong> transistor e<br />
soprattutto ho ridotto il carico sul clock! Si può avere un<br />
problema: poiché ci sono proprio D e Dnegato sui rami, tra D e<br />
Dnegato ci possono essere interlap in cui per es valgono<br />
entrambi 1! E qui è critico! Allora devo rendere questi interlap<br />
brevi!
Proviamo a fare un <strong>di</strong>spositivo DUALE che è trasparente quando il<br />
clock è 0 e che non richiede l’inversiore del clock. Semplicemente<br />
realizzo una struttura alimentata al contrario.<br />
Trasparente per clk=0; memorizzazione per clk=1<br />
In trasparenza, se D=1 si ha: Q=1; Q=0<br />
Dimensionamento a rapporto: gli NMOS degli invertitori deboli rispetto<br />
alla serie <strong>di</strong> due PMOS! (i PMOS devono avere W/L molto elevati).<br />
Mettendo tutto in cascata, ottengo un registro A VERA SINGOLA<br />
FASE DI CLOCK. Non si deve avere clock e clock negato e<br />
DAVVERO non si ha<br />
sovrapposizione.<br />
Si noti che nel <strong>di</strong>spositivo DUALE ho più <strong>di</strong>fficoltà a<br />
realizzarlo, sarà più grande perché devo fare una serie<br />
<strong>di</strong> PMOS più forte <strong>di</strong> un nmos!!<br />
Si noti che QUI devo considerare tutti e 2 gli angoli <strong>di</strong><br />
processo opposti per simularlo e vedere se funziona<br />
(slow n fast p e slow p fast n).<br />
Ulteriore miglioramento <strong>dei</strong> registri SRAM: registri SRIS. Latch che<br />
non richiedono un <strong>di</strong>mensionamento a rapporto. Sono più robusti.<br />
Qui partiamo da un latch <strong>di</strong> tipo sram che avevo prima ma in più<br />
aggiungo una rete verso l’alimentazione. Con questa rete, in fase <strong>di</strong><br />
trasparenza non ho problemi <strong>di</strong> rapporto tra <strong>di</strong>spositivi!<br />
In realtà non è nient’altro che un latch SRAM con<br />
l’aggiunta <strong>di</strong> una rete in serie all’alimentazione.<br />
In fase <strong>di</strong> memorizzazione cosa accade? Bisogna stare attenti a fare<br />
in modo che gli invertitori centrali siano sempre alimentati! Ebbene,<br />
ciò accade. Quin<strong>di</strong> è una scelta molto intelligente.<br />
Funzionamento per clk=1 (trasparenza) => Se D=0 anche Q viene portato a 0. In questa<br />
fase il PMOS comandato da D è spento.Situazione analoga per D=1.<br />
Funzionamento per clk=0 (memorizzazione). Il bistabile è correttamente alimentato. Il<br />
PMOS comandato dal clock è in conduzione e conduce anche uno <strong>dei</strong> due PMOS<br />
comandati da D e NotD.<br />
Un registro si ottiene facilmente in configurazione master-slave, è necessario utilizzare un latch<br />
SRIS duale (trasparente per clk=0).<br />
I registri con logica embedded oltre a memorizzare, effettuano<br />
anche operazioni logiche sugli ingressi.
Registro Sense-Amplifier based(SA)<br />
Funzionamento per clk=0 (precarica)<br />
Funzionamento per clk: 0 => 1<br />
Due sta<strong>di</strong> in cascata<br />
Il primo sta<strong>di</strong>o è il sense-amplifier<br />
Il secondo sta<strong>di</strong>o è un latch SR a porte<br />
NAND<br />
I due PMOS del sense-amplifier sono in conduzione e<br />
portano ad 1 i due segnali NotS e NotR<br />
Il latch SR a porte NAND è in fase <strong>di</strong> memorizzazione<br />
Il sense-amplifier ha inizialmente entrambe le uscite S ed<br />
R ad 1.<br />
Se D=1, S si porta a 0 mentre R resta ad 1 (valutazione)<br />
Lo NMOS pilotato da S si spegne, ed ogni successiva<br />
commutazione <strong>di</strong> D non altera lo stato del sense-amplifier<br />
Il registro Sense-Amplifier based:<br />
Non segue l’architettura costituita da due latch in cascata, ma è comunque edge-triggered<br />
Circuito molto veloce: il tempo <strong>di</strong> setup è molto piccolo<br />
Il Ritardo clock to Q può essere migliorato sostituendo al latch costituito delle due NAND un<br />
circuito più efficace.
Pulse-Triggered Latch<br />
Breve finestra <strong>di</strong> trasparenza dopo la<br />
commurazione da 0 ad 1del clock, <strong>di</strong> durata<br />
pari al ritardo <strong>di</strong> tre invertitori.<br />
Tempo <strong>di</strong> hold pari alla finestra <strong>di</strong> trasparenza;<br />
maggiore rispetto ad un registro standard
Ad<strong>di</strong>zionatori<br />
Circuiti Aritmetici<br />
Carry ripple (ritardo proporzionale ad N)<br />
Carry select (ritardo proporzionale alla ra<strong>di</strong>ce quadrata <strong>di</strong> N)<br />
Carry skip (ritardo proporzionale alla ra<strong>di</strong>ce quadrata <strong>di</strong> N)<br />
Carry lookahead (ritardo proporzionale al logaritmo <strong>di</strong> N)<br />
Multi-operando (carry-save)<br />
Moltiplicatori<br />
A matrice (array multipliers) carry-ripple e carry-save<br />
Pipelined<br />
Veloci ad albero (Wallace, Dadda)<br />
Adder a selezione del riporto (carry select)<br />
Le somme ed il carry all’uscita del terzo blocco sono <strong>di</strong>sponibili al tempo: (MTa + Tm) + Tm<br />
= MTa + 2Tm<br />
Le somme ed il carry all’uscita dell’ultimo blocco: MTa + (P-1)Tm<br />
Ottimizzazione ritardo dell’Adder carry select<br />
T=MTa + (P-1)Tm<br />
Come posso scegliere in modo ottimale M e P, dato N?<br />
Sostituisco M=N/P e derivo rispetto a P:<br />
quin<strong>di</strong> abbiamo ottenuto:<br />
Il ritardo è proporzionale alla ra<strong>di</strong>ce <strong>di</strong> N. Il miglioramento rispetto al carry ripple è sensibile quando<br />
N è sufficientemente elevato<br />
Esempio: tm=ta/2; n=32, m*=4, p*=8, da cui un ritardo pari a: t*=7.5 ta (carry-ripple: 32 ta<br />
miglioramento <strong>di</strong> un fattore 4).<br />
C’è però un prezzo da pagare: aumento dell’area (circa doppia rispetto ad un carry ripple)<br />
E’ possibile ridurre ulteriormente il ritardo, eliminando il vincolo che tutti i blocchi siano della<br />
stessa <strong>di</strong>mensione.<br />
• Esempio. Supponiamo che Tm=Ta=1 e consideriamo la struttura iniziale<br />
(non migliorata) in cui tutti i blocchi siano da 4 bit<br />
Il segnale C8 e’ <strong>di</strong>sponibile al tempo 5. Tutti i segnali giungono contemporaneamente al<br />
multiplexer che fornisce C8.<br />
Consideriamo il multiplexer che genera C12: Il segnale <strong>di</strong> selezione è <strong>di</strong>sponibile al tempo 5,<br />
mentre gli altri due ingressi (prodotti dai due adder carry-ripple) sono <strong>di</strong>sponibili al tempo 4
E’ possibile portare il terzo blocco da 4 ad 5 bit senza peggiorare il ritardo.<br />
Introduciamo adesso il concetto <strong>di</strong> generazione e propagazione del carry in un full-adder.<br />
Cerchiamo <strong>di</strong> ricare un espressione in via ricorsiva per il calcolo <strong>dei</strong> carry <strong>di</strong> ogni bit.<br />
Introduciamo poi il Block Generate e il Block Propagate.
Avevamo scritto:<br />
Consideriamo i bit da 0 a 3 come un unico blocco:<br />
Il riporto prodotto da questo blocco sarà 1 se:<br />
Il carry si genera nel blocco (BG=1)<br />
Oppure: il carry in ingresso è alto ed il carry si propaga attraverso il blocco (BP=1)<br />
Nota Importante: il riporto prodotto dal blocco <strong>di</strong>pende dal riporto entrante se e solo se:<br />
BP=1; in questo caso riporto uscente coincide con il riporto entrante<br />
Se BP=0 il riporto del blocco potrà essere 0 oppure 1, ma non <strong>di</strong>penderà dal valore <strong>di</strong> Cin.<br />
Adder carry-skip<br />
Abbiamo visto che il riporto prodotto da un blocco <strong>di</strong>pende dal riporto entrante se e solo se: BP=1;<br />
in questo caso riporto uscente coincide con il riporto entrante.<br />
Dunque, Se BP=1 non è necessario attendere che il riporto venga calcolato all’interno del blocco,<br />
si può imme<strong>di</strong>atamente riportare il riporto entrante all’uscita del blocco.<br />
Questa osservazione è alla base dell’adder carry-skip.<br />
Come per il carry-select, l’ad<strong>di</strong>zionatore ad N bit viene sud<strong>di</strong>viso in P blocchi, ognuno <strong>dei</strong> quali<br />
opera su M bit, con: N=P*M.<br />
Ogni blocco (anche il primo) è composto da un adder a propagazione del riporto e da un mux, ogni<br />
blocco, inoltre, deve valutare il segnale <strong>di</strong> block propagate, BP.
In uscita viene fornito il riporto <strong>di</strong> ingresso (se BP=1) oppure il carry calcolato dall’adder a<br />
propagazione del riporto (se BP=0).<br />
Consideriamo la configurazione in figura. Dopo quanto tempo sarà <strong>di</strong>sponibile il segnale C12?<br />
Primo caso: BP2=0<br />
Il riporto C12 non è funzione <strong>di</strong> C8 (dato che non c’è propagazione dal secondo al terzo sta<strong>di</strong>o).<br />
Il caso peggiore che può presentarsi è che il riporto si generi nel primo bit del terzo sta<strong>di</strong>o e si<br />
propaghi attraverso tutti gli altri full-adder del terzo sta<strong>di</strong>o fino all’uscita.<br />
(in generale m_ta+tm).<br />
Secondo caso: BP2=1 e BP1=0<br />
Ritardo max: 4ta+tm,<br />
Il riporto C12 è uguale a C8, mentre C8 non <strong>di</strong>pende da C4. Il caso peggiore che può presentarsi è<br />
che il riporto si generi nel primo bit del secondo sta<strong>di</strong>o, si propaghi attraverso tutti i full-adder del<br />
secondo sta<strong>di</strong>o, attraversando due multiplexer fino a giungere a C12.<br />
(in generale m_ta+2tm).<br />
Terzo caso: BP2=1, BP1=1 e BP0=0<br />
Ritardo max: 4ta+2tm,<br />
Il riporto C12 è uguale a C8, C8 è uguale a C4, C4 non <strong>di</strong>pende da Cin<br />
Il caso peggiore che può presentarsi è che il riporto si generi nel primo bit<br />
del primo sta<strong>di</strong>o, si propaghi attraverso tutti i full-adder del primo sta<strong>di</strong>o,<br />
attraversando tre multiplexer fino a giungere a C12<br />
Quarto caso: BP2=1, BP1=1 e BP0=1<br />
Ritardo max: 4ta+3tm<br />
Il riporto C12 è uguale a C8, C8 è uguale a C4, C4 è uguale a Cin<br />
Questa era la con<strong>di</strong>zione peggiore per l’adder carry ripple. Nel caso del<br />
carry skip, Cin attraversa tre multiplexer fino a giungere a C12<br />
Tabellando i risultati ottenuti avremo:<br />
Ritardo max: 3tm
Anche in questo caso, è possibile ridurre il ritardo, eliminando il vincolo che tutti i blocchi siano<br />
della stessa <strong>di</strong>mensione.<br />
Esempio. Supponiamo che Tm=Ta=1 e consideriamo la struttura iniziale con 4 blocchi da 4 bit,<br />
allora il ritardo max è 11 per il bit S15 (S11 ha ritardo 10 ed S7 ha ritardo 9).
Nella tabella a lato possiamo vedere<br />
<strong>di</strong> come scalino i ritar<strong>di</strong> e possiamo<br />
capire dove possiamo aumentare <strong>di</strong><br />
un bit l’adder senza aggiungere<br />
ulteriore ritardo al circuito.<br />
Se ad esempio aumento le<br />
<strong>di</strong>mensioni del primo blocco,<br />
aumento i ritar<strong>di</strong> <strong>di</strong> tutte le uscite a<br />
partire da S5, ed aumento pertanto<br />
anche il cammino critico.<br />
Stesso <strong>di</strong>scorso Se aumento le<br />
<strong>di</strong>mensioni dell’ultimo blocco, aumento il ritardo <strong>di</strong> S15 ed aumento pertanto anche il cammino<br />
critico.<br />
Supponiamo <strong>di</strong> aumentare <strong>di</strong> un bit le <strong>di</strong>mensioni del secondo blocco.<br />
La nuova uscita sarà <strong>di</strong>sponibile al tempo 10 (con un ritardo inferiore a quello massimo), il ritardo<br />
del riporto all’uscita del secondo blocco, C8, non aumenta e quin<strong>di</strong> non vengono alterati i ritar<strong>di</strong><br />
delle uscite degli altri due blocchi.<br />
In definitiva, la mo<strong>di</strong>fica proposta consente <strong>di</strong> aumentare il numero <strong>di</strong> bit dell’ad<strong>di</strong>zionatore,<br />
senza peggiorare il ritardo.<br />
Supponiamo invece <strong>di</strong> aumentare <strong>di</strong> due bit le <strong>di</strong>mensioni del secondo blocco.<br />
In questo caso le nuove uscite saranno <strong>di</strong>sponibile al tempo 10 ed 11 (con un ritardo inferiore a<br />
quello massimo).<br />
Il ritardo del riporto all’uscita del secondo blocco, C8, aumenta e quin<strong>di</strong> si incrementa il cammino<br />
critico, in definitiva, questa mo<strong>di</strong>fica proposta non risulta vantaggiosa come prima.<br />
Supponiamo <strong>di</strong> aumentare <strong>di</strong> un bit le <strong>di</strong>mensioni del terzo blocco.<br />
La nuova uscita sarà <strong>di</strong>sponibile al tempo 11 (con un ritardo pari a quello massimo), il ritardo del<br />
riporto all’uscita del terzo blocco, C8, non aumenta e quin<strong>di</strong> non vengono alterati i ritar<strong>di</strong> delle<br />
uscite degli altri due blocchi.<br />
In definitiva, la mo<strong>di</strong>fica proposta consente <strong>di</strong> aumentare il numero <strong>di</strong> bit dell’ad<strong>di</strong>zionatore,<br />
senza peggiorare il ritardo.<br />
Supponiamo <strong>di</strong> aumentare <strong>di</strong> due bit le <strong>di</strong>mensioni del terzo blocco.<br />
Le nuove uscite saranno <strong>di</strong>sponibile al tempo 11 e 12 e quin<strong>di</strong> si incrementa il cammino critico<br />
mentre il ritardo del riporto all’uscita del terzo blocco, C12, non aumenta.<br />
In definitiva, la mo<strong>di</strong>fica proposta non risulta vantaggiosa.<br />
In definitiva, è possibile aumentare <strong>di</strong> un bit le <strong>di</strong>mensioni del secondo e del terzo blocco, senza<br />
aumentare il ritardo.<br />
Si può <strong>di</strong>mostrare che, in generale, è possibile aumentare le <strong>di</strong>mensioni <strong>dei</strong> blocchi compresi fra il<br />
secondo ed il penultimo. I blocchi <strong>di</strong> <strong>di</strong>mensione massima sono quelli al centro dell’ad<strong>di</strong>zionatore e<br />
la <strong>di</strong>stribuzione delle lunghezze <strong>dei</strong> blocchi è la seguente:<br />
La pendenza delle due rette in figura <strong>di</strong>pende da Tm/Ta.
Adder Carry look-ahead<br />
Ben si adatta su circuiti che devono sommare un numero significativo <strong>di</strong> bit. La struttura <strong>di</strong> base<br />
include 3 blocchi :<br />
1. calcola i segnali <strong>di</strong> generazione e propagazione <strong>di</strong> ogni bit<br />
2. sfruttando questi segnali , va a calcolare i riporti per ogni bit ( quelli entranti)<br />
3. calcola le somma con il segnale C calcolato nel secondo blocco<br />
Il primo e l’ultimo blocco non sono critici : entrambi operano solo con la cifra i-esima . (cifre che<br />
stiamo sommando) . Il ritardo sarà concentrato nel secondo blocco che calcola i riporti e lo deve<br />
fare nella maniera più veloce possibile .<br />
Come possiamo calcolare i segnali <strong>di</strong> riporto?<br />
Una prima opzione sarebbe <strong>di</strong> usare le equazioni <strong>di</strong> generazione e propagazione usate l’altra volta<br />
e <strong>di</strong> espanderle.<br />
C1 = primo bit<br />
C2 = secondo bit : lo posso espandere mettendo al posto <strong>di</strong> c1 la prima formula.<br />
Calcolo tutti i riporti in parallelo e con il ritardo <strong>di</strong> un'unica gate. Se proseguo ad espandere queste<br />
funzioni per tutti i bit che dobbiamo sommare riusciamo a fare un circuito in cui il tempo per fare la<br />
somma non <strong>di</strong>pende da N : ho N porte logiche , per ognuna , sfruttando g e p , è possibile<br />
calcolare il carry e poi con altre XOR faccio la somma e potrebbe in teoria non <strong>di</strong>pendere da<br />
N questa operazione.<br />
Questo risultato è teorico perché si vede che le funzioni logiche che calcolano i riporti <strong>di</strong>ventano<br />
più complicate quando l’in<strong>di</strong>ce cresce. Pertanto , è vero che ci vuole un'unica porta logiche
per calcolare C4 , ma il ritardo <strong>di</strong> questa<br />
porta <strong>di</strong>venta grande perchè il logical<br />
effort <strong>di</strong>venta grande ( ovvero il numero<br />
<strong>di</strong> transistori e aree crescono in maniera<br />
incontrollata) . Posso adottare questo<br />
approccio solo per pochi bit.<br />
Se ho un ad<strong>di</strong>zionatore a 4 bit posso<br />
realizzarlo come in slide ,i Blocchi<br />
servono per calcolare segnali generazioni<br />
e propagazione. Il CLA calcola i carry e<br />
per ottenere le somma serve una porta<br />
XOR . Potremmo fare qualcosa che ha ritardo che non <strong>di</strong>pende da N ma solo per 4 o 5 bit perché<br />
le porte logiche altrimenti <strong>di</strong>ventano troppo lente. Vogliamo estendere l’approccio utilizzando un<br />
numero <strong>di</strong> bit grande perché i CLA hanno senso soltanto quando il numero <strong>di</strong> bit da sommare è<br />
grande.
4bit: T=TGP + TCLA + TXOR<br />
16bit: T=TGP + 3TCLA + TXOR<br />
64bit: T=TGP + 5TCLA + TXOR<br />
in generale:<br />
T=TGP + (log2(N)-1)TCLA + TXOR<br />
Possiamo vedere lo schema <strong>di</strong> un<br />
adder CLA a 16 bit.<br />
I blocchi CLA calcolano i carry, il<br />
Block-generate ed il Blockpropagate.<br />
BG e BP non<br />
<strong>di</strong>pendono da Cin<br />
Il cammino critico è quello<br />
mostrato nella figura a lato.<br />
Il cammino critico attraversa tre<br />
blocchi CLA.<br />
Stima <strong>dei</strong> ritar<strong>di</strong>; in<strong>di</strong>co con:TGP il ritardo <strong>dei</strong> blocchi per il calcolo <strong>di</strong> gi e pi; TCLA il ritardo del<br />
blocco CLA e TXOR il ritardo della xor per calcolare la somma finale.<br />
Le limitazioni del CLA sono sicuramente:<br />
rregolarità <strong>dei</strong> collegamenti<br />
Lentezza del blocco CLA.<br />
Adder parallel-prefix<br />
Ve<strong>di</strong>amo in generale qual è il<br />
problema.<br />
Supponiamo <strong>di</strong> avere un K ingressi :<br />
. Supponiamo <strong>di</strong> avere un<br />
operatore. Esso gode della properiteà<br />
associativa ( non della commutativa<br />
eventuialmente ) e lo in<strong>di</strong>chiamo con +.<br />
Il problema parallelo ( parallel prefix<br />
problem )è: dati degli ingressi e un<br />
operatore associativo, calcolare (<br />
compute ) le K uscite come in figura<br />
sotto .<br />
La proprietà associativa significa non<br />
ha importanza l’or<strong>di</strong>ne con il quale
l’operatore è applicato ai vari operan<strong>di</strong>.<br />
Cosa a che fare questo problema con il calcolo riporti?<br />
Innanzitutto ve<strong>di</strong>amo<br />
quali sono questi<br />
ingressi ( , ) :<br />
in pratica questi<br />
ingressi saranno<br />
costituiti da una<br />
coppia <strong>di</strong> bit ( ovvero<br />
un vettore <strong>di</strong> 2 bit. Es.<br />
(g(0,0) , p(0,0) è un<br />
ingresso ). Il primo<br />
ingresso ad esempio<br />
sarà la coppia<br />
che costituiscono<br />
generate e propagate<br />
del bit meno<br />
significativo nostri<br />
operan<strong>di</strong>. Rispetto al<br />
caso precedente<br />
,quella che era X ora<br />
è una coppia <strong>di</strong> valori.<br />
Come definisco<br />
questo operatore ? E’ realizzato come una porta logica che avrà due coppie <strong>di</strong> ingressi ( 4<br />
segnali <strong>di</strong> ingresso) e fornisce una coppia <strong>di</strong> uscita ( 2 bit in uscita)<br />
Quando il segnale si alza , significa che il carry viene generato dal blocco che va da 0 a k-<br />
1 . BG e BP li abbiamo introdotti nell’ad<strong>di</strong>zionatore a salto del riporto.<br />
Definendo cosi ingresso e operatore , le uscite vengono a corrispondere ai segnali <strong>di</strong> BG e<br />
BP. Riusciamo a calcolare applicando questa tecnica i segnali <strong>di</strong> BG e BP. Una volta che li<br />
conosco, calcolare il riporto K-simo è banale perchè tale riporto k-esimo lo posso scrivere come :<br />
Posso calcolare quin<strong>di</strong> tutti i carry , poi faccio le XOR e ho tutte le somme.<br />
Se risolvo il problema “parallel prefix” con tempo <strong>di</strong> propagazione ridotto, riesco a fare anche la<br />
somma nello stesso tempo Log <strong>di</strong> N . il nostro problema è cambiato ed è quello <strong>di</strong> capire come<br />
calcolare tutte le uscite in un tempo proporzionale al numero <strong>di</strong> bit da sommare. Ve<strong>di</strong>amo che<br />
l’operatore non gode della proprietà commutativa. Se scambio <strong>di</strong> posto gli ingressi, l’uscita<br />
cambia!<br />
Prima <strong>di</strong> fare questo dobbiamo vedere se l’operatore gode <strong>di</strong> proprietà associativa. Facciamo<br />
allora la verifica :<br />
Considero questi due casi <strong>di</strong>stinti :<br />
Nel caso superiore applico l’operatore prima all’ingresso <strong>di</strong> in<strong>di</strong>ce 0 e 1 e poi il risultato<br />
all’ingresso <strong>di</strong> in<strong>di</strong>ce 2 e ottengo un uscita.
Nella versione dopo, applico prima l’operatore agli ingressi 1 e 2 e il risultato all’ingresso 0 e<br />
ottengo un'altra uscita. Se l’ operatore è associativo le uscite sono uguali perché non importa<br />
l’or<strong>di</strong>ne.<br />
Dimostriamo l’associatività visto che della proprietà commutativa non mi interessa.<br />
Applico prima gli ingressi in un modo e poi li applico al contrario. Sono identici. Le uscite sono i<br />
segnali <strong>di</strong> BP e BG sempre sui 3 bit. Dobbiamo vedere come calcolare tutte le N uscite come ci<br />
richiede il problema parallel prefix in un tempo rapido possibilmente .<br />
Focalizziamoci sul calcolo dell’ultima uscita ( dove applico l’operatore a tutti gli ingressi ) . Questi<br />
ingressi sono vettoriali. Una prima soluzione è mettere in cascata N-1 blocchi in questo modo<br />
che ve<strong>di</strong>amo a lato.<br />
Questa prima soluzione è la più<br />
imme<strong>di</strong>ata ma ha lo svantaggio <strong>di</strong><br />
essere la più lenta , il ritardo cresce<br />
con N proporzionalmente.<br />
Ha un vantaggio : l’ultima uscita y<br />
che abbiamo è quella che si ottiene<br />
applicando l’operatore a tutti gli<br />
ingressi.<br />
Questo metodo non ci fa calcolare<br />
solo questa uscita ma ci consente<br />
<strong>di</strong> calcolare tutte le N uscite. !<br />
La prima uscita è il primo ingresso ,<br />
l’altra uscita è la prima uscita , l’altra<br />
è la seconda ecc , in un colpo<br />
solo, con N-1 blocchi ottengo le uscite che mi servono! Questa purtroppo è anche la<br />
soluzione più inefficace.<br />
La seconda soluzione è la più rapida : consiste nel <strong>di</strong>sporre gli operatori secondo una struttura ad<br />
albero ovvero gli ingressi vengono elaborati in parallelo. Nella struttura ad albero se ho N ingressi ,<br />
al secondo sta<strong>di</strong>o ne ho N/2 , N/4 a quello successivo e cosi via. I segnali dopo ogni sta<strong>di</strong>o si<br />
<strong>di</strong>mezzano <strong>di</strong> volta in volta : il numero <strong>di</strong> sta<strong>di</strong> va come il log 2 <strong>di</strong> N.<br />
Questo è vantaggio! In questo esempio non lo si vede perché abbiamo 4 bit => 2 sta<strong>di</strong>. 64 bit =><br />
numero sta<strong>di</strong> da attraversare è una frazione piccola rispetto alla struttura ripple.
Caso <strong>di</strong> 8 ingressi :<br />
Dopo 3 sta<strong>di</strong> ho<br />
calcolato i segnali <strong>di</strong><br />
BP e BG.<br />
Effettivamente<br />
<strong>di</strong>sponendo ad albero i<br />
blocchi logici , calcolo i<br />
riporti con tempo log N.<br />
Inconveniente : nella<br />
struttura <strong>di</strong> slide calcolo<br />
l’uscita da 0 a 7 ma a<br />
noi servono tutte! Di<br />
uscite valide abbiamo<br />
la banale g0,p0 ,le due<br />
uscite BP e BG <strong>di</strong> slide<br />
e poi quella che va da<br />
0,1 . Questa struttura<br />
non è completa! Non<br />
riesco a calcolare tutti i<br />
riporti ma solo alcuni.<br />
Per calcolare tutte le uscite , devo aggiungere altri blocchi che usano l’operatore .<br />
Nell’aggiungere questi blocchi che servono a calcolare le altre uscite interme<strong>di</strong>e , devo fare<br />
attenzione a non incrementare il ritardo rispetto a quello relativo all’ultima uscita . In questo caso il<br />
ritardo massimo è 3 e non devo uscire fuori altrimenti perdo vantaggio.<br />
Per calcolare i riporti interme<strong>di</strong> uso un albero inverso :<br />
Ve<strong>di</strong>amo in grigio scuro i blocchi che avevamo prima.. Per calcolare altre uscite interme<strong>di</strong>e ,<br />
aggiungo blocchetti in grigio chiaro . La particolarità è che questi blocchetti sono tali che ad ogni<br />
livello ho sempre lo stesso numero <strong>di</strong> blocchi , il layout è regolare anche se le interconnessioni non<br />
lo sono. L’uscita in rosso , rappresenta gli ingressi da 0 a 2. Per gli in<strong>di</strong>ci da 0 a 3 è quello in blu,.<br />
Da 0 a 4 è quella in arancio.<br />
Supponiamo vogliamo vedere l’uscita che rappresenta gli ingressi da 0 a 6 devo trattare tutti gli<br />
ingressi con pe<strong>di</strong>ce che va da 0 a 6.<br />
In realtà esistono <strong>di</strong>fferenti mo<strong>di</strong> con i quali è possibile collegare questi blocchetti per risolvere il<br />
problema parallel prefix. Queste tipologie si ottengono collegando in maniera <strong>di</strong>versa questi blocchi<br />
:
Lo schema iniziale (in<br />
alto a sinistra) viene<br />
riportato in forma<br />
semplificata con grafo in<br />
verde. Non entriamo nel<br />
dettaglio.<br />
A lato ve<strong>di</strong>amo lo schema dell’adder<br />
parallel-prefix <strong>di</strong> Ladner-Fischer.<br />
Tutte queste varie strutture hanno tutte lo stesso ritardo log 2 <strong>di</strong> N ma <strong>di</strong>fferiscono <strong>di</strong> qualcosa.<br />
(slide 48).<br />
La cella <strong>di</strong> coor<strong>di</strong>nate 2,2 , ha fan out<br />
elevato perché deve pilotare 4 celle<br />
successive <strong>di</strong>sposte in | : è più lenta<br />
<strong>di</strong> quanto ci si aspetta. La struttura<br />
seguente :<br />
Ogni cella ha fan out solo <strong>di</strong> 2 .<br />
Otteniamo lo stesso risultato , usando<br />
più cellette , ma con fan out ridotto a<br />
2. È la più veloce .
Confronto fra gli ad<strong>di</strong>zionatori<br />
Carry ripple (ritardo proporzionale ad N). N full-adders. Layout semplice e regolare:<br />
utilizzato quando non è necessaria elevata velocità.<br />
Carry select (ritardo proporzionale alla ra<strong>di</strong>ce quadrata <strong>di</strong> N). Ha un’area circa doppia<br />
rispetto ad un carry-ripple.<br />
Carry skip (ritardo proporzionale alla ra<strong>di</strong>ce quadrata <strong>di</strong> N).Poco più lento <strong>di</strong> un carryselect.<br />
Occupa meno area <strong>di</strong> un carry select.<br />
Carry lookahead (ritardo proporzionale al logaritmo <strong>di</strong> N).<br />
Strutture adoperate in sistemi VLSI: parallel-prefix con celle base molto semplici e veloci. Kogge-<br />
Stone: fast CLA (fan-out minimo per ogni cella). Elevata occupazione <strong>di</strong> area. Scarsa regolarità del<br />
layout.<br />
I carry lookhead sono i più veloci ; c’è della logica semplice ( porta AND e porta ANDOR ). Alcune<br />
come la kogge stone riducono il fan out per ogni cella.<br />
Ad<strong>di</strong>zionatori multi-operando<br />
Supponiamo <strong>di</strong> fare la<br />
somma <strong>di</strong> 4 word. Come<br />
faccio? Uso un certo<br />
numero <strong>di</strong> ad<strong>di</strong>zionatori non<br />
uno solo . L’approccio più<br />
semplice è <strong>di</strong> usare un ADD<br />
per calcolare A+B , un altro<br />
per sommare al risultato C ,<br />
l’altro per sommare D .<br />
Altra soluzione è fare A+B<br />
parallelamente alla somma<br />
C+D per poi sommare.<br />
Supponiamo che gli adder sono a propagazione del riporto. Usiamo la struttura più semplice<br />
con l’adder più semplice :<br />
Notiamo che la somma tra A e B mi<br />
produce bit aggiuntivo : questo perché<br />
bisogna tener presente che 2 termini<br />
da 4 bit danno luogo ad un uscita su 5<br />
bit. <strong>Quelli</strong> aggiuntivi li metto a massa.<br />
Il ritardo massimo mi aspetto sia <strong>di</strong><br />
12. Nessun cammino in<strong>di</strong>viduabile<br />
però passa attraverso tutti gli ADD .<br />
Ve<strong>di</strong>amo in slide <strong>di</strong>versi cammini<br />
critici . Per quanto possiamo<br />
cambiare le possibilità , il cammino<br />
attraversa solo 8 full. Il ritardo<br />
massimo è meno pesante! Per come<br />
è realizzata la struttura quin<strong>di</strong> , non si<br />
sommano i ritar<strong>di</strong> <strong>dei</strong> 3 full adder. Il<br />
problema è che se vogliamo<br />
rendere questo adder multi<br />
operando più veloce , devo rendere più veloci tutti gli adder che lo compongono.
Ci viene allora in<br />
soccorso la tecnica<br />
carry-save che viene<br />
usata per fare delle<br />
somme <strong>di</strong> più operan<strong>di</strong>.<br />
Questa tecnica segue<br />
anch’essa l’algoritmo<br />
come la scuola<br />
elementare se devo<br />
somare più numeri, ad<br />
esempio 324 e 741,<br />
come faccio?<br />
Manualmente non<br />
sommo i primi<br />
due(324 e 741) , ma<br />
comincio a sommare<br />
tutte le cifre dello<br />
stesso peso che si<br />
trovano in verticale.<br />
Ottengo una cifra <strong>di</strong> somma e un riporto che devo sommare sulla colonna a sinistra. Questa<br />
tecnica viene adottata nelle strutture carry save. Comincio a sommare tutti i bit <strong>di</strong> peso 0. Sono 4 :<br />
a0 – d0 . non esiste un full adder con 4 ingressi ecco perché ci vuole qualcosa <strong>di</strong> più complicato.<br />
Ottengo un bit somma che ha lo stesso peso degli altri ( 0 visto che abbiamo iniziato con ingressi<br />
a0-d0) e un bit <strong>di</strong> riporto che ha peso 1. Il risultato della somma , va sommato con d0 (bit a peso<br />
0) che mi da y0 che è la cifra meno significativa.<br />
Bit peso 1 : sono a1 b1 c1 a cui sommo il riporto precedente <strong>di</strong> peso 1 e l’altro bit d1. Il bit <strong>di</strong><br />
riporto non lo invio al full adder che si trova a sinistra, ma lo invio al full <strong>di</strong> sotto. È la stessa cosa<br />
perché in quella colonna sommo bit <strong>di</strong> peso 1 ! quelli che vengono dagli sta<strong>di</strong> precedenti li sommo<br />
più in basso in modo che arrivano segnali già ritardati.In questo caso mettendolo sotto ottengo<br />
risultato con ritardo più piccolo. Ho 2 termini <strong>di</strong> peso 1 .<br />
Bit peso 2 ,3 4 : i segnali <strong>di</strong> peso 2 3 e 4 si devono sommare tra <strong>di</strong> loro. Uso ad<strong>di</strong>zionatore VMA<br />
(Vector Merging Adder) e serve per fare somma complessiva per ottenere uscita complessiva.<br />
Il vantaggio <strong>di</strong> questa struttura è che ho un unico ad<strong>di</strong>zionatore dove il riporto effettivamente si<br />
propaga da uno sta<strong>di</strong>o all’ad<strong>di</strong>zionatore . L’ad<strong>di</strong>zionatore è l’elemento critico e lo posso fare con<br />
tecnica veloce ( se devo andare veloce ) .<br />
I full che stanno sopra danno luogo a propagazione verticale e il ritardo massimo in verticale è<br />
pari al numero<br />
<strong>di</strong> termini ( 10<br />
parole da 64 bit<br />
da sommare ,<br />
ritardo<br />
proporzionale a<br />
10. ) il ritardo va<br />
con log <strong>di</strong><br />
ognuna delle<br />
parole da<br />
sommare . Il<br />
ritardo della<br />
struttura.
Moltiplicatori<br />
Ve<strong>di</strong>amo qual è il metodo con il quale realizzare la moltiplicazione <strong>di</strong> 2 numeri binari :<br />
Supponiamo che i numeri sono unsigned<br />
positivi. L’algoritmo sarà mo<strong>di</strong>ficato nel caso <strong>di</strong><br />
prodotto <strong>di</strong> numeri con segno. Seguiamo<br />
l’algoritmo elementare : allineo e faccio prodotti.<br />
Il risultato lo metto su prima riga. Procedo per<br />
altre cifre. Il termine 1 in grigio chiaro da luogo<br />
al termine grigio chiaro .<br />
La moltiplicazione si realizza calcolando i<br />
prodotti parziali che si hanno facendo i<br />
prodotti tra le singole cifre del moltiplicatore<br />
e poi sommando i prodotti parziali.<br />
Il calcolo <strong>dei</strong> prodotti parziali lo posso realizzare come una AND:<br />
Due operan<strong>di</strong> ad N-bit: risultato su 2N bit<br />
Sono necessarie N2 porte AND a due ingressi per calcolare i prodotti parziali<br />
I prodotti parziali devono poi essere sommati fra loro per ottenere il prodotto.<br />
Ve<strong>di</strong>amo la prima struttura semplice : moltiplicatore a matrice<br />
Questo tipo <strong>di</strong><br />
circuito<br />
realizza uno a<br />
uno l’algoritmo<br />
elementare<br />
della<br />
moltiplicazione<br />
. Porto un<br />
esempio <strong>di</strong><br />
due operan<strong>di</strong><br />
a 3 bit.<br />
Il circuito che<br />
viene fuori è<br />
riportato sulla<br />
destra.<br />
Abbiamo un<br />
insieme <strong>di</strong><br />
cellette. Ce ne<br />
sono 3 su ogni<br />
riga. Una ogni riga è sfalsata dalla superiore <strong>di</strong> una unità . gli ingressi a0 a1 a2 , viaggiano in<br />
orizzontale su queste righe ma gli altri ingressi vanno in <strong>di</strong>agonale.<br />
Cosa ci sarà in questa generica celletta? Nella cellette ci sarà una porta AND , che calcola il<br />
prodotto parziale bj and ai .Se ho N^2 cellette ,avrò N^2 prodotti parziali che devono essere<br />
sommati fra <strong>di</strong> loro.<br />
Per sommarli introduco nella celletta un full adder. Questo , somma il prodotto parziale con altri<br />
due segnali uno che viene alla destra della cella e uno che viene dalla parte superiore della cella<br />
stessa.
Qual’è il ritardo del moltiplicatore?<br />
Questa analisi è semplificata :<br />
Visivamente queste celle sono<br />
posizionate cosi come erano<br />
posizionati i termini prodotti parziali<br />
<strong>di</strong> 4. Devo avere cura <strong>di</strong> sommare<br />
termini dello stesso peso.
Ve<strong>di</strong>amo , come esempio far vedere che le celle non sono tra <strong>di</strong> loro uguali , un moltiplicatore su 4<br />
bit :<br />
Ve<strong>di</strong>amo una struttura che realizza la somma <strong>dei</strong> prodotti parziali con tecnica carry save che<br />
abbiamo visto prima :<br />
Ottengo in uscita i bit significativi <strong>di</strong>rettamente mentre , per le altre coppie <strong>di</strong> bit <strong>di</strong> peso omologo,<br />
esse devono essere sommate nel VMA in maniera analoga nel caso dell’ ad<strong>di</strong>zionatore multi<br />
operando carry save.<br />
Le celle elementare sono le stesse ma abbiamo l’elemento in più ovvero il VMA ad<strong>di</strong>zionatore che<br />
non c’era e che ora compare. Qual è il ritardo <strong>di</strong> questo sistema? Dobbiamo attraversare N<br />
blocchi per avere gli ingressi del VMA quin<strong>di</strong> il ritardo è pari a N Tb + VMA ritardo.
Questo è un<br />
esempio del<br />
possibile cammino<br />
critico. Le celle le<br />
attraverso in<br />
<strong>di</strong>agonale o in<br />
verticale tanto<br />
comunque sono<br />
sempre N per<br />
ottenere gli<br />
operan<strong>di</strong> del VMA.<br />
Il VMA opera su 2<br />
ingressi che sono<br />
da N bit. L’uscita<br />
complessiva è 2n<br />
bit. Se faccio<br />
questo ADD a<br />
propagazione del<br />
riporto il ritardo è<br />
proporzionale a N ,<br />
quin<strong>di</strong> il ritardo <strong>di</strong> questo va con 2N. avremmo già un miglioramento rispetto alla struttura a matrice<br />
<strong>di</strong> prima dove c’era 3n. il miglioramento massimo l abbiamo se anziché carry ripple mettiamo<br />
ad<strong>di</strong>zionatore veloce.<br />
Seconda formula , predomina il fattore NTB.<br />
Con questo tipo <strong>di</strong> circuito riesco a realizzare contemporaneamente una mo<strong>di</strong>fica : un<br />
moltiplicatore accumulatore. Un circuito che calcola al tempo stesso a per b e la somma. A*B +<br />
C.<br />
Cio è utile perché calcola somma e prodotto nello stesso tempo nel quale calcolerei solo il prodotto<br />
: la somma ci viene gratis.<br />
Se riprendo la struttura carry save <strong>di</strong> prima osservo che sulla prima riga e anche su due celle a<br />
sinistra <strong>di</strong>agonale , ci sono ingressi posti a zero che non servono , inutilizzati. Nel caso del<br />
moltiplicatore accumulatore , posso sfruttare questi ingressi per sommare la parola C come in<br />
slide 12 :<br />
In questo modo il mio sistema calcola prodotto e somma e la complessità è esattamente la stessa.<br />
I moltiplicatori sono importanti nel calcolo <strong>di</strong> operazioni signal processing. Spesso devono operare<br />
a frequenze <strong>di</strong> clock molto elevate. Abbiamo visto a suo tempo che per aumentare la f <strong>di</strong> clock <strong>di</strong>
un sistema si può usare la tecnica del pipelining : essa spezza il cammino critico quando si hanno<br />
più blocchi combinatori in cascata introducendo 2 registri in grigio scuro dell’esempio :<br />
Il ritardo si riduce perché il ritardo massimo combinatorio nel primo caso è la somma nel secondo<br />
quello che gioca è il massimo <strong>di</strong> quei 3 ritar<strong>di</strong>. Si può avere un miglioramento che viene pagato in<br />
latenza perché l’uscita non è <strong>di</strong>sponibile imme<strong>di</strong>atamente ma ci vogliono più cicli <strong>di</strong> clock per avere<br />
l’uscita.<br />
Questa techica è efficace se blocchi FGH hanno lo stesso ritardo. Per spezzare in maniera<br />
uniforme il ritardo.<br />
Ve<strong>di</strong>amo se riesco ad applicare la tecnica al moltiplicatore carry save : devo ricostruire la struttura<br />
iniziale ovvero tanti blocchi combinatori uno <strong>di</strong>etro l altro , inserisco tagli per spezzare il cammino<br />
<strong>dei</strong> dati e dove ci sono i tagli inserisco i registri <strong>di</strong> pipelining.<br />
Per realizzare correttamente e il pipelining del moltiplicatore dobbiamo riconduci a quella<br />
struttura :<br />
Nella struttura <strong>di</strong> partenza in 12 non è ovvio perchè alcuni dati piovono da sopra ( B e C) altri<br />
arrivano a metà ( a1 , a2 ) apparentemente non seguono quella struttura in cascata vista prima.<br />
Per ricondurci , dobbiamo fare operazioni su questo schema 12 altrimenti il risultato è scorretto.
Riporto tutti i segnali <strong>di</strong> ingresso da una stessa parte come in slide . Devo riportare sopra<br />
perché e già ci stanno. Lo stesso per . Una prima mo<strong>di</strong>fica è <strong>di</strong> riportare in 14 tutti i<br />
segnali sopra. Posso pensare <strong>di</strong> inserire un registro <strong>di</strong> pipeline usando taglio in ---------- spezza in<br />
due il flusso <strong>dei</strong> dati e ogni volta in cui linea orizzontale interseca segnale metto un registro <strong>di</strong><br />
pipeline , registri che sono segnati con <strong>dei</strong> pallini neri .<br />
Quanti cicli per risultato? 5 cicli ( considerando anche ingresso).<br />
Quale’è il ritardo del circuito? Vogliamo cioè sapere la F <strong>di</strong> clock al quale si può far operare<br />
questo sistema. Bisogna vedere cosa c’è tra registro e registro successivo. Ve<strong>di</strong>amo che in questi<br />
primi tagli , tra un registro e l’altro c’è un singolo blocco dove c’è nd e full adder. Questo ritardo è lo<br />
stesso in questi primi 3 tagli riportati. Nell’ultimo taglio trovo il VMA tra registro e suo successivo. Il<br />
periodo <strong>di</strong> CK allora come lo stimo ?<br />
Questa formula mi da il periodo del CK. Nel massimo normalmente vince Tvma perché il ritardo<br />
del singolo blocco non compete con un ritardo <strong>di</strong> un ad<strong>di</strong>zionatore a N bit. Da questo punto <strong>di</strong> vista<br />
, questo pipeline è stato fatto in maniera perfetta o migliorare? Nel caso migliore , tanti blocchi in<br />
cascata sono in grado <strong>di</strong> spezzare in modo che ho ritardo fra i vari blocchi uguale. In questo caso<br />
ho che il ritardo del blocco è una frazione del ritardo del VMA , non ha senso spezzare in<br />
maniera cosi fine<br />
Posso eliminare la seconda e la terza linea <strong>di</strong> taglio in modo da lasciare 3 registri : registro iniziale<br />
, registro VMA e quello finale. Se levo queste due linee come cambia la formula <strong>di</strong> prima? Al posto<br />
<strong>di</strong> tb avrei 3tb , magari dello stesso or<strong>di</strong>na <strong>di</strong> grandezza + Tvma , la freq <strong>di</strong> CK non la mo<strong>di</strong>fico ma<br />
risparmio registri e riduco la latenza.<br />
Se voglio salire ancora in fequenza posso pensare <strong>di</strong> introdurre pipelining nel VMA. VMA<br />
pipelined. Dobbiamo allora mettere anche registri su uscite accanto a VMA per bilanciare le<br />
latenza sull’uscita Y finale.<br />
Già detto. Cambia il fattore che metto accanto a. TB.
Si debba effettuare la moltiplicazione <strong>di</strong> due numeri rappresentati in complementi alla base<br />
Consideriamo un esempio con numeri rappresentati su tre soli bit.<br />
L’algoritmo della moltiplicazione in questo caso è<br />
<strong>di</strong>verso, perché i numeri non sono signed! Per la<br />
somma non c’era <strong>di</strong>fferenza, qui invece si. Si devono<br />
adottare architetture <strong>di</strong>verse a seconda se abbiamo<br />
numeri signed o unsigned. Facciamo un esempio su 3<br />
bit: sappiamo che i pesi <strong>dei</strong> 3 bit valgono -4 per il<br />
MSB, 2 e poi 1 per l’LSB.<br />
Quando facciamo i prodotti parziali tra due generici<br />
numeri su 3 bit otteniamo i prodotti parziali in slide. Si<br />
noti che alcuni <strong>di</strong> questi saranno negativi perché<br />
compaiono b2 e a2. Per ottenere il risultato finale,<br />
dovrò sommare le prime 2 righe e l’ultima e sottrarre la<br />
terza e la quarta. Questo ricor<strong>di</strong>amo che è dovuto alla presenza <strong>dei</strong> due contributi con segno (-).<br />
In pratica per sottrarre, sommiamo il numero cambiato <strong>di</strong> segno.<br />
Osservazione importante: il risultato finale del nostro prodotto sarà su 6 bit, quin<strong>di</strong> nell’effettuare<br />
questa operazione bisogna stare attenti a<br />
rappresentare questi due termini negativi<br />
sui 6 BIT complessivi!!!<br />
Ricor<strong>di</strong>amo che il numero <strong>di</strong> bit del<br />
prodotto finale è ovviamente la somma<br />
del numero <strong>di</strong> bit <strong>dei</strong> due termini.<br />
L’estensione in segno è necessaria.<br />
Per i termini col segno negativo quin<strong>di</strong>,<br />
complementiamo tutti i bit, aggiungiamo<br />
1 e poi esten<strong>di</strong>amo in segno:<br />
In pratica, pren<strong>di</strong>amo i due numeri che dobbiamo sottrarre.<br />
Complementiamo tutto, esten<strong>di</strong>amo in segno (aggiungendo un nuovo bit MSB pari a quello che<br />
c’era prima: in slide dopo aver complementato avevo “1 a1b2 a0b2 1 “, quin<strong>di</strong> devo mettere: “1 1<br />
a1b2 a0b2 1”) e sommo 1.<br />
In complementi alla base allora, per scrivere un numero su più bit, devo prendere la cifra più<br />
significativa (l’MSB) e aggiungo tanti <strong>di</strong> questi bit.<br />
Ora, dopo aver complementato i due termini negativi, non mi resta che sommare tutto.<br />
Osservazione: la sottrazione <strong>di</strong> questi 2 termini la posso ottenere anche come in slide, in cui ho<br />
messo da parte l’aggiunta degli 1 dell’estensione e l’1 che si deve sommare ogni volta che<br />
complemento. Si noti che i termini sono costanti!! E allora, possiamo sommare a parte questo<br />
fattore correttivo che sarà costante.
Fatto ciò:<br />
in definitiva sommerò tutto e aggiungerò questa costante alla fine che tiene conto della<br />
complementazione e dell’estensione in segno!!! In pratica il prodotto viene ottenuto semplicemente<br />
sommando questi termini e aggiungendo quel fattore correttivo finale. Il vantaggio è che alcuni <strong>di</strong><br />
questi termini vengono realizzati con delle NAND e non AND, in più ovviamente devo sommare<br />
una costante.<br />
Posso or<strong>di</strong>nare i vari termini per vedere il tutto su 4 righe. Questa rappresenta la matrice <strong>dei</strong><br />
prodotti parziali, ovvero l’insieme <strong>dei</strong> termini per realizzare il prodotto <strong>di</strong> due numeri con segno.<br />
Il circuito corrispondente è uguale a quello <strong>di</strong> prima, ma alcune celle INVECE DELLA AND hanno<br />
la NAND! In più devo sommare il termine costante. Osservando il termine costante, si scoprirà che<br />
questo avrà soltanto 2 cifre <strong>di</strong>verse da 0. Se avessi fatto il calcolo su 12 bit, avrei avuto sempre<br />
solo 2 bit <strong>di</strong>versi da 0!!! Il peso <strong>di</strong> questi termini è: uno è la cifra più significativa del VMA, l’altro è il<br />
riporto entrante. Si noti che il VMA aveva sia il MSB che il riporto entrante LIBERI (quando avevo<br />
numeri unsigned infatti questi erano posti a massa). Quin<strong>di</strong> l’aggiunta <strong>di</strong> questa costante ulteriore<br />
non comporta nessun aggravio!!<br />
Il moltiplicatore signed è solo una VARIANTE dell’unsigned, ha allora la stessa complessità e non<br />
richiede nessun aggravio particolare <strong>di</strong> hw.<br />
Come esercizio, pensiamo a quale potrebbe essere la struttura <strong>di</strong> un moltiplicatore in cui uno <strong>dei</strong><br />
due operan<strong>di</strong> è<br />
unsigned e l’altro è<br />
signed! Sarà un’altra<br />
variante. Si noti che<br />
la struttura del<br />
moltiplicatore non è<br />
sempre la stessa, per<br />
decidere quale<br />
architettura<br />
implementare devo<br />
sapere a priori quali<br />
numeri trattare!
La velocità del nostro circuito rimane vincolato alla velocità del VMA e a NTb, dove Tb è il ritardo<br />
del singolo blocco e N c’è perché ho il riporto che si propaga in N blocchi. Nella struttura carrysave<br />
infatti il riporto si propaga in verticale e orizzontale. Il ritardo del VMA lo facciamo logaritmico<br />
usando gli adder veloci stu<strong>di</strong>ati, il collo <strong>di</strong> bottiglia rimane allora la propagazione del riporto nei<br />
blocchi. Rimane quin<strong>di</strong> una funzione lineare <strong>di</strong> N. è importante avere <strong>dei</strong> moltiplicatori veloci,<br />
sono state sviluppate tecniche per avere moltiplicatori con ritardo funzione del log(N).<br />
Moltiplicatori veloci, o ad albero.<br />
Consideriamo <strong>di</strong> nuovo la moltiplicazione tra numeri unsigned. Le stesse tecniche possono essere<br />
adoperate anche con i signed, le <strong>di</strong>fferenze sono minimali. Ovviamente il punto su cui agire è il<br />
termine NTb. Consideriamo un esempio <strong>di</strong><br />
moltiplicatore 5x5. Rappresentiamo i<br />
termini con puntini. L’insieme <strong>di</strong> puntini lo<br />
chiamo matrice <strong>dei</strong> prodotti parziali.<br />
L’altezza è il numero <strong>di</strong> righe della matrice,<br />
pari proprio al numero <strong>di</strong> bit <strong>dei</strong> numeri.<br />
Applico una serie <strong>di</strong> trasformazioni sulla<br />
matrice ottenendo matrici equivalenti nel<br />
senso che poi sommandole ottengo lo stesso risultato.<br />
Moltiplicatore <strong>di</strong> Wallace<br />
Riduco la matrice <strong>dei</strong> prodotti parziali, utilizzando full-adder ed<br />
half-adder per sommare fra loro termini dello stesso peso. Il<br />
termine a0b0 è l’unico con peso 0 e lo porto <strong>di</strong>rettamente al<br />
livello<br />
successivo. I due termini <strong>di</strong> peso 1 vengono sommati da un<br />
half-adder, producendo un bit somma,<br />
ancora <strong>di</strong> peso 1, ed un bit carry <strong>di</strong> peso 2.<br />
(Il rettangolo in figura rappresenta un half-adder)<br />
Parto dal bit meno significativo. Questo mi dà proprio Y0,<br />
quin<strong>di</strong> lo devo riportare pari pari in uscita. Passiamo ora ai<br />
termini <strong>di</strong> peso 2 1 . Uso un half-adder e sommo i due contributi evidenziati con un rettangolo, l’halfadder<br />
(lo rappresento col quadrato) restituirà 2 termini <strong>di</strong> peso <strong>di</strong>verso (somma e cout).<br />
I tre termini <strong>di</strong> peso 2 vengono sommati da un full-adder,<br />
producendo un bit somma, ancora <strong>di</strong> peso 2, ed un bit carry <strong>di</strong><br />
peso 3. (l’ellisse in figura rappresenta un full-adder)<br />
Qualora sia possibile, è meglio utilizzare <strong>dei</strong> full-adder, che<br />
riducono il numero <strong>dei</strong> prodotti<br />
parziali (da 3 a 2): full-adder = compressore 3->2.<br />
Proce<strong>di</strong>amo allo stesso modo per i bit <strong>di</strong> peso maggiore. L’altezza<br />
della matrice <strong>dei</strong> prodotti parziali è passata da 5 a<br />
4.
Applico la tecnica <strong>di</strong> riduzione alla nuova matrice <strong>dei</strong> prodotti<br />
parziali<br />
L’altezza della matrice <strong>dei</strong> prodotti parziali è passata da 4 a 3.<br />
Facendo un altro passaggio, ottengo una matrice <strong>di</strong> prodotti parziali<br />
<strong>di</strong> altezza 2.<br />
Abbiamo finito: i 4 termini fuori dal riquadro azzurro sono proprio i<br />
primi 4 bit meno significativi del prodotto!<br />
I termini nel riquadro azzurro sono gli ingressi del VMA che calcolerà<br />
le altre uscite dell’ad<strong>di</strong>zionatore!<br />
Il tempo <strong>di</strong> propagazione è il ritardo del VMA a cui devo aggiungere il<br />
ritardo per ottenere i due operan<strong>di</strong>! Nel caso peggiore passo<br />
attraverso 3 full adder per ottenere i bit che stanno in fondo!! Infatti,<br />
per passare da una matrice all’altra uso <strong>dei</strong> full-adder!<br />
Allora il ritardo è come in slide! Questo è il moltiplicatore <strong>di</strong> Wallace:<br />
applica ricorsivamente un algoritmo che riduce l’altezza della matrice<br />
<strong>dei</strong> prodotti parziali.<br />
Il ritardo quin<strong>di</strong> va come 3 volte il ritardo <strong>di</strong> un full adder, ovvero:<br />
Tp=3 Tfa + TVMA<br />
È <strong>di</strong>fficile fare i conti in generale: però, si vede che passando da un livello al succesivo, riduco<br />
l’altezza della matrice <strong>di</strong> un fattore 3/2 perché il full-adder è un compressore 32! (considerazione<br />
euristica!!) In generale allora il ritardo sarà come in slide. Nota ke K è funzione del numero <strong>di</strong> bit<br />
secondo un logaritmo in base 3/2! Abbiamo allora un ritardo ke cresce secondo un log <strong>di</strong> N (in<br />
base 3/2). Il moltiplicatore <strong>di</strong> Wallace è molto più veloce <strong>di</strong> quello a matrice, l’inconveniente è che<br />
tende ad usare un numero eccessivo <strong>di</strong> half-adder!! Esistono delle tecniche più efficienti che<br />
mantenendo lo stesso ritardo, riducono il numero <strong>di</strong> half-adder utilizzati per realizzare il<br />
moltiplicatore.<br />
In generale, il tempo <strong>di</strong> propagazione è:<br />
Moltiplicatore Dadda<br />
Tp = k Tfa + TVMA, con: k _ log3/2(N)<br />
Sono moltiplicatori che si basano sulla successione <strong>di</strong> Dadda.<br />
All’ultimo livello, l’altezza della matrice <strong>dei</strong> prodotti parziali è: A0=2<br />
Al livello precedente, l’altezza deve essere: A1=A0×3/2=2×3/2=3.<br />
Al livello ancora precedente, l’altezza deve essere: A2=A1×3/2=3×3/2=9/2=4.5, non potendo avere<br />
un’altezza frazionaria: A2=4.<br />
In generale: An+1= floor((3/2)An) con: A0=2 dove la funzione floor( ) rappresenta<br />
l’arrotondamento per <strong>di</strong>fetto all’intero più vicino.
Successione <strong>di</strong> Dadda 2, 3, 4, 6, 9, 13, .....<br />
Se, ad esempio, ad un certo livello dell’albero, l’altezza della matrice <strong>dei</strong> prodotti parziali è 5, al<br />
passo successivo l’altezza della matrice sarà 4.<br />
Posso sfruttare questa informazione per evitare <strong>di</strong> inserire half-adder e full-adder dove non è<br />
strettamente necessario.<br />
Moltiplicatore <strong>di</strong> Dadda<br />
un’altezza pari a 4, quella richiesta.<br />
Esempio: partiamo da un moltiplicatore<br />
5x5. L’altezza è 5, compresa tra 4 e 6.<br />
Allo step successivo dovrò portarmi ad<br />
un’altezza pari a 4 (secondo Dadda). E<br />
allora, i termini corrispondenti alle<br />
colonne 2 0 , 2 1 , 2 2 , 2 3 , li posso portare<br />
pari pari allo step successivo perché<br />
sono alti 4. Nella colonna 2 4 inserisco<br />
un full-adder per ottenere un’altezza <strong>di</strong><br />
4. Metto un altro full-adder a sinistra<br />
corrispondente alla colonna 2 5 perché<br />
ho il carry proveniente dalla colonna<br />
precedente. Nel primo step inserisco<br />
solo 2 full-adder. Questo mi garantisce<br />
Passo successivo: l’altezza ora è 4.<br />
Il termine successivo della serie <strong>di</strong><br />
Dadda è 3 quin<strong>di</strong> inserisco 4 fulladder<br />
(solo quelli STRETTAMENTE<br />
NECESSARI) come in figura per<br />
ottenere un’altezza pari a 3. I<br />
moltiplicatori <strong>di</strong> Dadda quin<strong>di</strong><br />
utilizzano poca logica, solo adder<br />
strettamente necessari.<br />
Qui per arrivare ad un’altezza<br />
<strong>di</strong> 2, metto 3 half adder e 3<br />
full adder. Ho finito. Nota: gli<br />
half-adder li troviamo<br />
tipicamente agli ultimi step<br />
Osservazione: con questa<br />
tecnica, c’è un solo termine<br />
che calcoliamo in maniera<br />
esplicita (che sarebbe l’unico<br />
pallino nero fuori dal VMA).<br />
Gli altri termini, li ottengo col<br />
VMA. Il Vector Merging Adder<br />
opera quin<strong>di</strong> su un numero <strong>di</strong><br />
bit maggiori rispetto ai<br />
moltiplicatori <strong>di</strong> Wallace. È uno svantaggio. Il vantaggio è che usiamo un numero inferiore <strong>di</strong> porte<br />
logiche nei primi step <strong>di</strong> elaborazione. Lo svantaggio è che il VMA deve essere più grande.
Confronto moltiplicatori ad albero<br />
Wallace vs. Dadda<br />
La velocità è la stessa: Tp=3 Tfa + TVMA<br />
Area Wallace: 9 full-adder + 12 half-adders + VMA a 6 bit<br />
Area Dadda: 9 full-adder + 3 half-adder + VMA a 8 bit (più carry)<br />
Nel confronto si vede che la velocità è la stessa, l’area è <strong>di</strong>versa: il Dadda è più piccola. D’altra<br />
parte, il VMA ha 8 bit nel Dadda ed è più complicato. Esistono tantissimi algoritmi che sono varianti<br />
che cercano <strong>di</strong> ottenere il meglio dai circuiti!! In ogni caso comunque, il ritardo è funzione del<br />
logaritmo <strong>di</strong> N.<br />
Array carry-save vs. Dadda<br />
Velocità array carry-save: Tp=3 Tfa + Tha + TVMA<br />
Velocità Dadda: Tp=3 Tfa + TVMA<br />
Area array carry-save: 12 full-adder + 4 half-adders + VMA a 4 bit<br />
Area Dadda: 9 full-adder + 3 half-adder + VMA a 8 bit<br />
Facendo un confronto con un moltiplicatore carry-save, quest’ultimo non richiede meno hardware<br />
rispetto a quello ad albero, facendo i conti sulle aree il carry-save è in vantaggio rispetto al Dadda,<br />
è più piccolo!
I moltiplicatori ad albero sono più veloci degli array carry-save, senza richiedere un particolare<br />
aumento <strong>di</strong> hardware.<br />
La <strong>di</strong>fferenza <strong>di</strong> velocità <strong>di</strong>viene sempre più grande al crescere del numero <strong>di</strong> bit da sommare<br />
I moltiplicatori ad albero possono essere facilmente mo<strong>di</strong>ficati in modo da realizzare moltiplicatoriaccumulatori<br />
o per moltiplicare numeri in complementi alla base.<br />
L’unico vantaggio <strong>dei</strong> moltiplicatori array carry-save è la regolarità, che consente <strong>di</strong> realizzare<br />
circuiti full-custom molto compatti.<br />
Con metodologie basate su celle standard, conviene sempre adoperare strutture ad albero.<br />
I moltiplicatori ad albero in generale non sono più gran<strong>di</strong> <strong>di</strong> quelli a matrice ma sono molto più<br />
veloci. Quando un moltiplicatore viene sintetizzato e realizzato con celle standard, in pratica viene<br />
SEMPRE REALIZZATO CON UNA STURTTURA AD ALBERO perché non ho vantaggi con una<br />
struttura a matrice, l’area è sempre la stessa ma è molto più veloce!<br />
Allora perché li abbiamo stu<strong>di</strong>ati? Perché se dobbiamo realizzare moltiplicatori in maniera custom,<br />
proprio perché le strutture carry-save sono regolari, io mi progetto la cella e poi faccio l’array delle<br />
celle! Nella struttura ad albero non ho regolarità, i full adder sono piazzati un po’ ovunque! Se li<br />
devo progettare a mano ha quin<strong>di</strong> senso la struttura carry-save.<br />
Se uso il vhdl, verrà realizzata una struttura ad albero perché più efficiente. I moltiplicatori ad<br />
albero sono quin<strong>di</strong> vincenti. L’unico vantaggio delle carry-save è la regolarità dal punto <strong>di</strong> vista <strong>di</strong><br />
layout.<br />
Che cambia se devo fare un moltiplicatore <strong>di</strong> numeri con segno o un moltiplicatore-ad<strong>di</strong>zionatore?<br />
Per esempio se volessi fare: Y=A*B+C. Posso farlo con una struttura ad albero?<br />
È semplice, basta aggiungere un’altra riga nella matrice <strong>dei</strong> prodotti parziali dove ci sommo proprio<br />
il termine C. se devo fare Y=A*B+C+D aggiungo un’altra riga per D.<br />
Se devo fare A*B con A e B in complementi alla base, signed, cosa cambia?<br />
Alla fine comunque devo sommare <strong>dei</strong> termini, in pratica ci saranno <strong>dei</strong> termini con delle AND e<br />
altri con delle NAND. I famosi 1 da sommare per il complemento, sono delle semplici costanti da<br />
sommare.