02.06.2013 Views

Architettura dei Sistemi Integrati - Quelli di Informatica

Architettura dei Sistemi Integrati - Quelli di Informatica

Architettura dei Sistemi Integrati - Quelli di Informatica

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!