Capitolo 1 Progetto VLSI e layout dei circuiti integrati

Capitolo 1
Progetto VLSI e layout dei circuiti integrati
1.1
Introduzione
Ci chiediamo, innanzitutto, quali sono i vantaggi che inducono a realizzare un dato sistema con
un’unica struttura integrata anziché con componenti standard (ad es. porte TTL o CMOS), i quali
hanno un costo ridotto, sono estremamente affidabili e facilmente disponibili. Tali vantaggi sono da
ricercarsi nella possibilità di ottenere le seguenti caratteristiche:
• Riduzione delle dimensioni dell’intero sistema. Infatti, invece di avere un circuito stampato con
delle interconnessioni le cui lunghezze sono dell’ordine di grandezza dei centimetri, si hanno dei
circuiti in cui le lunghezze delle interconnessioni sono dell’ordine dei micron.
• Riduzione dei parametri parassiti, che in generale possono essere delle resistenze parassite (R),
delle capacità (C) o, eventualmente delle induttanze parassite (L). Ciò comporta
immediatamente dei vantaggi in termini di:
•
velocità (ad es., nel caso delle porte MOS, i tempi di propagazione sono limitati dalle
capacità di carico applicate alle uscite di tali porte, e migliorano in seguito alla riduzione di
tali capacità);
•
potenza dissipata (ad es., per un circuito CMOS, la potenza dissipata è proporzionale alla
capacità da caricare/scaricare, per cui la minore capacità permette di ridurre
proporzionalmente la potenza dissipata)
• Riduzione dei costi del sistema complessivo. Il singolo circuito integrato da progettare può,
singolarmente, costare di più della somma dei prezzi dei vari circuiti standard che va a sostituire.
Però, in seguito alla riduzione della potenza dissipata, è possibile, ad esempio, utilizzare un
alimentatore meno sofisticato (quindi meno costoso); inoltre la riduzione delle dimensioni
comporta anche la riduzione della complessità del circuito stampato in termini di
interconnessioni.
• Protezione della riservatezza del progetto. Se si realizza un sistema con porte logiche standard,
chiunque (nei limiti delle proprie capacità) potrebbe effettuare un’operazione che si potrebbe
2
Progetto VLSI e layout dei circuiti integrati
definire di “reverse engineering”, cioè capire dal sistema sviluppato qual è la sua realizzazione
in termini di porte logiche, al fine di poter copiare (clonare) il progetto. Ciò diventa
praticamente impossibile nel momento in cui tutto il sistema è realizzato su un unico circuito
integrato (e ciò è estremamente importante a livello industriale).
L’ottenimento di tali caratteristiche comporta che applicazioni che non sono realizzabili con
componenti discreti siano invece possibili in forma integrata (si pensi ai sistemi portatili, telefonini,
ecc.). Ovviamente, la realizzazione di tali sistemi è essenzialmente legata ad una riduzione della
potenza dissipata, cosa che sarebbe ottenibile solamente realizzando il sistema (o buona parte di
esso) su un unico chip.
Questi aspetti hanno fatto si che ci sia stato un notevole utilizzo dei sistemi integrati non più, e non
solo, da parte di quelle aziende che producono circuiti integrati (foundries) ma anche da parte di
altre aziende manifatturiere (produttori di automobili, sistemi di telecomunicazioni, ecc.).
Le famiglie logiche utilizzabili per la realizzazione di circuiti integrati possono essere classificate in
due grandi gruppi: le logiche bipolari e le logiche MOS. A loro volta, le famiglie logiche bipolari (il
cui elemento base è il transistore bipolare) si distinguono essenzialmente in logiche ECL e TTL,
mentre le logiche MOS in NMOS e CMOS.
In un passato anche recente le varie applicazioni erano realizzate quasi con eguale distribuzione con
queste quattro tecnologie; attualmente, invece, le cose stanno cambiando. In particolare, per le
logiche bipolari, la limitazione fondamentale rispetto ai circuiti MOS è l’integrabilità: ricordiamo,
ad esempio, che per realizzare due transistori bipolari su uno stesso circuito integrato è necessario
isolarli l’uno dall’altro. Dunque, oltre alla complessità del processo produttivo, si ha uno spreco di
area che non permette di raggiungere gli stessi livelli di integrazione raggiungibili con la tecnologia
MOS. Inoltre la potenza dissipata è un’altra problematica che caratterizza le famiglie bipolari:
infatti, la struttura dei transistori bipolari è tale che essi siano pilotati in corrente (è necessaria una
corrente di base per mandarli in conduzione) la cui erogazione richiede una certa dissipazione di
potenza. Questi due aspetti limitano significativamente la possibilità di poter realizzare dei sistemi
VLSI (si pensi che nei microprocessori attuali sono integrati alcune decine di milioni di transistori,
ovvero milioni di porte logiche) e la potenza dissipata da una porta bipolare è dell’ordine di un
mW). Restano, comunque, utilizzate per applicazioni come componenti discreti (parti logiche
standard: multiplexer. registri, buffer tri-state, ecc.). In particolare, le porte logiche ECL hanno
tempi di propagazione molto ridotti ed un basso swing logico, che può essere particolarmente utile
quando bisogna collegare due sistemi ad una certa distanza tra loro; in questo caso, come sappiamo,
si utilizza una linea di trasmissione opportunamente adattata.
Per quanto riguarda le logiche MOS, la più adatta per l’integrazione su larga scala (VLSI) è la
logica CMOS, dato che la NMOS soffre del problema della potenza statica dissipata. In effetti,
sappiamo che concettualmente un circuito NMOS potrebbe avere un livello di integrazione
maggiore rispetto ad un circuito CMOS; il problema della dissipazione di potenza diventa però
assolutamente insormontabile, ed è ciò che limita le nostre applicazioni. Inoltre, in base al prodotto
ritardo-potenza, se le porte NMOS dissipano poco diventano anche molto lente.
Progetto VLSI e layout dei circuiti integrati
3
Da queste considerazioni si deduce che, in pratica, anche le logiche NMOS non sono più adoperate
(fra i processori realizzati in tecnologia NMOS ricordiamo lo Z80 ed il 4004 della INTEL). Ormai
tutti i circuiti integrati sviluppati per applicazioni digitali sono realizzati in tecnologia CMOS; ciò
non preclude l'utilizzo in alcune parti del circuito di blocchi funzionali di tipo NMOS (ad es.
pseudo-NMOS). Sebbene un circuito integrato sia realizzato internamente in logica CMOS, i livelli
di tensione che appaiono ai terminali esterni molto spesso devono essere, ad esempio, TTL
compatibili, in modo da poter utilizzare periferiche anche più datate; quindi è importante sapere
quali sono le caratteristiche delle porte TTL. In altri casi possono presentarsi vincoli sul ridotto
swing logico in modo che ci sia compatibilità con la logica ECL.
Il parametro fondamentale per la tecnologia CMOS è la lunghezza di canale (L), il cui valore é
sempre mantenuto alla minima dimensione che la tecnologia ci consente di realizzare, a meno di
pochi casi particolari. Col passare degli anni tale dimensione minima si è ridotta da qualche µm a
qualche decimo di µm. Allo stato attuale, in laboratorio sono già stati realizzati dispositivi con
lunghezza di canale inferiore a 0.1µm e tale riduzione continuerà ancora negli anni, sebbene alla
fine si debba saturare a causa dei limiti fisici invalicabili delle dimensioni atomiche del silicio. La
tendenza fondamentale, più che essere quella di aumentare le prestazioni in termini di velocità, è
attualmente quella di ridurre la potenza dissipata (in modo da garantire la realizzazione di
applicazioni portatili).
1.2
Tecniche di progetto dei circuiti integrati: livelli di astrazione
Una volta evidenziati i vantaggi legati al progetto di un sistema integrato rispetto ad un sistema
realizzato con componenti discreti e definita la tecnologia cui si fa riferimento, analizziamo quali
sono le metodologie che possono essere utilizzate per progettare dei sistemi di un certo livello di
complessità (decine di milioni di dispositivi elementari).
La fase di progetto di un sistema integrato si completa attraverso un raffinamento fra diversi livelli
di astrazione, ovvero un approccio essenzialmente di tipo top-down passando attraverso differenti
livelli di astrazione. Accanto a questo un altro aspetto importante è l'utilizzo di tecniche di
progettazione gerarchica. Queste due metodologie sono separate fra di loro nel senso che si
utilizzano tecniche di progettazione gerarchica ad ognuno dei vari livelli di astrazione.
Facendo riferimento alla Figura 1.2, il punto di partenza sono le specifiche del sistema da realizzare
che rappresentano un'elencazione dei desideri da parte del committente (che, ad esempio, richiede
un sistema che realizzi un’operazione di filtraggio numerico su alcuni dati che arrivano con una
certa frequenza, sono campionati su un certo numero di bit, ecc.).
Vettori
di test
Programma
eseguibile
Risultati
Fig. 1.1 - Programma eseguibile (descrizione comportamentale).
Progetto VLSI e layout dei circuiti integrati
4
Dopo aver ricevuto le specifiche si passa ad effettuare una descrizione comportamentale del nostro
sistema, che consiste in un programma eseguibile (Fig. 1.1) ovvero una descrizione del tutto non
ambigua di quello che deve essere il funzionamento del circuito.
Pertanto, tale descrizione non ambigua deve essenzialmente portare ad un programma eseguibile.
Ad esempio, si può pensare di descrivere l'algoritmo con cui si vuole realizzare il circuito integrato
con un programma in linguaggio C o Pascal. In questo modo riusciamo a superare ogni possibile
ambiguità contenuta nelle specifiche iniziali; ad esempio, quando sono formulate le specifiche, può
non essere definito il tipo di rappresentazione dei dati (i quali potrebbero essere positivi o positivi e
negativi e, in quest’ultimo caso, possono essere rappresentati in modulo e segno oppure in
complemento alla base). Tali aspetti, che in fase di definizione delle specifiche non sono precisati,
lo dovranno essere in maniera univoca e non ambigua a livello di descrizione comportamentale. Per
fare ciò bisogna descrivere il funzionamento input/output del sistema mediante una sorta di
programma eseguibile. Ciò consente, fra l’altro, di simulare quello che sarà il funzionamento
definitivo del sistema, applicando dei vettori di test al programma eseguibile ed analizzandone i
risultati. In altri termini, possiamo sollecitare la nostra descrizione comportamentale mediante un
insieme di possibili dati d’ingresso e, realizzato il nostro algoritmo, analizzare i risultati e valutare
se il comportamento ingresso-uscita sia compatibile con le specifiche assegnate.
Specifiche
Descrizione comportamentale
RTL (Register-Transfer Level)
Gate
(netlist)
Transistor
(netlist)
Layout
Fig. 1.2 - Approccio top-down (bottom-up) attraverso livelli di astrazione
Osserviamo che potrebbe nascere qualche problema nella stesura del programma eseguibile.
Potrebbero utilizzarsi linguaggi come il Pascal o il C, i quali però non sono stati sviluppati per
emulare il funzionamento di un sistema hardware. Se consideriamo, ad esempio, un circuito con due
porte NAND, i cui ingressi possono in genere variare in qualsiasi istante di tempo, le due porte
reagiscono indipendentemente l’una dall’altra. In un programma C si esegue prima l’istruzione 1,
poi l’istruzione 2, ecc., vale a dire non sono eseguite due istruzioni contemporaneamente (a meno
Progetto VLSI e layout dei circuiti integrati
5
che non si abbia un sistema parallelo, il che è abbastanza complicato). Ciò fa si che l’utilizzo di un
linguaggio di programmazione standard è poco efficace a livello di descrizione comportamentale.
Da qui nasce l’esigenza di disporre di opportuni linguaggi per la descrizione dell’hardware, HDL
(Hardware Description Language) che somigliano sotto molti aspetti ai normali linguaggi di
programmazione ma hanno delle caratteristiche aggiuntive quale quella di poter emulare
l’esecuzione contemporanea di più processi (di più operazioni) in modo da poter semplificare la
descrizione del funzionamento del nostro sistema. I linguaggi HDL maggiormente diffusi
(praticamente, degli standard a livello mondiale) sono il VHDL e il VERILOG.
Il passo successivo al primo livello di astrazione (descrizione comportamentale) è una descrizione
a livello RTL (Register-Transfer Level), ovvero a livello di trasferimento fra registri. A tale livello
di astrazione si specifica il funzionamento del nostro sistema mediante il collegamento di blocchi
ideali che possono realizzare o delle funzioni logiche (comunque assegnate) o degli elementi di
memoria (registri ideali).
Supponendo che il circuito debba elaborare dati (di) in tempo reale, le operazioni realizzate saranno
del tipo y =Σdi·hi (dove hi sono dei coefficienti). A livello di descrizione RTL ci serviranno, quindi,
dei moltiplicatori e dei sommatori, i quali saranno descritti mediante le funzioni logiche assegnate.
A tale livello sono portati in conto alcuni elementi di dettaglio quali: su quanti bit sono memorizzati
i dati; se si moltiplicano due dati a 8 bit e il prodotto è su 16 bit, allora si scarta il bit meno
significativo; ecc. Si cominciano, quindi, a definire alcuni elementi di dettaglio, pur non entrando
ancora nella realizzazione dei moltiplicatori e sommatori presenti nel nostro circuito. Tutte le
funzioni logiche sono descritte mediante relazioni ingresso-uscita (delle tabelle) ideali, che magari
hanno un ritardo assegnato di valore arbitrario (o, addirittura, infinitesimo). Per realizzare un
qualsiasi sistema di un certo interesse, accanto a queste funzioni booleane è necessario avere a
disposizione dei registri di memoria. A tale livello di astrazione si suppone che i registri siano
ideali, cioè siano pilotati da un segnale di clock ideale e siano in grado, in un tempo infinitesimo, di
catturare l’ingesso e memorizzarlo ad ogni transizione del segnale di clock. Il livello di astrazione è
ancora abbastanza alto, ovvero si è lontano da quella che sarà l’effettiva realizzazione del nostro
microcircuito, però abbiamo fatto un passo sostanziale rispetto alla descrizione comportamentale; in
effetti, in molti casi, quando si parla di “architettura” di un sistema di parla di descrizione RTL.
Per ognuno dei blocchi logici definiti (seppur ideali) è possibile realizzare una descrizione in
linguaggio VHDL, ovvero possiamo pensare che ognuno di essi sia una subroutine (un modulo) di
un programma più complesso: quindi è possibile utilizzare ancora una descrizione HDL per
simulare il funzionamento del nostro circuito, però questa volta lo simuliamo a livello RTL. In
pratica, si avrà una seconda versione del nostro programma (la prima è relativa alla descrizione
comportamentale), dove il sistema è già suddiviso in qualche modo in subroutine, ognuna delle
quali corrisponde o ad una funzione logica o ad un blocco di memoria. A tale punto bisogna
verificare che questa seconda versione del nostro programma sia compatibile con la precedente,
vale a dire dia lo stesso comportamento ingresso-uscita (in caso contrario, sarebbe errata la
decomposizione in registri e in blocchi logici ideali che abbiamo eseguito). Ciò può essere fatto
applicando gli stessi vettori di test utilizzati al livello precedente alla nuova descrizione del nostro
6
Progetto VLSI e layout dei circuiti integrati
circuito e verificando che i risultati siano congruenti con quelli ottenuti in precedenza. In alcuni
casi, invece di un linguaggio per la descrizione dell’hardware, si può avere ad esempio una
descrizione mediante uno schema a blocchi, mediante la quale si esegue una simulazione funzionale
del nostro sistema. In questo modo è possibile valutare il prodotto della nostra simulazione ma, ad
esempio, non è possibile avere delle indicazioni precise sui tempi di ritardo (ma solo una stima
dell’ordine di grandezza), non sapendo ancora come sono realizzati i singoli blocchi funzionali.
Il passo successivo alla descrizione RTL è una descrizione a livello di porte logiche, in altre parole
a livello gate. A tale livello di astrazione, per ognuno dei blocchi funzionali individuati in
precedenza, sono valutate le possibili realizzazioni in termini di porte logiche. Ad esempio, potremo
utilizzare un addizionatore nel quale i segnali di riporto si propagano da uno stadio all’altro oppure
un addizionatore velocizzato in cui, in qualche modo, ci sono più cammini in parallelo per il riporto.
Tali decisioni sono definite a livello di gate dato che bisogna descrivere l’addizionatore non più
come una funzione ma con un insieme di porte logiche (NAND, NOR, XOR, ecc.) opportunamente
interconnesse fra loro. Molte scelte progettuali sono quindi effettuate passando dalla descrizione
RTL a quella a livello di gate. Completata questa descrizione, il nostro sistema consterà di un certo
numero di porte logiche opportunamente interconnesse fra loro, ossia si ha come si suol dire una
netlist (un listato). Non c’è dubbio che anche a tale livello sarà necessario compiere una
simulazione della nostra descrizione a livello gate. Questa simulazione, ancora una volta, potrà
eseguirsi in HDL o mediante altri opportuni simulatori. In tal caso, il discorso è più semplice poiché
basta simulare il comportamento ingresso-uscita, ed anche quello nel dominio del tempo, di una
singola porta logica ed iterare questo discorso per tutto il circuito. Ovviamente, sfruttiamo sempre
di stessi vettori di test utilizzati in precedenza per verificare che l’uscita sia quella giusta.
Il passo successivo è la descrizione a livello transistor. Questo è un passo molto importante perché,
per la singola porta utilizzata a livello gate, non è stato ancora stabilito come essa sarà realizzata (si
può utilizzare una logica pseudo-NMOS, una logica Fully CMOS (FCMOS), una logica domino);
inoltre, sono da definire i W/L dei transistor. Questi dettagli sono stabiliti quando si opera a livello
transistor. Ovviamente, anche in questo caso l’uscita (di questo livello di astrazione) sarà una netlist
diversa dalla precedente, che descriverà il sistema come un’interconnessione di transistor. Ad
esempio, questa netlist può essere di tipo SPICE (in modo che il circuito possa essere simulato con
SPICE), un approccio, però, realizzabile solo con circuiti molto semplici e non in presenza di
migliaia di transistori (essendo notevoli i tempi di simulazione). In genere sono impiegati simulatori
appositi che, pur dando delle precisioni peggiori rispetto alla simulazione circuitale con SPICE,
sono di alcuni ordini di grandezza più veloci.
Man mano che si passa da un livello di astrazione all’altro, è possibile sempre di più avere un’idea
di quelli che saranno i parametri di costo finali del nostro progetto. Tali parametri di costo sono
essenzialmente: la potenza dissipata, la massima frequenza di clock (la velocità) e l’area occupata
sul silicio. Di questi parametri è possibile averne un’idea già al livello RTL, idea che si va
perfezionando sempre di più man mano che si scende nel nostro flusso di progetto.
L’ultimo passo per completare il nostro progetto è rappresentato dal livello layout, in cui il circuito
è descritto mediante un insieme di rettangoli che nella loro composizione definiscono i transistori, le
Progetto VLSI e layout dei circuiti integrati
7
linee di interconnessione, ecc. Solo quando siamo a questo livello, è possibile effettivamente
stabilire i valori dei tre parametri di costo.
In questo modo abbiamo definito una metodologia di progetto di tipo top-down, che parte dalle
specifiche ed arriva fino al layout. Tale metodologia di progetto è sempre di più favorita dalla
presenza di opportuni programmi di sintesi automatica, i quali consentono di passare in maniera
automatizzata da un livello di astrazione ad uno più basso.
Osserviamo, però, che quando si passa da un livello di astrazione ad un altro possiamo
semplicemente valutare cosa succede ai nostri parametri di costo. Pertanto, non possiamo essere
sicuri che, partendo da una determinata descrizione RTL, il layout che si ottiene soddisfa le
specifiche in termini di potenza, area e velocità. Ciò significa che, molto spesso, bisogna compiere
delle iterazioni di tipo bottom-up. Quindi, a partire dai risultati che si ottengono dopo la prima fase
top-down, si possono individuare quelli che sono i punti critici del nostro circuito (i cosiddetti
cammini critici) allo scopo di ottimizzare il nostro sistema. Per compiere l’operazione di bottom-up
si torna indietro dal layout; ad esempio, si può rimanere al livello layout cercando di ottimizzarlo,
anche se i miglioramenti delle prestazioni saranno relativamente minimi. Questo loop va quindi
seguito se il risultato finale è abbastanza prossimo a quello che si vuole ottenere. In generale, sarà
necessario ritornare a qualche step precedente, ad esempio a livello transistor: se è stato realizzato il
circuito in logica FCMOS, e questa non è sufficientemente veloce, è possibile utilizzare una logica a
pass-transistor, utilizzando la stessa descrizione a livello di porte logiche. In questo modo è
possibile incidere molto di più sulle prestazioni finali del circuito, anche se ciò richiede un
maggiore lavoro di sintesi (si ottiene un nuovo layout, bisogna simularlo nuovamente, ecc.). Se ciò
non è sufficiente è necessario tornare al livello gate; ad esempio, l’addizionatore, invece di farlo a
propagazione del riporto, può realizzarsi a selezione del riporto (il che consente di velocizzare
molto l’operazione di somma, soprattutto quando la lunghezza delle due word da sommare è
abbastanza grande). In questo modo è possibile cambiare drasticamente le prestazioni del nostro
sistema, anche se praticamente lo si sta riprogettando completamente. Riprogettare il sistema
significa, ovviamente, ritornare addirittura al livello RTL (cioè cambiare l’architettura): d’altra
parte, se il flusso top-down è assistito da un buon programma di sintesi, la riprogettazione non
risulta essere molto drammatica.
Per ogni livello di astrazione ci sono degli opportuni programmi di progettazione assistita al
calcolatore; per molti di questi livelli può essere un HDL, mentre a livello gate può essere un
sistema di schematic-entry (in cui il sistema digitale è descritto come porte logiche, per simularne il
comportamento ed, eventualmente, sintetizzare un layout in maniera automatica).
Accanto all’approccio mediante diversi livelli di astrazione vi è l’aspetto della progettazione
gerarchica, che si applica almeno agli ultimi tre livelli di astrazione (gate, transistor e layout). Ad
esempio, a livello layout per progettazione gerarchica si intende la progettazione del layout di un
database di celle elementari (quali porte AND, multiplexer, full-adder). Dopodiché, per passare al
layout di un sistema più complicato come, ad esempio un addizionatore, basterà prendere la singola
bit-slice (ovvero la singola cella elementare) che somma due bit, per ottenere una somma e un
riporto, e mettere assieme fra di loro più istanze della medesima cella. Ciò comporta che il lavoro di
Progetto VLSI e layout dei circuiti integrati
8
progettazione sia limitato soltanto a definire la “biblioteca” di celle standard. Per realizzare dei
sistemi più complessi, utilizzando il layout editor, sarà sufficiente utilizzare dei comandi di array (di
iterazione) delle singole celle (in modo da passare semplicemente da un singolo full-adder ad un
addizionatore a 4, 8, 16 o 32 bit). In questo modo si hanno notevoli vantaggi in termini di tempo, di
affidabilità del sistema e di possibilità di ottimizzarlo.
Tale concetto si applica non solo a livello layout ma a tutti gli altri livelli, anche a livello gate. Dato
lo schema del circuito in termini di porte logiche, si avrà, ad un primo livello, uno schema con
alcuni blocchi; poi, per ognuno di questi blocchi vi saranno degli schemi sempre più dettagliati, fino
ad arrivare a degli schemi elementari su cui sono collegate poche porte logiche connesse fra loro.
Oltre alle famiglie logiche FCMOS e pseudo-NMOS, ristudieremo, stavolta dal punto di vista
progettuale, le logiche a Pass-Transistor le logiche CPL (logiche a Pass-Transistor complementari) e
le logiche CVS (Cascode Voltage Switch) che, più recenti, sono state introdotte per cercare di
superare le limitazioni della logica FCMOS relative alla ridondanza (in termini di dispositivi
utilizzati).
Osserviamo, inoltre, che uno dei problemi che spesso si ha nella pratica è la necessità di progettare
il primo prototipo funzionante del nostro sistema in tempi molto rapidi. In questo caso è
impensabile, sia in termini di tempo che di costi, far realizzare il prototipo del nostro sistema da
un’azienda produttrice di circuiti integrati (i costi risultano essere proporzionali all’area se si ha una
produzione di migliaia di pezzi l’anno, altrimenti diventano consistenti). Quindi, nei casi in cui
serva in breve tempo un’uscita funzionante, e nei casi in cui non si hanno prospettive di
un’elevatissima distribuzione, è possibile utilizzare dei sistemi logici riprogammabili che prendono
il nome di FPGA (Field Programmable Gate Array). In pratica, sono dei circuiti già realizzati
all’interno dei quali sono integrate porte logiche elementari (da alcune migliaia ad alcune milioni),
non ancora collegate fra loro (ci sono delle interconnessioni programmabili). Quindi, per realizzare
una certa funzionalità è sufficiente definire la mappa delle interconnessioni all’interno di questo
circuito. In questo modo i tempi necessari per la realizzazione del primo prototipo sono
estremamente ridotti ed i costi per avere il primo prototipo sono legati al costo dell’FPGA (che può
andare da qualche decina di dollari a qualche centinaio di dollari).
Naturalmente, se bisogna realizzare una produzione su larghissima scala del circuito è meglio
progettare un circuito ad hoc, in cui è possibile ottimizzare l’area e pertanto i costi del singolo
circuito (grazie all’elevato numero di circuiti prodotto) possono essere abbattuti per economie di
scala.
Anche per l’FPGA il ciclo di sviluppo è praticamente quello visto in precedenza (Fig. 1.2), con
l’unica differenza che non bisogna progettare né il layout né la descrizione a livello transistor. Una
volta ottenuta la netlist di porte logiche, è fornita in input ad un programma di implementazione che
determina la mappa di interconnessioni del circuito.
1.3
Tecniche di simulazione: simulatori switch-level
Focalizziamo la nostra attenzione sulle tecniche di simulazione utilizzate nella descrizione a livello
Progetto VLSI e layout dei circuiti integrati
9
transistor. Come già accennato, l’utilizzo del simulatore SPICE è inappropriato quando si ha a che
fare con sistemi molto complessi, in quanto i tempi di calcolo sarebbero inaccettabili. Si utilizzano
allora dei diversi simulatori detti switch-level (a livello interruttore), che utilizzano un modello
estremamente semplificato per il transistore MOS. Come mostrato in Figura 1.3, un MOS a canale n
viene rappresentato mediante una semplice resistenza (R) ed un opportuno interruttore, che si
chiude quando il segnale di ingresso sulla gate assume il livello logico alto. Notiamo, quindi, che il
risultato delle simulazioni non saranno delle forme d’onda continue nel tempo, ma soltanto dei
livelli logici alti e bassi. Per quanto riguarda, invece, la capacità di gate essa viene considerata come
una capacità costante pari a: C= COX ·W·L.
Fig. 1.3 - Schematizzazione di un MOS in un simulatore switch-level
Resta da stabilire il valore della resistenza R con cui si sostituisce il nostro transistore. Si considera
un circuito di test particolarmente semplice quale un invertitore CMOS, con un segnale d’ingresso
ideale, che pilota una capacità di valore assegnato (Fig. 1.4). A questo punto effettuiamo una misura
del tempo di propagazione oppure eseguiamo una simulazione con SPICE di questo semplice
circuito utilizzando il modello più accurato che disponiamo per questo transistore MOS (portando
quindi in conto anche gli effetti del secondo ordine), e valutiamo i tempi tplh e tphl.
Fig. 1.4 – Circuito di test: invertitore CMOS che pilota una capacità
Valutiamo poi i ritardi che si ottengono quando simuliamo questo circuito sostituendo ai MOSFET
un interruttore ed una resistenza (Fig. 1.5). Ad esempio, consideriamo il tempo tphl (cioè il tempo
Progetto VLSI e layout dei circuiti integrati
10
necessario a scaricare la capacità dal valore iniziale Vdd al valore Vdd/2); nella transizione basso-alto
dell’ingresso il PMOS rimane interdetto (l’interruttore è off), mentre per 1’NMOS l’interruttore si
chiude al tempo t=0. La capacità è inizialmente carica alla tensione di alimentazione Vdd;
l’evoluzione della tensione d’uscita nel tempo è data da:
v(t) = Vdd e – t / (Rn C)
Per t= tphl si ha:
Vdd
= Vdd e
2
t
- phl
Rn C
⇒ e
t
- phl
Rn C
=
1
⇒ t phl = log 2 ⋅ R n ⋅ C ≅ 0.69 ⋅ R n ⋅ C
2
Osserviamo però che il valore corretto del tphl è quello che abbiamo ottenuto dalle simulazioni
SPICE (o da misure). Da ciò si deduce che per la nostra simulazione switch-level è necessario
scegliere:
Rn =
tphl
0.69 ⋅ C
dove il tphl è quello corretto (ottenuto con SPICE o da misure). In qualche modo questo valore di Rn
rappresenta una scheda .MODEL ipersempliflicata del nostro simulatore switch-level. Tale
resistenza, ovviamente, non sarà uguale per tutti gli NMOS presenti nel circuito, in quanto è
inversamente proporzionale al fattore W/L del transistore in esame. Al nostro simulatore switchlevel bisognerà dunque indicare, per ogni transistore, il rapporto W/L ed il relativo valore di Rn.
Un discorso perfettamente analogo può essere fatto per il PMOS, cioè la resistenza Rp sarà legata al
tplh dalla relazione:
Rp =
tplh
0.69 ⋅ C
Possiamo provare a determinare una stima del valore Rn conoscendo le caratteristiche del nostro
transistore. Consideriamo il nostro circuito di test (Fig 1.4) in cui l’ingresso a t=0 si porta
istantaneamente da 0V alla tensione di alimentazione Vdd. La capacità di carico C si scaricherà
secondo la legge imposta dalla caratteristica i-v dell’ NMOS (Fig. 1.6).
Progetto VLSI e layout dei circuiti integrati
11
Fig.1.5 - Circuito di test: schematizzazione switch-level
Fig.1.6 - Circuito di test e caratteristica i-v dell’NMOS
Possiamo approssimativamente considerare che fra Vdd e Vdd/2 il transistore sia sempre in pinch-off
(anche se in realtà non e cosi); inoltre, possiamo approssimativamente considerare il modello del 1°
ordine di SPICE. Indichiamo con Isat 1a corrente che passa attraverso l’NMOS in questa fase di
scarica; essa sarà data da:
I sat = K n (Vdd - Vt )2
In generale, per quanto riguarda la capacità, sappiamo che:
i=C
∆v
dv
=C
dt
∆t
Progetto VLSI e layout dei circuiti integrati
12
dove, essendo la corrente costante, possiamo considerare al posto dei differenziali (dv e dt) le
differenze (∆v e ∆t). Si ha pertanto:
V − Vdd 2
V 2
t phl = C dd
= C dd
I sat
I sat
Introducendo tale espressione di tphl in quella di Rn, si ottiene:
Rn =
Vdd
1.4 ⋅ I sat
Osserviamo come il valore di tale resistenza non dipende, ovviamente, dalla capacità di carico:
inoltre, essa è funzione, non solo delle dimensioni del transistor, ma anche della tensione di
alimentazione (sia perché c’è Vdd a numeratore sia perché Isat dipende da Vdd)
Quindi se dobbiamo simulare un circuito col nostro simulatore switch-level per diversi valori della
tensione di alimentazione dovremo calcolare diversi valori delle resistenze Rn e Rp.
Utilizzare un modello semplificato del transistore significa graficamente che, anziché fare
riferimento alla caratteristica effettiva dell’NMOS si considera una caratteristica lineare (Fig. 1.6),
di cui Rn ne rappresenta la pendenza. Il valore di corrente che si ha per v=Vdd è proprio pari a 1.4Isat.
Se andiamo a valutare ciò che accade durante il transitorio, nel nostro modello semplificato con Rn,
ci sarà un intervallo di tempo in cui sovrastimiamo la corrente ed un altro in cui la sottostimiamo.
Ad ogni modo, il valore di Rn è scelto in modo tale che il tempo di propagazione è lo stesso in
entrambi i casi.
1.4
Esempio: porta AND a CMOS
Consideriamo una porta AND a CMOS a due ingressi (Fig. 1.7). Supponiamo che, partendo dalla
condizione b=1 e a=0, all’istante t=0 l’ingresso a si porti al valore 1.
Fig.1.7 – Porta AND a CMOS a due ingressi
Progetto VLSI e layout dei circuiti integrati
13
L’uscita della NAND (il nodo P), prima dell’istante t=0, è al livello logico alto. All’istante t=0
l’ingresso a passa da 0 a 1 e l’NMOS, che prima era interdetto, entra in conduzione, mentre il
PMOS si interdice; pertanto, l’uscita si porta a livello logico basso. Per calcolare il tempo in cui
quest’uscita si porta da 1 a 0, consideriamo lo schema switch-level del nostro circuito. (Fig.1.8).
Fig.1.8 – Schema switch-level della porta AND e circuito equivalente
Al nodo P avremo una capacità verso massa (CP); la rete di PMOS è inefficace dopo l’istante t=0,
quindi non è proprio considerata (e le relative capacità sono riportate in CP). Abbiamo poi la
resistenza corrispondente all’NMOS comandato dall’ingesso b (Rb); al nodo Q ci sarà una capacità
equivalente verso massa (che dipenderà da come è fatto il circuito) che indichiamo con CQ (che
sostanzialmente rappresenta la capacità tra la regione diffusa dei MOSFET e la massa). Ci saranno,
poi, il transistore comandato dall’ingresso a, che rappresentiamo con una resistenza Ra, ed un
interruttore in serie che si chiude all’istante t=0. Le condizioni iniziali da considerare sono che le
due capacità CP e CQ siano inizialmente cariche al valore logico alto (anche se il potenziale iniziale
su CQ non è proprio pari a Vdd dato che c’è l’NMOS che, come si suoi dire, ci fa “perdere una
soglia”: tale aspetto, comunque, viene trascurato nella nostra descrizione semplificata). Analizziamo
il potenziale del terminale a monte dell’interruttore: prima che l’interruttore si chiuda il potenziale
di questo terminale è uguale a quello del nodo Q, ovvero uguale a quello del nodo P (nella nostra
descrizione semplificata) e cioè pari alla tensione di alimentazione; all’istante O+ il potenziale di
questo terminale diventa 0. Possiamo quindi considerare un circuito equivalente (Fig. 1.8) in cui si
ha un generatore di tensione equivalente va al posto dell’interruttore, la cui tensione passa
istantaneamente a t=0 dal valore Vdd a 0V.
Siamo interessati a vedere cosa succede sulla capacità CP. Notiamo che abbiamo un sistema del
secondo ordine (nel circuito vi sono due capacità, due resistenze e, quindi, un sistema a due poli).
Possiamo semplificare la risposta di questo sistema con due poli, approssimando il nostro circuito
con una rete che presenta una singola costante di tempo (anziché due). Applichiamo, in altre parole,
il metodo delle costanti di tempo: consideriamo singolarmente ogni capacità (trascurando le altre,
cortocircuitiamo il generatore di tensione e valutiamo la resistenza equivalente vista dalla capacità
considerata). In questo modo, otteniamo la costante di tempo equivalente (τeq) che nel nostro
Progetto VLSI e layout dei circuiti integrati
14
esempio sarà pari a:
τ eq = C P (R a + R b ) + C Q R a
In analogia a quanto visto in precedenza si ha, allora, che il tempo di propagazione è pari a:
τ p ≅ 0.69 ⋅ τ eq
Notiamo, quindi, che anche nel caso di circuiti più complicati, applicando una tecnica di questo
tipo, non dobbiamo eseguire una simulazione analogica del nostro circuito; è sufficiente calcolare la
costante di tempo equivalente e moltiplicare per 0.69 per avere una stima ragionevole del ritardo del
nostro circuito. Questo approccio spiega perché i simulatori switch-level riescono a studiare circuiti
che hanno un numero molto elevato di dispositivi (a differenza di ciò che si può fare con SPICE, in
cui vengono integrate tutte le equazioni differenziali che descrivono il circuito). Ovviamente i
risultati che otteniamo sono approssimati sia perché i transistori sono approssimati con resistori, sia
perché alcuni effetti del secondo ordine (come la caduta della soglia) non sono considerati, sia
perché approssimiamo sistemi di ordine maggiore del primo con un sistema del primo ordine. Tali
approssimazioni sono il prezzo da pagare per ottenere un aumento della velocità di simulazione.
D’altro canto, queste relazioni approssimate possono talvolta essere utili in fase di progettazione.
Per esempio, dalla relazione che esprime il τeq si nota che le due resistenze equivalenti dei due
NMOS (Rb ed Ra) non hanno lo stesso peso per quanto riguarda il ritardo di propagazione. Infatti, la
resistenza Ra moltiplica la somma delle capacità (CP+CQ) mentre la resistenza Rb moltiplica la sola
capacità CP. Ciò vuol dire che, se abbiamo la possibilità di ottimizzare il nostro circuito, ci conviene
realizzare il dispositivo pilotato all’ingresso a (ovvero quello più lontano dall’uscita) con una W
maggiore rispettò a quello pilotato dall’ingresso b. Infatti ogni miglioramento che si ottiene su Ra è
più sensibile per quanto riguarda la riduzione della τeq rispetto a ciò che si potrebbe ottenere se si
riduce solo la Rb. Ciò è vero in linea di principio, poiché bisogna valutare dalle regole di progetto
che cosa succede. Difatti, la capacità CP è generalmente abbastanza più grande di CQ, quindi tale
miglioramento può non essere così sensibile.
Per completare il discorso, valutiamo cosa succede quando a=1 mentre b si porta, all’istante t=0, da
0 ad 1. Il circuito a livello interruttore è quello in Figura 1.9.
Al nodo P la capacità CP è inizialmente carica, quindi vo=Vdd. Il transistore pilotato da b,
inizialmente interdetto, si attiva all’istante t=0 (ovvero il relativo interruttore si chiude a t=0). Al
nodo Q si ha la resistenza Ra e la capacità CQ; la tensione iniziale ai capi di tale capacità è nulla,
essendo l’interruttore inizialmente aperto (quindi v0=0). Se si va a studiare questo circuito, ancora
una volta si ha a che fare con un sistema del secondo ordine, anche se è meno immediato valutarne
la risposta. Possiamo, comunque, fare qualche considerazione qualitativa in base al valore assunto
Progetto VLSI e layout dei circuiti integrati
15
Fig. 1.9 - Schema switch-level della porta AND quando a=1 e b=0→1
dalla capacità CQ. Ad esempio, se tale capacità è pari a zero (CQ=0) si ha che la costante di tempo è
pari a:
'
τ eq
= C P (R a + R b )
Viceversa se CQ=∞ il potenziale al nodo Q, che inizialmente è pari a zero, alla chiusura
dell’interruttore resta a zero in quanto il transitorio che si instaura ha una durata molto e1evata
(essendo CQ elevatissima); quindi, in pratica, tale nodo risulta essere a massa. Pertanto, la costante
di tempo del circuito è pari a:
"
τ eq
= CPR b
Notiamo, quindi, un fenomeno a prima vista strano, cioè se aumentiamo la capacità del nodo interno
(CQ) il tempo di propagazione addirittura diminuisce anziché aumentare. Ciò che in realtà succede è
che si avrà un valore di τeq a metà strada tra questi due limiti, e che dipende dal rapporto fra le due
capacità.
Nel caso del nostro simulatore switch-level si considera il caso peggiore, in altre parole si considera
la τ’eq, questo perché è probabile che la capacità al nodo Q sia molto più piccola di CP.
Osserviamo che, pur fra tante approssimazioni, il nostro simulatore è comunque in grado di portare
in conto alcuni effetti del secondo ordine. Ad esempio, il ritardo fra l’ingresso b e l’uscita al nodo P,
rispetto a quello fra l’ingresso a e l’uscita al nodo P, è più piccolo poiché nel secondo vi è un
termine aggiuntivo legato alla resistenza Ra ed alla capacità CQ.
1.5
Invertitore CMOS con pass-transistor: transistori pull-up e puIl-down
Oltre al W/L ed alla resistenza relativi all’NMOS ed al PMOS, al simulatore switch-level è
necessario fornire qualche informazione aggiuntiva. In alcuni casi i valori di resistenza degli NMOS
e dei PMOS, calcolati secondo il metodo precedente, possono risultare inaccettabili. Ad esempio,
consideriamo il circuito mostrato in Figura 1.10.
16
Progetto VLSI e layout dei circuiti integrati
Fig. 1.10 – Invertitore CMOS con pass transistor
Abbiamo un invertitore CMOS cui è collegato un transistore in serie fra l’uscita e una capacità di
uscita C (pass-transistor: transistore passante). Supponiamo di essere interessati al calcolo del tempo
di propagazione tplh del nodo d’uscita (sulla capacità C), che si ha nel caso in cui l’ingresso è zero
(cioè l’NMOS è interdetto ed il PMOS conduce) e sulla gate del pass-transistor vi è 1 (e, quindi,
anch’esso conduce). Come è noto, al posto del PMOS si considera la resistenza Rp, all’NMOS si
sostituisce Rn, e la costante di tempo sarà pari a C⋅(Rn+Rp). Il problema è il valore di Rn che si
considera al posto dell’NMOS pass-transistor. In tal caso, infatti, questo NMOS funziona come
pull-up anziché da pull-down, cioè serve per caricare una capacità anziché (come normalmente
avviene) per scaricarla. Quando il transistore funziona da pull-up presenta una resistenza maggiore
(R’n>Rn) a causa, ad esempio, della perdita della soglia (che non può essere portata in conto
direttamente come differenza di tensione, ma come un aumento di ritardo ovvero come resistenza
maggiore). In definitiva, quando un NMOS funziona da pull-up è meno efficiente di quando
funziona da pull-down. Pertanto all’NMOS quando funziona da pull-up sostituiremo sempre una
resistenza ed un interruttore, solo che la resistenza R’n sarà maggiore di Rn, a parità di W/L. Quindi,
il nostro simulatore switch-level può utilizzare due valori diversi di resistenza per 1’NMOS, in base
al suo funzionamento da pull-up o da pull-down. Infatti, se l’ingresso dell’invertitore passa da 0 ad
1, lo stesso transistore è coinvolto in un processo di scarica della capacità, ovvero funziona da pulldown. Per stimare il valore di R’n, consideriamo il circuito di test di Figura 1.11.
Fig. 1.11 – Circuito di test per il calcolo di R’n
Progetto VLSI e layout dei circuiti integrati
17
Si ha cioè un singolo NMOS a caricare una capacità C il cui potenziale iniziale è nullo (vC(0)=0).
Simuliamo questo circuito con SPICE (o eseguiamo delle misure), considerando un ingresso a
gradino, e calcoliamo il tempo di propagazione tplh. Sostituendo allora al transistore una resistenza
R’n ed un interruttore si ha: tplh=0.69⋅ R’nC, da cui si ricava:
R 'n =
t plh
0.69 ⋅ C
Per dimostrare che R’n>Rn bisogna calcolare analiticamente il valore di tplh; in questo modo
otterremo una espressione analitica di R’n, che potremo confrontare con quella di Rn.
Quando il segnale d’ingresso passa al valore Vdd il transistore funziona nella regione di pinch-off.
La caratteristica i-v è quella mostrata in Figura 1.12. A noi, comunque, interessa l’andamento della
tensione vC per la valutazione di tplh.
Fig. 1.12 – Caratteristica dell’NMOS e andamento i-vC della capacità
L’andamento i-vC si ottiene ribaltando rispetto l’ordinata e traslando di Vdd la caratteristica
dell’NMOS. Il valore massimo di corrente che si ottiene nell’origine è proprio pari a Isat. Per
valutare tplh bisogna valutare il tempo impiegato da vC per passare da 0 a Vdd/2. Sappiamo che:
i=C
dv C
= K (Vdd − Vt − v C ) 2
dt
da cui, separando le variabili, si ricava:
Vdd 2
∫
0
dv C
(Vdd − Vt − v C ) 2
t plh
=
K
1
K
v C = Vdd / 2
dt
⇒
=
t plh
∫ C
Vdd − Vt − v C v C = 0
C
0
Si ha, pertanto:
⎡
⎤ C
Vdd 2
1
1
−
=
⎢
⎥=
⎣ Vdd 2 − Vt Vdd − Vt ⎦ K (Vdd 2 − Vt )(Vdd − Vt )
Vdd 2 (Vdd − Vt )
C Vdd 2 Vdd − Vt
C
=
=
(Vdd 2 − Vt )
K (Vdd 2 − Vt )(Vdd − Vt )2
I sat
t plh =
C
K
Progetto VLSI e layout dei circuiti integrati
18
e, quindi, la resistenza R’n
R 'n =
Vdd
Vdd − Vt
= Rn ⋅x
1.4 I sat Vdd 2 − Vt
14243
x
Il coefficiente x è una funzione della tensione di soglia. Per Vt=0 si ha che x=2, ovvero la resistenza
dell’NMOS nel funzionamento da pull-up è il doppio di quella nel funzionamento da pull-down;
invece, nel caso in cui Vt→Vdd/2 si ha che x→∞. Notiamo, quindi, che la resistenza R’n, è
sicuramente abbastanza più grande di Rn, di un fattore che almeno teoricamente deve essere
maggiore di 2, e che addirittura tende all’∞ se Vt→Vdd/2; in questo caso, infatti, la tensione sulla
capacità va da 0 a Vt-Vdd, e per Vt→Vdd/2 si ha che il transitorio sulla capacità non termina mai
(dato che la tensione sulla capacità tende asintoticamente al valore Vdd/2).
Osserviamo che in questa analisi è stato trascurato l’effetto body (cioè la Vt varia perché la tensione
tra source e substrato è variabile); resta comunque il fatto che la resistenza R’n sarà abbastanza più
grande di Rn.
Un discorso duale può essere fatto per i PMOS, ovvero ci sarà una R’p che è quella che si manifesta
quando si utilizza il PMOS come pull-down anziché come pull-up.
I parametri che forniremo al simulatore non sono indicati con Rn ed R’n, ma sono denominati, per
l’NMOS, nel modo seguente:
⎧ R ≡R
⎪ n n − channel
⎨ '
⎪⎩ R n ≡ R n − channel
dynamic - low
dynamic - high
⇒ R n − channel
⇒ R n − channel
dynamic - low
=
dynamic - high
t phl
=
C
t plh
C
dove, come è possibile osservare, in tali fattori è anche incluso il fattore 0.69.
Fig. 1.13 – Cascata di invertitori CMOS: valutazione di RS
Bisogna, infine, specificare un altro parametro sia per l’NMOS che per il PMOS: questo parametro
viene introdotto per approssimare, in maniera peraltro empirica, il seguente fenomeno. Supponiamo
Progetto VLSI e layout dei circuiti integrati
19
di avere un circuito costituito da due invertitori CMOS in cascata (Fig. 1.13). Vediamo cosa
succede quando il segnale di ingresso ha una transizione alto-basso: ovviamente, all’uscita del
primo invertitore avremo una transizione basso-alto, mentre all’uscita del secondo avremo una
transizione alto-basso.
Purtroppo, il tempo di propagazione del secondo stadio è influenzato dal fatto che il segnale
d’ingresso a tale stadio non è ideale, ma presenta un tempo di salita finito (in quanto, non proviene
da un generatore di tensione ideale). Risulta, quindi:
tphl2 =f(trise1)
ovvero il tempo di propagazione del secondo stadio è funzione del tempo di salita del primo stadio.
Tale dipendenza può essere abbastanza significativa e quindi, se trascurata, può portare a risultati
abbastanza inattendibili. Si utilizzano delle tecniche semplificate per ottenere una stima della
dipendenza di tphl2 dal tempo di salita trise1; l’analisi esatta risulta essere molto complicata in quanto
ci saranno alcuni istanti di tempo (quando l’ingresso del secondo stadio non è né 0 né Vdd) in cui
sia l’NMOS che il PMOS conducono entrambi, e valutare come si scarica la capacità non è affatto
banale. Osserviamo che se la capacità C2 è molto grande e l’NMOS è molto piccolo il tempo di
propagazione che ha il secondo invertitore è molto grande. Pertanto, in questa circostanza, sebbene
il segnale d’ingresso al secondo stadio non sia proprio ideale ma abbia un piccolo tempo di salita,
può dar luogo a delle variazione tutto sommato insignificanti sul tempo di propagazione. Viceversa,
se la capacità C2 è molto piccola e l’NMOS è molto grande, per cui potenzialmente è in grado di
scaricare la capacità in tempi molto rapidi, l’effetto del tempo di salita del segnale d’ingresso è
determinante, ed è proprio tale tempo di salita che determina il tempo di propagazione.
Possiamo introdurre un parametro (che indichiamo ancora con x) definito come;
x=
t rise1
t phl 2,step
ovvero come rapporto fra il tempo di salita del segnale d’ingresso al secondo stadio e il tempo di
propagazione che questo stadio potrebbe avere se fosse pilotato da un segnale d’ingresso ideale.
Inoltre, secondo la formulazione precedente si ha che tphl2,step=Rn dyn. low ⋅C. Osserviamo poi che se x
è molto piccolo vuoi dire che il tempo di salita trise1 è molto piccolo rispetto al ritardo ideale del
secondo stadio; pertanto, il ritardo effettivo del secondo stadio sarà praticamente pari a tphl2,step.
Viceversa, se x cresce, il tempo di propagazione aumenterà rispetto al caso ideale. In definitiva,
possiamo valutare i1 tempo di propagazione del secondo stadio nel modo seguente:
tphl2 = R*⋅C
dove R*= Rn dyn. low ⋅f(x), f(0)=1 con f(x) crescente.
Finora abbiamo fatto riferimento al tempo di salita trise1. Osserviamo, però, che tale tempo di salita
sarà tanto maggiore quanto maggiore sarà il tempo di ritardo del primo stadio. Visto che stiamo
comunque effettuando una trattazione empirica, conviene allora esprimere il parametro x in questi
Progetto VLSI e layout dei circuiti integrati
20
termini:
x=
t plh1
t phl 2,step
dato che il nostro simulatore ha già calcolato il tplh1.
Resta da valutare l’espressione della funzione f(x); poiché i calcoli effettuati sono approssimati, non
possiamo pretendere una espressione esatta per questa funzione. Pertanto, in molti casi questa
funzione viene approssimata mediante una tabella, cioè si effettuano un certo numero di simulazioni
al variare del tempo di ritardo del primo stadio e si valuta come varia il relativo ritardo del secondo
stadio, tabulando la funzione f(x).
Nel caso del nostro simulatore, questa funzione f(x) viene assegnata nella seguente forma analitica:
f (x) ≅ 1 +
xR S
R n dyn. low
dove RS è un parametro di fitting che è possibile determinare in modo da portare in conto, sebbene
in maniera approssimata, l’effetto del ritardo ulteriore introdotto dal fatto che il segnale d’ingresso
del nostro circuito non è ideale, ma ha un tempo di salita finito.
L’espressione effettiva di tphl2 sarà allora:
t phl 2 = C ⋅ R n dyn. low 1 +
t plh1
RS
t phl 2,step R n dyn. low
da cui, valutando i tempi di propagazione del primo e del secondo stadio (ad esempio con SPICE),
si ricava il valore di RS.
Purtroppo, quando si realizza un circuito integrato, i parametri dei dispositivi realizzati non sono
delle costanti, ma bisogna considerare ognuno di essi come una funzione aleatoria. Ad esempio,
consideriamo il L di un transistor di test (con, ad esempio, W/L=2) e consideriamo un circuito
integrato su cui realizziamo 1000 di questi transistor. Tutti i transistor non avranno lo stesso valore
di K, ma si avrà una distribuzione statistica; in altri termini, si avrà un valor medio di K, poi un
valore minimo ed un valore massimo. Tale discorso vale, ovviamente, non solo per il K ma per tutti
i parametri dei dispositivi (capacità, tensione di soglia, ecc.). Si pone allora il problema di quali
valori considerare di questi parametri quando si eseguono le simulazioni del nostro circuito. In
generale, per ogni dispositivo, si considerano i tre casi typical, fast, slow, rispettivamente
corrispondenti alle condizioni nominali, alle condizioni considerate le migliori per il dispositivo (il
K è un po’ più grande, la tensione di soglia un po’ più bassa, per cui la corrente di saturazione è
maggiore, ecc.) ed alle condizioni in cui il dispositivo risulta un po’ peggiore della media.
Generalmente, ciascun costruttore di dispositivi fornisce per i dispositivi a canale le tre schede
.MODEL, corrispondenti ai casi typical, fast e slow, e garantisce che le caratteristiche dei
dispositivi forniti sono contenute in questi estremi. Un discorso analogo varrà anche per le
caratteristiche dei dispositivi a canale p: si avranno tre schede .MODEL, una per il caso tipico, una
Progetto VLSI e layout dei circuiti integrati
21
per il worst-case ed un’altra per il best-case. In questo modo è possibile identificare, per ogni
parametro dei dispositivi, uno spazio. Ad esempio, per fissare le idee, consideriamo il parametro K.
In un grafico rappresentiamo i Kn in ascissa ed i Kp in ordinata.
Fig. 1.14 - Spazio dei possibili valori relativi al parametro K
Sia per Kn che per Kp possiamo avere tre valori: un valore minimo, un valore nominale ed un valore
massimo. Tutti i casi possibili che si possono incontrare sono quelli distribuiti nel rettangolo
mostrato in figura. Per quanto riguarda la simulazione dei nostri circuiti, la scelta più ovvia e più
banale è di simularli nel caso nominale. In tal caso, però, i dispositivi realizzati non saranno tutti
rispondenti alle specifiche; una certa percentuale tra loro andrà bene, altri saranno magari più veloci
ed altri non funzioneranno. Questa non è certamente una situazione ottimale, in quanto alla fine si
avranno degli scarti, bisognerà eseguire dei test sulla velocità, e così via. In generale, allora, è
opportuno garantire il funzionamento del nostro circuito non solo nel caso nominale ma anche nei
cosiddetti angoli di processo, relativi alle condizioni di minimo o massimo dei vari parametri. I
quattro angoli di processo si identificano nei punti che saranno denominati slow-n/slow-p, fastn/fast-p, fast-n/slow-p e slow-n/fast-p.
Se bisogna simulare il nostro circuito per calcolare il tempo di propagazione, è opportuno simularlo
sull’angolo slow-n/slow-p (in corrispondenza del quale sia i dispositivi a canale n che quelli a
canale p sono stati fabbricati un po’ peggio della media). Ci possono essere delle cause di
malfunzionamento, ovvero di errori di sincronizzazione del circuito, quando il circuito è troppo
veloce, ovvero in corrispondenza dell’angolo fast-n/fast-p; è questo il caso in cui bisogna valutare il
vincolo sul tempo di setup dei flip-flop. In altre circostanze può essere necessario simulare il
circuito sugli altri due angoli di processo, slow-n/fast-p e slow-p/fast-n. In ogni caso, noi ci
atterremo al caso nominale, tranne alcuni casi in cui è interessante valutare come peggiorano i tempi
di propagazione nel caso in cui ci si trovi nell’angolo di processo slow-n/slow-p, anziché nel caso
nominale.
1.6
Ritardi introdotti dalle interconnessioni
Nel realizzare un circuito integrato bisogna effettuare delle interconnessioni che introducono una
Progetto VLSI e layout dei circuiti integrati
22
serie di fenomeni non ideali (ritardi, ecc,). I materiali che possono essere utilizzati per fare un
collegamento tra due nodi, in un dato layout, sono:
metal1 (m1)
metal2 (m2)
polisilicio (poly)
diffusioni n, p (ndiff, pdiff)
Il materiale migliore è probabilmente una linea di metallo; quanti più livelli di metallo si hanno a
disposizione, tanto più semplicemente si effettuano le interconnessioni. Noi supporremo di avere a
disposizione due livelli di metallo, che chiameremo metal1 e metal2, che sono separati da uno strato
isolante di ossido; quindi, sono indipendenti fra di loro, a meno di capacità parassite che
eventualmente li possono collegare. Oltre a questi due livelli di metallo, per realizzare delle
interconnessioni, possiamo utilizzare del polisilicio ed anche delle diffusioni n e/o p. Ad esempio
(Fig. 1.15), supponiamo di avere due linee in metal1 (nodi A e B) che vogliamo collegare fra di loro
e tra le quali passano trasversalmente un’altra linea di metal1 ed una linea di metal2.
Fig. 1.15 -Esempio di interconnessione: utilizzo di una diffusione
Per collegare questi due terminali A e B bisogna realizzare due vie di collegamento ed utilizzare o
del polisilicio oppure una diffusione n (o una diffusione p). La scelta del tipo di materiale sarà fatta
in conformità a quale di questi è il migliore dal punto di vista dei parametri parassiti, cioè resistenza
e capacità.
Per valutare la capacità di un rettangolo di regione diffusa ricordiamo che questa realizza con il
substrato una giunzione. Pertanto, la capacità (C) è funzione della tensione inversa (V) applicata
sulla giunzione stessa e sarà rappresentata da un’espressione del tipo:
C( V ) =
C j0 A
(1 + V V j )m
Progetto VLSI e layout dei circuiti integrati
23
dove Cj0 è la capacità per unità di area e A=W•L è l’area del nostro rettangolo. Osserviamo che non
possiamo pensare di utilizzare delle capacità variabili con la tensione, dato che vogliamo avere delle
stime semplificate dei ritardi. Quindi, per effettuare una stima approssimativa dei ritardi, ci si pone
nel caso (un pò irrealistico) peggiore possibile, ossia che la tensione inversa sia V=0. In tal caso si
ha:
C = C j0 A
Consideriamo la sezione A-A’ del circuito di Figura 1.15. Come è possibile osservare (Fig. 1.16),
oltre alla capacità per unità di area bisogna considerare anche il contributo dovuto alle regioni
perimetrali. Allora è possibile approssimare questo aspetto scrivendo la capacità della nostra
regione diffusa nel modo seguente:
C = C b A + Cs P
Fig. 1.16 – Interconnessione mediante una diffusione:sezione del layout
dove Cb si misurerà in fF/µm2 e CS in fF/µm. Tali parametri saranno forniti dal costruttore del
circuito integrato in base alla tecnologia utilizzata e, quindi, non sono dei parametri di progetto su
cui è possibile agire, ma piuttosto delle costanti che sono assegnate una volta definita la tecnologia
utilizzata. Questo discorso vale sia per le diffusioni n che per le diffusioni p.
Ridisegniamo la sezione del layout quando viene utilizzato il polisilicio per collegare i terminali A e
B, anziché la diffusione (Fig. 1.17).
Fig. 1.17 – Interconnessione mediante polisilicio:sezione del layout
Progetto VLSI e layout dei circuiti integrati
24
Osserviamo che lo strato di polisilicio è depositato su uno strato di ossido spesso (dato che non
vogliamo realizzare un mosfet). Anche per il polisilicio possiamo esprimere la capacità come un
contributo per unità di area (C’b) moltiplicata per l’area A:
C = C 'b ⋅ A
Osserviamo, però, che questa espressione è valida nel caso in cui si ha un condensatore le cui
armature hanno un’estensione indefinita. Nel nostro caso, ci saranno anche dei fenomeni di bordo
(sia nella direzione x che nella direzione y) che possono essere tenuti in conto, in maniera
approssimata, introducendo una capacità per unità di perimetro (C’S). ovvero si ha:
C = C 'b ⋅ A + C S' ⋅ P
Notiamo che i coefficienti C’b e C’S, saranno completamente diversi da Cb e CS, sia numericamente
sia per il motivo fisico che è alla loro base. Nel caso del polisilicio si ha un condensatore che non è
a facce piane e parallele, e quindi risente degli effetti di bordo; nel caso delle diffusioni c’è invece il
discorso delle diffusioni laterali e dei profili di drogaggio non costanti.
Per il metall e il metal2 vale esattamente lo stesso discorso che è stato fatto per il polisilicio. Anche
in questo caso si hanno dei condensatori in cui c’è dell’ossido come isolante, che sarà più spesso
(essendo sottoposto a più passi tecno1ogici) e, quindi, le capacità saranno più piccole.
Osserviamo che oltre a queste capacità, fra linee e massa, esistono anche capacità fra linee e linee,
che, in alcuni casi, possono essere significative. Ad esempio, ci sarà una capacità fra la linea di
metall e quella di polisilicio (o di diffusione). Analogamente, ci sarà una capacità fra la linea di
metal2 e il polisilicio, fra il metal2 ed il metal1, e così via. In definitiva, date le numerose linee
presenti nel nostro circuito, dovremo definire una matrice di capacità molto complessa e stabilire
anche dei criteri in base ai quali calcolare queste cross-capacitance (essendo impensabile valutarle
tutte, dato che ciò renderebbe impraticabile qualsiasi tipo di simulazione). In pratica, per ogni linea,
si definisce una sorta di “regione d’influenza” (valutata con algoritmi più o meno sofisticati),
all’interno della quale si calcolano le capacità che eventualmente collegano tale linea con altre
circostanti.
Nel nostro caso andremo semplicemente a valutare la capacità verso massa, disinteressandoci delle
capacità fra linee distinte. Ciò potrebbe comportare dei problemi dato che, se queste ultime capacità
sono abbastanza grandi, potrebbero dar luogo a fenomeni di malfunzionamento del nostro circuito
che però si manifestano in maniera apparentemente casuale. Quindi, nel caso in cui si dispone di un
tool di sviluppo sufficientemente accurato sarebbe opportuno tener conto di questo aspetto.
Per quanto riguarda le capacità, un altro termine importante è la capacità di gate di un mosfet. data
da:
C G MOS = W ⋅ L ⋅ C 'OX
dove C’OX è la capacità della gate per unità di area. Quindi, nel caso dei mosfet, trascuriamo la
presenza di effetti di bordo. Ciò è possibile perché lo spessore della gate è molto piccolo rispetto
alle dimensioni x e y (almeno di un ordine di grandezza).
Progetto VLSI e layout dei circuiti integrati
25
Per la valutazione delle resistenze parassite, consideriamo una linea di dimensioni l x w x t (Fig.
1.18) attraversata da una certa corrente.
Fig. 1.18 - Valutazione delle resistenze parassite
La resistenza è data da:
R =ρ
ρ l
l
=
=ρ N
w⋅t t w
dove N rappresenta il numero di quadrati nei quale possiamo pensare di suddividere il layout della
nostra interconnessione, mentre ρ rappresenta la resistenza di una linea che ha una forma quadrata,
e si misura in Ω. Avremo allora dei valori di ρ differenti secondo l’interconnessione considerata.
Ad esempio, considerando una tecnologia a L=0.6 µm (ovvero λ=0.3 µm), i valori di resistenza e
capacità sono i seguenti:
ndiff
pdiff
poly
metal1
metal2
C’OX
via m2/m1
via m1/poly
Cb [fF/µm2]
0.87
0.67
0.078
0.033
0.022
2.97
-
CS [fF/µm]
0.23
0.93
0.015
0.043
0.069
-
ρ (Ω)
75
80
25
0.013
0.06
3
25
Tab. 1.1 - Valori di resistenza e capacità per una tecnologia a L=0.6 µm
Osservando la Tabella 1.1, è facile comprendere che gli elementi più sfavoriti per quel che riguarda
la capacità sono le diffusioni n e p; il valore di queste capacità è circa un ordine di grandezza
maggiore rispetto a quello del polisilicio. Ciò è dovuto al fatto che nel caso delle diffusioni
l’equivalente del dielettrico è la sottile regione di svuotamento relativa alla giunzione, mentre nel
caso del polisilicio è l’ossido spesso, che sicuramente ha uno spessore maggiore. Questo fatto ci
spinge ad evitare (laddove possibile) l’utilizzo di diffusioni n e p per realizzare un collegamento.
Notiamo ancora che la capacità per unità di area del metal1 è meno della metà di quella del
polisilicio, e ancora più piccola è quella del metal2. Ciò dipende al fatto che ci sono strati di ossido
via via più spessi che separano gli stati di metallo dal substrato. Dunque, i due layers metal1 e
metal2 sono da preferire al polisilicio; d’altra parte la capacità per unità di perimetro tende ad essere
Progetto VLSI e layout dei circuiti integrati
26
maggiore per il metal1 e metal2 rispetto al polisilicio (dato che nei primi gli effetti di bordo sono
più evidenti rispetto al polisilicio, che è più vicino al substrato). In ogni caso, in ordine di priorità, si
considera prima il metallo e poi, eventualmente, il polisilicio. D’altro canto, ci sono una serie di
vantaggi nel fare le interconnessioni in polisilicio, dato che esso va direttamente sulla gate di un
mosfet (non è necessario fare dei contatti) e si può fare più sottile del metal (ci sono delle regole di
progetto meno stringenti), e ciò fa si che molto spesso le interconnessioni vengano comunque
realizzate in polisilicio anziché in metal.
Consideriamo l’esempio di layout di Figura 1.19 per avere un’idea dell’ordine di grandezza delle
capacità in gioco.
Fig. 1.19 - Esempio di layout: valutazione dell’ordine di grandezza delle capacità
Abbiamo una regione diffusa di tipo n larga 3λ e lunga 12λ, una regione di contatto 4λ x 4λ e
regione di metal1 di 6λ x 10λ. I valori di capacità (calcolati facendo riferimento alla Tabella 1.1)
sono quelli riportati di seguito.
CAREA [fF]
CPERIMETRO [fF]
ndiff
4.07
2.76
metal1
0.18
0.41
CTOT
7.42
Notiamo che, per quanto riguarda il metal1, si potrebbe porre il problema di come considerare la
zona in cui il metal1 corre sopra la diffusione. In altre parole, dobbiamo calcolare l’area come il
prodotto 6λ x 10λ oppure dobbiamo sottrarre l’elemento 4λ x 4λ ? E, nel perimetro, dobbiamo
portare in conto o meno tale zona? Teoricamente, dovremo eliminare la zona relativa al contatto dal
calcolo dell’area della linea di metall, dato che sotto di esso non c’è il substrato, ma la regione
diffusa. Inoltre, la capacità fra questi due elementi è cortocircuitata essendoci la via di
collegamento. Comunque, questi sono tutti aspetti del secondo ordine; pertanto, in prima
approssimazione, possiamo trascurare la presenza di queste sovrapposizioni e calcolare l’area come
Progetto VLSI e layout dei circuiti integrati
27
il prodotto W•L.
La capacità che abbiamo ottenuto (di circa 7fF) risulta essere legata quasi essenzialmente alla
diffusione n (il metal1 contribuisce in maniera poco sensibile). Notiamo, inoltre, che per il metal1 è
più importante la capacità perimetrale che non quella per unità di area. Tale valore va confrontato
con la capacità di gate di un mosfet ad area minima, il cui valore è dato da:
Cg0=C’OX⋅Wmin⋅Lmin= (2.97⋅10-15 )(3λ) (2λ)≅ 1.6 fF
Equivalentemente, possiamo valutare quali sono le dimensioni di un mosfet la cui capacità di gate è
pari a quella delle interconnessioni. In tal caso, si ha:
C G = C TOT = 7.42fF ⇒
W 14λ
≅
L
2λ
Quindi la capacità delle interconnessioni è pari alla capacità di gate di un mosfet tutt’altro che ad
area minima; quindi, la capacità CTOT è una capacità abbastanza significativa, ciò perché è stata
utilizzata una regione diffusa di dimensioni abbastanza rilevanti.
Analogamente, calcoliamo la resistenza di una possibile interconnessione per avere un’idea
dell’ordine di grandezza. A tale scopo consideriamo un’interconnessione in polisilicio del tipo
mostrato in Figura 1.20
Fig. 1.20 - Esempio di interconnessione: valutazione della resistenza
Come osserviamo dalla Tabella 1.1, le ρ più grandi sono quelle relative alle regioni diffuse, con
quella relativa alla diffusione p un poco più grande di quella della regione n, forse meno di quanto
ci aspettavamo, essendo la mobilità delle lacune minore di quella degli elettroni. Nonostante ciò, il
rapporto delle due ρ è prossimo ad uno, il che vuol dire che la regione p è probabilmente più
drogata della regione n (il che compensa la differenza di mobilità). La ρ del polisilicio è
abbastanza più piccola delle regioni diffuse, ma non trascurabile. Invece il metal1 e il metal2 hanno
delle resistenze di strato molto più basse; in particolare, il metal2 avrà uno spessore maggiore
rispetto a quello del metal1, visto che la p è circa la metà di quella del metal1. Anche per quanto
riguarda la resistenza delle interconnessioni, in ordine di priorità, è preferibile utilizzare il metal, poi
il polisilicio ed, infine (proprio come ultima risorsa), le diffusioni.
Ritornando al nostro esempio, per valutare la resistenza bisogna calcolare il numero di quadrati in
Progetto VLSI e layout dei circuiti integrati
28
cui è possibile suddividere l’interconnessione. Questo calcolo non è così ovvio visto che la struttura
dell’interconnessione non rettilinea. In ogni caso, c’è un tratto orizzontale che presenta 3 quadrati
ed un tratto verticale che ne presenta 2, e resta da stabilire come valutare il quadrato in
corrispondenza dell’angolo. In questo caso bisognerebbe risolvere un problema tutt’altro che
banale: bisognerebbe imporre le condizioni al contorno, risolvere l’equazione di Laplace, vedere
come vanno le linee di corrente e calcolare la resistenza. Ovviamente non possiamo operare in
questo modo; è invece ragionevole considerare l’elemento d’angolo con un peso minore di 1 perché
il cammino medio della corrente è minore di quello che si ha per un elemento rettilineo. Quindi, in
definitiva, per il nostro numero di quadrati possiamo dire che 5<N<6.
Nel caso la struttura sia ancora più complessa, è possibile utilizzare degli algoritmi semplificati per
avere una stima di N. L’algoritmo più semplice si basa sulla possibilità di sfruttare i parametri
necessari a calcolare le capacità, quali sono l’area ed il perimetro. Dato il nostro elemento di
interconnessione, consideriamo una sorta di rettangolo equivalente, di dimensioni L x W, che ha la
stessa area e lo stesso perimetro della nostra interconnessione, ovvero:
⎧W ⋅ L = A
W, L : ⎨
⎩2 ( W + L ) = P
Quindi W e L saranno le soluzioni dell’equazione di secondo grado:
x2 −
⎧x 1
P
x + A =0⇒⎨
A
⎩x 2
alle cui soluzioni (x1 ed x2) assoceremo W ed L, scegliendo ovviamente per L la più grande delle
due (ci poniamo nel caso più critico). Calcolato W e L in questo modo, è possibile ottenere il
numero di quadri N semplicemente dal rapporto L/W.
Osserviamo che in genere W<<L e, quindi, risulta:
P
⎧
⎪⎪L ≅ 2
L P P
P2
⇒
=
=
⎨
W 2 2A 4A
⎪ W ≅ 2A
⎪⎩
P
In particolare, nel nostro esempio, considerando N=6 otteniamo una resistenza di circa 150 Ω.
Questo valore di resistenza (in generale, quello di un’interconnessione) va confrontato con la
resistenza equivalente di un mosfet, in particolare con la resistenza equivalente di un NMOS ad area
minima, data da:
R0 =
Vdd
1.4 I sat
dove, in questo caso, la Isat è la corrente di saturazione di un NMOS con W/L=3/2. Da questo
confronto è possibile stabilire se la resistenza dell’interconnessione è più o meno significativa.
Progetto VLSI e layout dei circuiti integrati
29
Sappiamo che i valori di R0 sono dell’ordine del KΩ; quindi, nel nostro esempio la resistenza
dell’interconnessione di 150 Ω è in pratica trascurabile (visto che è un ordine di grandezza più
piccola). Osserviamo però che se il mosfet che pilota questa linea non è ad area minima ma ha
un’area più grande, avrà una resistenza più bassa, e quindi la resistenza della linea di polisilicio
potrebbe non essere più trascurabile.
Quindi, ancora una volta, nulla si può dire a priori: bisogna vedere dove è piazzato l’elemento di
interconnessione, ovvero da quali mosfet è pilotato e, dal confronto con la resistenza equivalente di
quest’ultimo, possiamo decidere di trascurare o meno la sua resistenza. Tipicamente, il confronto
viene fatto con la resistenza equivalente dell’NMOS utilizzato come pull-down o del PMOS
utilizzato come pull-up.
1.7
Effetti dei ritardi introdotti dalle interconnessioni sulle prestazioni del circuito
Analizziamo ora, in maniera molto semplificata, in che modo la presenza delle capacità parassite
introdotte dalle interconnessioni può influire sulle prestazioni (sui tempi di propagazione) del nostro
circuito.
L’influenza di questi parametri parassiti dipende molto dal dimensionamento dei dispositivi attivi
che fanno parte del nostro circuito integrato. Per chiarire meglio questo aspetto, consideriamo un
semplice circuito di prova costituito da due invertitori in cascata (Fig. 1.21)
Wn µ n
⋅
= 2 ÷ 2.5
L µp
Fig. 1.21 - Esempio di interconnessione: valutazione della resistenza
Come sappiamo i dispositivi di questo circuito sono dimensionati in modo tale che tutti abbiano la
stessa L, pari alla dimensione minima che è possibile realizzare (per una data tecnologia); il nostro
grado di libertà è costituito dalle W dei dispositivi.
Supponiamo, per i dispositivi a canale n di scegliere una certa W, che indichiamo con Wn. Inoltre,
per rendere simmetrico il funzionamento del nostro invertitore, la W del PMOS dovrà essere pari a
Wn per un fattore che tiene conto della differente mobilità delle lacune rispetto agli elettroni. Questo
Progetto VLSI e layout dei circuiti integrati
30
fattore, µn/µp è un numero il cui valore è compreso fra 2 e 2.5 (secondo la particolare tecnologia
realizzativa considerata). Supponendo, ad esempio (e per comodità di calcolo), che sia pari a 2, si ha
Wp=2⋅Wn.
In definitiva, si ha che il nostro circuito è dimensionato a meno di un grado di libertà, che è il fattore
Wn. Tale grado di libertà che abbiamo per l’invertitore nel nostro esempio, in realtà, lo possiamo
avere per una qualsiasi porta logica CMOS. Ci si chiede, allora, come conviene scegliere questo
grado di libertà: per rispondere a tale domanda analizziamo il tempo di propagazione del nostro
circuito. Preventivamente dobbiamo valutare le capacità di carico, dovute alla capacità di gate dello
stadio a valle (Cg) e alle interconnessioni (Ci).
Supponiamo inizialmente che Ci ≅0, o comunque che Ci<<Cg. Sappiamo che ai mosfet possiamo
associare delle resistenze equivalenti; all’NMOS assoceremo una resistenza equivalente pari a:
Rn =
Vdd
1.4 ⋅ I sat
Per il PMOS, per come abbiamo progettato il circuito, si ha Rp=Rn. Abbiamo poi che:
(
)
C g = C 'OX Wn L + Wp L = 3C 'OX Wn L = 3C 'OX Wn L
(
)
Wn0
Wn
Wn
= 3 C 'OX Wn0 L
= 3C n 0
Wn0
Wn0
Wn0
dove Wn0 è la larghezza minima di canale dell’NMOS e Cn0 è la capacità di gate di un NMOS ad
area minima. Conviene normalizzare anche le resistenze a quella di un dispositivo ad area minima,
ossia si ha:
R n = R n0
Wn0
V
, con : R n 0 = dd
Wn
I sat0
dove Isat0 è la corrente di saturazione di un mosfet ad area minima. Risulta, allora:
R n C g = 3C n 0 R n 0 = 3τ 0
ovvero se si ha solo una capacità di gate da dover pilotare, il ritardo del nostro circuito è
indipendente da Wn (dato che, se si raddoppia Wn, la capacità raddoppia, la resistenza si dimezza e
il prodotto RnCg rimane invariato). Ciò ci spingerebbe a dire che conviene fare la Wn quanto più
piccola possibile (non potendo guadagnare in termini di velocità guadagniamo almeno in termini di
area). Tale discorso vale in quanto abbiamo supposto che la capacità delle interconnessioni sia
trascurabile rispetto alla Cg.
Se la Ci è paragonabile, o addirittura più grande, rispetto a Cg allora bisogna considerare una
capacità totale CT data da:
C T = C g + C i = 3C n0
Wn
+ Ci
Wn0
La costante di tempo, in questo caso, sarà allora:
R n C T = R n0
Wn 0
Wn
⎡
Wn ⎛
C i Wn0
⎜⎜1 +
⎢3C n 0
Wn0 ⎝ 3C n 0 Wn
⎢⎣
⎞⎤
⎛
C i Wn0
⎟⎟⎥ = 3τ 0 ⎜⎜1 +
⎠⎥⎦
⎝ 3C n 0 Wn
⎞
⎟⎟
⎠
Progetto VLSI e layout dei circuiti integrati
31
ovvero tale ritardo, in realtà, risulta essere funzione di Wn, in particolare decresce all’aumentare di
Wn (in quanto ipotizziamo che all’aumentare delle dimensioni dei dispositivi la capacità delle
interconnessioni rimane invariata). Per valutare come bisogna scegliere Wn, per minimizzare i
ritardi basta analizzare l’andamento della costante di tempo in funzione di Wn (Fig. 1.22).
Fig. 1.22 - Andamento di Rn⋅CT in funzione di Wn
Come è possibile osservare, al tendere di Wn\Wn0 all’infinito, la costante di tempo tende a 3τ0; in
corrispondenza del valore minimo di Wn (ovvero Wn0 ), si ha un ritardo pari a 3τ0 (l+Ci/3Cn0). Si
deduce allora che il dimensionamento del nostro circuito deve essere fatto avendo almeno un’idea
di quella che sarà la capacità dell’interconnessione che bisogna pilotare. Se tale capacità è molto
piccola, possiamo anche pensare di fare i dispositivi all’incirca ad area minima, dato che il ritardo
3τ0 (l+Ci/3Cn0) sarà poco più grande di 3τ0. Viceversa, se Ci è molto più grande di 3Cn0 si rischia,
realizzando il circuito ad area minima, di avere un ritardo molto maggiore del valore teorico 3τ0 che
si può ottenere. Ovviamente, dato che la diminuzione del ritardo da un certo punto in poi diventa
poco significativa, non conviene aumentare a dismisura Wn dato che, dopo un certo valore, si
otterrebbero dei marginali miglioramenti del tempo di propagazione, a fronte di un aumento
dell’area sempre maggiore. Quanto detto ci fa capire che, in pratica, non si utilizzano quasi mai
dispositivi ad area minima, altrimenti il ritardo potrebbe essere sensibilmente influenzato da
un’interconnessione, anche di dimensioni ridotte.
In tutto questo discorso non abbiamo tenuto in conto le capacità delle regioni diffuse dei nostri
dispositivi (dei drain dell’NMOS e del PMOS). Bisogna stabilire se anch’esse sono proporzionali a
Wn; in tal caso per esse è possibile fare un discorso analogo a quanto fatto per Cg. Inoltre ciò sarà
uno stimolo a non fare dispositivi troppo grandi, dato all’aumentare di Wn, aumenta la capacità
(Cn0+Cd0). Se invece, in base a come si riesce a realizzare il layout, le aree di drain risultano non
proporzionali (o almeno non proporzionali con un fattore 1 di proporzionalità) a Wn, potrebbe
questo essere un ulteriore stimolo a non fare dispositivi ad area minima.
Quanto detto finora per l’invertitore, vale per qualsiasi porta logica CMOS complessa. Anche in
Progetto VLSI e layout dei circuiti integrati
32
questo caso è possibile realizzare il nostro progetto avendo, alla fine, un grado di libertà (la
dimensione di uno dei dispositivi). La scelta del valore da attribuire a tale grado di libertà dipende
dalla capacità delle interconnessioni.
Un’interconnessione, oltre ad una capacità parassita, presenta anche una resistenza parassita.
Consideriamo una situazione del tutto ideale in cui una linea d’interconnessione non è caricata in
uscita (Fig. 1.23) ed è pilotata in ingresso da un generatore ideale di tensione. Pure in questo caso,
del tutto ideale, ci sarà un ritardo fra il segnale d’ingresso applicato all’interconnessione ed il
segnale d’uscita. Questa situazione ideale ci consente di valutare il cosiddetto ritardo intrinseco
introdotto dall’interconessione
Fig. 1.23 - Caso ideale: linea di interconnessione non caricata in uscita
E’ importante valutare questo ritardo intrinseco essenzialmente per stabilire se esso (come si spera)
è sufficientemente piccolo in modo da poterlo trascurare. Tale ritardo intrinseco è dovuto al fatto
che ogni pezzettino della linea d’interconessione, che è da considerarsi come una linea a parametri
distribuiti, ha una resistenza ed una capacità; quindi, ognuno di questi pezzettini introduce un
elemento di ritardo. Per studiare questo circuito, dividiamo la nostra linea in tanti pezzettini, ognuno
dei quali è approssimato con una resistenza R ed una capacità C verso massa. Supponendo che tali
pezzettini abbiano tutti le stesse dimensioni, associamo loro uno stesso valore di R e di C. Il sistema
che ne risulta è di tipo passa-basso, quindi possiamo approssimare la risposta del nostro sistema
mediante un sistema equivalente del primo ordine, utilizzando la tecnica delle costanti di tempo.
Considerando, ad esempio, il quarto elementino di linea, la costante di tempo associata alla capacità
di tale elementino è data da:
τ4=C⋅R4=C⋅ (3R)
In generale si ha τk=RC(k-1). La costante di tempo equivalente sarà allora:
n
n
k =1
k =1
τ eq = ∑ τ k = RC ∑ (k − 1) ) = RC
n (n − 1)
2
Progetto VLSI e layout dei circuiti integrati
33
Ovviamente possiamo ottenere un’approssimazione tanto migliore quanto più n è grande (cioè
quanto più fitta è la discretizzazione della nostra linea di interconnessione). Quindi, considerando
un n»1 si ha:
τ eq ≅ RC
n2
2
Osserviamo, però, che il fattore n⋅R è pari alla resistenza totale della nostra linea (RT), ovvero
n⋅R=RT; analogamente, si ha n⋅C=CT, dove CT è la capacità complessiva della linea. Dunque, la
costante di tempo equivalente risulta essere pari a:
τ eq ≅
1
R TCT
2
dove il fattore 1/2 tiene conto del fatto che il nostro circuito non è a costanti concentrate ma a
costanti distribuite. A questo punto, ricordiamo le espressioni di RT e CT in funzione della geometria
della linea di interconnessione (lunga L e larga W, con L>>W).
L
⎧
⎪R T = ρ
W
⎨
⎪⎩C T = C b LW + C s 2(L + W ) ≅ C b LW + C s 2L
Abbiamo allora:
R TCT = ρ
⎛
C ⎞
L
(C b LW + 2C s L) = ρ C b L2 ⎜⎜1 + 2 s ⎟⎟
W
Cb W ⎠
⎝
Dunque si ha che τeq,∝ L2, il che è evidente visto che sia RT che CT aumentano con L. Ciò che forse
è meno evidente è che il τeq cresce al diminuire di W. Questo è dovuto al fatto che, mentre la
resistenza è inversamente proporzionalmente a W, la capacità presenta il termine perimetrale che è
all’incirca indipendente da W. Questo fattore aggiuntivo fa si che la costante di tempo equivalente
cresce al decrescere di W. Per avere un’idea dell’ordine di grandezza di tale costante di tempo
consideriamo una linea in polisilicio con L =300µm e W=0.6µm; in tal caso si ottiene un ritardo
pari a 0.69 τeq ≅0.l8ns (che è lo stesso ordine di grandezza del parametro τ0 di un invertitore). In
questo esempio, però, abbiamo considerato una linea di polisilicio lunga 300µm; quindi, nei casi
pratici (a meno di casi particolarmente strani) il ritardo intrinseco introdotto da un’interconnessione
può essere tranquillamente trascurato. Infatti, se, invece del polisilicio, avessimo usato una linea di
metallo tale ritardo si sarebbe ridotto di più di un ordine di grandezza. Ricordiamo, però, che tale
ritardo cresce comunque con il quadrato della lunghezza della linea.
In definitiva, i modelli che possiamo utilizzare per portare in conto il ritardo introdotto dalle
interconnessioni sono, sostanzialmente, quelli riportati in Figura 1.24.
Considerando due invertitori in cascata, al livello di approssimazione (1) consideriamo la sola
34
Progetto VLSI e layout dei circuiti integrati
capacità introdotta dall’interconnessione Ci. Al livello di approssimazione (2) possiamo tenere in
conto anche della resistenza serie R dell’interconnessione. Al livello (3) sono considerati anche gli
aspetti distribuiti, ovvero l’interconnessione è considerata come una linea di trasmissione.
Ovviamente c’è anche il livello (0) in cui sono trascurati del tutto gli effetti parassiti delle
interconnessioni.
Fig. 1.24 – Modelli per portare in conto il ritardo delle interconnessioni
Dall’analisi fatta in precedenza deduciamo di poter tranquillamente trascurare il modello che
considera gli elementi distribuiti, poiché l’effetto del ritardo intrinseco è generalmente molto
piccolo. Inoltre, l’effetto della resistenza serie della linea di interconnessione può essere trascurato o
meno in base alle resistenze equivalenti dei dispositivi che costituiscono la nostra porta logica. Se,
come tipicamente accade, queste resistenze sono abbastanza più grandi di R, allora l’effetto di tale
resistenza può essere trascurato nei nostri calcoli. Quindi per la maggior parte dei casi faremo
riferimento al modello (1), in altre parole approssimando l’interconnessione con una semplice
capacità. Viceversa, non portare in conto la capacità dell’interconnessione può comportare degli
errori molto grandi, quali ad esempio quello di dimensionare tutti i dispositivi ad area minima, che
abbiamo visto non essere una buona scelta.
Solo per alcune linee particolarmente critiche può essere utile valutare l’effetto della resistenza serie
dell’interconnessione, considerando quest’ultima sempre come un elemento a parametri concentrati.
Il ritardo dovuto alle resistenze serie delle interconnessioni è particolarmente importante per una
sola interconnessione del nostro circuito, quella relativa alla linea di clock. Infatti, se abbiamo un
sistema sequenziale, si avranno dei registri di memoria che catturano il dato al loro ingresso in
corrispondenza dei fronti del segnale di clock. Il funzionamento del nostro circuito si basa
sull’ipotesi che questi fronti del segnale di clock arrivino, nello stesso istante, a tutti registri del
nostro circuito. Nel momento in cui ciò non accade, un registro può memorizzare un dato quando
Progetto VLSI e layout dei circuiti integrati
35
questo ancora non è valido, o quando questo sta ancora cambiando. Questo, ovviamente, non
significa peggiorare le prestazioni del nostro sistema ma, piuttosto, che il sistema non funziona più.
E’ importante stabilire qual è il ritardo massimo che possiamo aspettarci sulla linea di clock e
adottare le opportune contromisure. Abbiamo un ritardo sulla linea di clock proprio perché la linea
di interconnessione non è ideale. Bisogna, allora, saper stimare il ritardo τclock su questa linea di
clock e, una volta stimato tale ritardo, garantire la funzionalità del nostro circuito.
Fig. 1.25 – Stima del ritardo sulla linea del clock
Consideriamo una situazione limite mostrata in Figura 1.25. Abbiamo un circuito che genera il
segnale di clock (clock driver), un primo registro che si trova nelle immediate vicinanze del clock
driver e una lunga linea di interconnessione (schematizzata con la sua resistenza e la sua capacità)
che pilota un banco di registri posizionati ad una certa distanza dal primo registro.
Dobbiamo valutare allora il ritardo τclock fra l’istante di tempo in cui il fronte di clock arriva al
registro in prossimità del clock driver e l’istante di tempo in cui il fronte arriva dall’altra parte della
linea. Tale ritardo é dato da:
τclock =0.69 ⋅Rclock C
La capacità totale C è la somma di due contributi: un contributo dovuto alle interconnessioni (Ci) ed
uno legato alle capacità di gate dei vari flip-flop comandati dalla linea di clock (Cg). Ad esempio,
supponiamo di avere un registro da 16 bit (16 flip-flop). Ogni flip-flop ha, al suo interno, i seguenti
elementi di layout: un rettangolo equivalente di metal1 di 30µm x 12µm, un rettangolo equivalente
di poly di 20µm x 0.8µm, 8 NMOS con W/L=12λ/2λ e 8 PMOS con W/L=30λ/2λ (ipotizzando
λ=0.3µm). La capacità totale C risulta essere pari a circa l80fF per ogni flip-flop ed è dovuta quasi
essenzialmente ai mosfet (la capacità delle interconnessioni risulta essere, infatti, dell’ordine di
5÷6fF). La capacità associata all’intero registro è allora pari a Cregistro=l6xl80fF ≅2.9pF. La capacità
associata all’interconnessione sarà certamente più piccola di tale valore, possiamo quindi
Progetto VLSI e layout dei circuiti integrati
36
trascurarla; viceversa, non possiamo trascurarne la resistenza. Se supponiamo che questa linea di
interconnessione sia realizzata in polisilicio, lunga 45µm e larga 0.6µm, si ha 0.69⋅Rclock Cregistro≅3.7
ns, che risulta essere un ritardo abbastanza consistente (il che può portare ad errori di
sincronizzazione del nostro circuito). Se utilizziamo il metallo per tale interconnessione, a parità di
dimensioni, otteniamo un ritardo di circa 30 ps (valore certamente più accettabile rispetto a quello
relativo al polisilicio) Osserviamo, però, che se consideriamo un banco di 32 registri da 16 bit
otteniamo, anche se utilizziamo una linea in metal, un ritardo di circa 900 ps. In questo caso il
ritardo risulta essere non più accettabile e ciò che ci resta da fare allargare la linea, in modo da
ridurne la resistenza Rclock.
Quanto detto risulta essere uno dei problemi più significativi, in particolare per i microprocessori
più avanzati, in cui le capacità che si hanno sul clock sono dell’ordine di decine di nF; quindi è
fondamentale avere un’idea del ritardo sulla linea di clock. In questi casi un parametro importante
può essere la resistenza del contatto; pertanto si realizzano più contatti in parallelo per ridurre la
resistenza serie ad essi associata.
In ogni caso questo ritardo non si riesce a portarlo zero, ma sarà ridotto ad un certo valore minimo.
In queste condizioni bisogna garantire che il circuito funzioni correttamente, e ciò può sempre
essere realizzato progettando opportunamente la temporizzazione del nostro sistema.
1.8
Linee di alimentazione
Per le linee di alimentazione possiamo individuare due tipi di problemi, uno legato al fenomeno dì
migrazione metallica ed un altro legato alla presenza dei cosiddetti “rimbalzi” delle linee.
Fig. 1.26 – Effetti della migrazione metallica
Consideriamo una linea di metal nella quale passa una certa corrente I (Fig. 1.26) e supponiamo che
una parte di questa linea, a causa di un imperfezione costruttiva, sia più sottile rispetto al resto della
linea. La densità di corrente J=I/A (con A=sezione della linea) avrà un massimo proprio in
corrispondenza di tale punto. I grani metallici che compongono la linea possono migrare seguendo
il flusso della corrente, e tale migrazione è ovviamente tanto più forte laddove maggiore è la J. Nel
nostro caso, tale fenomeno sarà particolarmente evidente nel punto in cui la linea è più stretta. Si
innesca allora un fenomeno rigenerativo dato che, nel momento in cui i grani metallici migrano, la
sezione della linea si riduce e ciò comporta un ulteriore aumento di J. Ciò può portare alla rottura
Progetto VLSI e layout dei circuiti integrati
37
della linea.
Il problema è che questo fenomeno può avvenire con scale dei tempi che possono essere molto
lunghe, dando luogo a problemi di affidabilità del circuito. Per evitare che si abbia un fenomeno di
questo tipo, è necessario limitare la corrente che passa in una linea, o meglio la densità di corrente
deve essere sufficientemente bassa. Il costruttore del circuito integrato fornisce quindi un valore
massimo di corrente assegnato in A/µm, ampere per µm di larghezza della linea, essendo la
larghezza W 1’unico parametro su cui si può agire (dato che lo spessore dipende dalla tecnologia
costruttiva). Questo valore di corrente massima, Imax, è dell’ordine di 1mA/µm, che è da intendersi
come valor medio di corrente. Essendo la corrente che attraversa la linea non perfettamente
costante, ma anzi con picchi attorno ad un valore medio, il costruttore, oltre a fornire questo
massimo valore di corrente media, fornisce anche i valori massimi tollerabili di corrente di picco.
Per valutare la corrente media, consideriamo il circuito di Figura 1.27 (per semplicità consideriamo
un invertitore che pilota una capacità, ma si potrebbe adattare ad una qualsiasi porta logica, dato che
la potenza si esprime sempre allo stesso modo).
Fig. 1.27 – Circuito per il calcolo di Imax
La potenza dissipata da questo circuito è data da:
P=VDDI=fCVDD2
ovvero la corrente media sarà pari a I=fCVDD. Deve allora risultare che:
fCVDD
I fCVDD
=
< I max ⇒ W >
W
W
I max
Bisogna perciò realizzare la linea di alimentazione sufficientemente larga, tale che la densità di
corrente sia sufficientemente bassa ed il fenomeno di migrazione metallica non abbia a verificarsi.
Anche il problema dei “rimbalzi” sulle linee di alimentazione impone un vincolo su W.
Consideriamo ancora un invertitore (ma potrebbe essere una qualsiasi porta logica), in cui la linea di
alimentazione non è proprio ideale ma ha una sua resistenza serie R (Figura 1.28). Supponendo che
l’ingresso abbia una transizione 1 →0 si ha che il PMOS entra in conduzione, l’NMOS s’interdice e
si ha una corrente che va a caricare la capacità C. Si ha allora una caduta di tensione sulla resistenza
38
Progetto VLSI e layout dei circuiti integrati
R pari a R⋅ic. Questa caduta di tensione prende il nome di “rimbalzo” sull’alimentazione essendo
una conseguenza della commutazione dell’uscita. La corrente ic non è la stessa del caso precedente,
dato che qui si tratta di una corrente istantanea.
Fig. 1.28 – Circuito per la valutazione dei “rimbalzi”
La corrente istantanea può essere stimata valutando l’andamento della tensione di uscita vo (Fig.
1.29) e ricordando che ic=C⋅dvo/dt
Fig. 1.29 – Andamento della tensione di uscita e della corrente ic
Progetto VLSI e layout dei circuiti integrati
39
Il valore massimo di corrente sarà dato da:
i c max = C
VDD
tr
Ciò vuoi dire che la corrente assorbita dall’alimentazione ha una serie di impulsi in corrispondenza
dei fronti dell’uscita, il cui valore medio è pari ad I (di cui parlavamo a proposito della migrazione
metallica, e che dipende dal periodo del segnale, ovvero dalla frequenza). La variazione di tensione
che sì avrà su R sarà allora:
∆VR = R ⋅ i c max = C
VDD
tr
Tale rimbalzo della tensione d’uscita sulla linea di alimentazione è, ovviamente, fastidioso in
quanto il potenziale corrispondente al nodo P, durante la commutazione, si abbassa di una quantità
proprio pari a ∆VR. Se tale punto alimenta un’altra porta logica questa si troverà istantaneamente ad
una tensione d’alimentazione più bassa di VDD e ciò può comportare tutta una serie di problemi (i
margini di rumore cambiano, l’uscita di questa porta comincia a fluttuare invece di rimanere
costante, ecc.). E’ necessario allora limitare questo fenomeno di rimbalzo sulle linee di
alimentazione; in altri termini, questo ∆VR deve essere abbastanza più piccolo dei margini di
rumore del nostro circuito (dell’ordine di qualche centinaio di mV. essendo i margini di rumore
dell’ordine di 1.5÷2V, per una tensione di alimentazione di 5 V). Il nostro obiettivo fondamentale è
quello di dimensionare la linea di alimentazione, e quindi dimensionare R. Essendo:
R=
∆VR t r
L
=ρ
CV CC
W
si ricava un altra relazione per W, ovvero:
W>
ρ L
CV CC
∆ VR t r
Sceglieremo dunque W come il valore massimo tra questo valore è quello che si ricava dal vincolo
dovuto al fenomeno della migrazione metallica.
Ad esempio, consideriamo una frequenza f=50MHz, una capacità C=l00pF (la tipica capacità di una
linea di clock), una tensione di alimentazione VDD=5V e un tempo di salita/discesa tr = tf ≅1ns. Per
valutare il primo vincolo, dovuto alla migrazione metallica, calcoliamo la potenza dissipata che vale
PD= 125 mW, da cui il valore della corrente media, I=25 mA. Allora, se abbiamo una Imax di
1mA/µm si ha che W>25µm (anche se, per maggiore sicurezza, conviene fare la linea un poco più
grande). Supponendo di aver progettato la linea in questo modo vediamo cosa si ha per quanto
riguarda il problema dei rimbalzi. La icmax risulta essere pari a 0.5 A che per un circuito
microelettronico è un valore molto grande, rispetto al valore medio di 25mA. Ciò, ovviamente, è
40
Progetto VLSI e layout dei circuiti integrati
dovuto al tempo di salita che è una piccola frazione del periodo. Il valore di W, a questo punto, sarà
determinato dalla lunghezza della linea: per una lunghezza L=250µm (100 quadri con W=25µm) si
avrebbe ∆VR ≅0.5V, che sicuramente è un valore inaccettabile. Bisognerebbe, quindi, o aumentare
W o cercare di ridurre L. Osserviamo che L=250µm può sembrare un valore molto grande, ma in
realtà è un valore realistico, poiché bisogna tener presente che le linee di alimentazione devono
arrivare a tutte le porte logiche del nostro chip. In definitiva, per ridurre il ∆VR bisogna aumentare
W oppure aumentare tr, in particolare per i terminali di uscita del chip che pilotano le capacità di
carico, il cui valore può non essere noto a priori (e che può essere anche di centinaia di µF). Per
questo motivo, tutti i terminali di ingresso/uscita vengono progettati per minimizzare il ritardo di
propagazione, ma portando in conto che il tempo di salita non deve essere troppo basso (altrimenti il
picco di corrente che può passare diventa eccessivo, pregiudicando il funzionamento del circuito):
in tal caso, si dice che c’è un limite sulla slew-rate della tensione d’uscita.
1.9
Layout editor: layout simbolici ed effettivi, stick-diagrams
Utilizzando un layout editor tipo MAGIC (distribuito dall’Università di Berkley) non vi è la
necessità di dover disegnare la n-well, ossia la regione diffusa nel substrato per ospitare i PMOS;
inoltre, nelle zone di contatto non sono evidenziate le regioni in cui sono effettivamente realizzate le
vie di collegamento. Il motivo di ciò è che il layout-editor che comunemente utilizziamo è di tipo
simbolico ed il layout che si ottiene rappresenta, in qualche modo, una sorta di livello di astrazione
più alto rispetto al layout effettivo del circuito, altri non è che l’insieme delle maschere che servono
per progettare il nostro circuito integrato. Con questo layout-editor, allora, non si disegnano le
effettive maschere da utilizzare, ma qualcosa di più semplice da cui è possibile ottenere le maschere
necessarie per la fabbricazione del nostro circuito. Il passaggio da layout simbolico a layout
effettivo avviene, comunque, in maniera del tutto automatica, grazie a delle opportune routine: a
partire dal layout simbolico, il layout effettivo è sicuramente corretto per costruzione.
Fig. 1.30 – Struttura tipica di un layout
Progetto VLSI e layout dei circuiti integrati
41
Fra le varie regole di progetto, la più rilevante è quella relativa alla distanza (spacing) fra le regioni
n-diff e p-diff, che deve essere maggiore o uguale a 12λ, un valore molto maggiore rispetto alle
altre regole di progetto. Le regioni diffuse di tipo n e di tipo p devono essere così distanti fra loro
perché si deve consentire la realizzazione della n-well (che include le diffusioni di tipo p e i contatti
relativi alla well). Quindi, questa è la regola più stringente ed è quella che vincola maggiormente il
nostro progetto in termini di occupazione di area. Infatti, dovendo rispettare sia questa regola che il
dover mettere quante più prese di substrato sia possibile vicino agli NMOS ed ai PMOS, il layout
(qualunque esso sia) avrà sempre una struttura del tipo mostrato in Figura 1.30.
Come riportato in figura, si avranno due linee di alimentazione: una linea di alimentazione positiva
chiamata, per convenzione, “Vdd !” ed una linea di massa, chiamata “GND!”. Il punto esclamativo
indica che si tratta di nodi globali, cioè riferimenti assoluti di alimentazione e massa.Lungo la linea
Vdd! saranno piazzati i PMOS, mentre sulla linea GND! saranno piazzati gli NMOS, mantenendo
una distanza di almeno 12λ fra i dispositivi NMOS e PMOS. I PMOS sono piazzati vicino alla linea
Vdd! (gli NMOS vicino alla linea GND!) perché così è più semplice realizzare le prese di substrato.
Nel realizzare il layout del nostro circuito, invece che disegnare di volta in volta i vari rettangoli,
conviene partire da un disegno semplificato, che prende il nome di stick-diagram (diagramma a
stecchino). Nello stick-diagram si disegnano semplicemente le posizioni relative dei vari elementi,
senza tener conto delle effettive dimensioni dei rettangoli. Ogni layer è rappresentato con una linea
che avrà un colore o un tratteggio differente (Figura 1.31).
Fig. 1.31 – Rappresentazione dei layers in uno stick-diagram
Ad esempio, al polisilicio si fa corrispondere una linea continua, al metall una linea tratteggiata, ai
metal2 una linea tratto e punto, alla diffusione n una sequenza di cerchi vuoti, alla diffusione p una
sequenza di cerchi pieni, i contatti sono rappresentati mediante dei rettangoli pieni mentre le prese
di substrato con delle ‘x’. Ovviamente, per ognuno di questi layers, non specifichiamo né le
Progetto VLSI e layout dei circuiti integrati
42
dimensioni, né la distanza fra loro. Lo stick-diagram ci serve solo per capire come in seguito sarà
organizzato il layout. Ciò è molto importante perché ci sono degli algoritmi che consentono, in
molti casi, di ottenere in maniera automatica il layout, e quindi lo stick-diagram. Vediamo adesso
cosa succede quando due linee si intersecano in uno stick-diagram; le varie combinazioni sono
riassunte nella Tabella 1.2.
m2
m1
poly
n-diff
p-diff
m2
corto
circuito
circuito
aperto
circuito
aperto
circuito
aperto
circuito
aperto
m1
circuito
aperto
corto
circuito
circuito
aperto
circuito
aperto
circuito
aperto
poly
circuito
aperto
circuito
aperto
corto
circuito
NMOS
PMOS
n-diff
circuito
aperto
circuito
aperto
NMOS
corto
circuito
Illegale
p-diff
circuito
aperto
circuito
aperto
PMOS
Illegale
corto
circuito
Tab. 1.2 – Interpretazione delle possibili intersezioni tra layers in uno stick-diagram
Le intersezioni illegali sono ovvie in quanto i layer p-diff ed n-diff devono distare almeno 12λ.
Fig. 1.32 – Stick-diagram di un invertitore
Ad esempio, lo stick-diagram di un invertitore sarà del tipo mostrato in Figura 1.32. Supponendo di
dover passare una segnale k da sinistra a destra del circuito, la soluzione più immediata è quella di
utilizzare una linea metal2. Supponiamo, però, di non poter utilizzare il metal2 (perché, ad esempio,
ci sono altri due nodi da collegare, scavalcando anche il segnale k). Modifichiamo allora il nostro
1ayout in modo da renderlo, come suol dirsi, “trasparente al metal1”. Una possibile soluzione è
mostrata in Figura 1.33, in cui il collegamento verticale relativo all’uscita è realizzato in polisilicio,
utilizzando altri due contatti orizzontali ed un altro contatto per riportare l’uscita da poly a metal1
Progetto VLSI e layout dei circuiti integrati
43
(se necessario). Notiamo che non si può realizzare un contatto diretto fra diffusione e polisilicio
poiché, essendo il processo autoallineato, il polisilicio è depositato prima delle diffusioni..
Fig. 1.33 – Stick-diagram di un invertitore “trasparente al metal1”: prima soluzione
Gli svantaggi di quest’approccio sono dovuti al fatto che si è realizzata la linea verticale in uscita al
polisilicio. La lunghezza di questa linea è dell’ordine di 12λ, per una larghezza di almeno 2λ.
Quindi la lunghezza di questa linea di poly è dell’ordine di 6 quadrati, ognuno dei quali presenta
una resistenza di circa 30Ω; in uscita, pertanto, si ottiene intorno ai 100÷200Ω, che tipicamente è
inferiore alle resistenze equivalenti degli NMOS e dei PMOS. Quindi, l’effetto di questa resistenza,
seppur presente, è abbastanza trascurabile. Ciò che, invece, non può sicuramente esser trascurata è
la capacità della linea di polisilicio, che peggiora il nostro circuito in termini di velocità, potenza
dissipata, e così via.
Un’altra possibile soluzione è riportata in Figura 1.34.
Fig. 1.34 – Stick-diagram di un invertitore “trasparente al metal1”: seconda soluzione
La soluzione qui adottata è cambiare la disposizione delle regioni diffuse, realizzandole ad angolo
retto. In questo modo abbiamo guadagnato uno spazio (sopra il PMOS e sotto l’NMOS) attraverso
cui è possibile far passare la linea di collegamento in metal1. Tale linea, ovviamente, non può essere
44
Progetto VLSI e layout dei circuiti integrati
in polisilicio altrimenti, in serie al PMOS, si crea un altro mosfet a canale p che pregiudica il
funzionamento dell’invertitore. Rispetto all’invertitore originario, si sono aumentate le dimensioni
delle regioni diffuse e, dunque, le resistenze e le capacità dei dispositivi. Per le resistenze vale un
discorso analogo a quanto detto prima: il numero di quadrati aggiuntivi, per allungare le regioni
diffuse, molto probabilmente non è così elevato da alterare apprezzabilmente la resistenza serie dei
mosfet. Occorre allora stimare l’effetto delle sole capacità delle regioni diffuse (che sono
abbastanza grandi).
Fig. 1.35 – Invertitore: circuito relativo allo stick-diagram di figura 1.34
Lo schema circuitale di Fig.1.35 illustra la collocazione delle capacità aggiuntive che, per come è
stata progettata la linea in polisilicio che collega le gate dei mosfet, sono disposte tra i terminali di
source e substrato dei due mosfet. Ma, poiché queste due regioni sono connesse all’alimentazione
(PMOS) ed alla massa (NMOS), queste capacità sono cortocircuitate e, perciò, ininfluenti.
Fig. 1.36 –Influenza della capacità di diffusione
Viceversa, se modifichiamo lo stick-diagram come mostrato in Figura 1.36, le capacità sono
Progetto VLSI e layout dei circuiti integrati
45
collocate tra il drain ed il substrato dei mosfet, ossia in uscita all’invertitore. Ciò comporta un
rallentamento del circuito ed un sensibile aumento della dissipazione di potenza.
Come ulteriore esempio, riportiamo in Figura 1.37 lo stick-diagram di una porta NAND con
ingressi A e B. Si noti che i due NMOS in serie sono semplicemente dati dall’adiacenza delle due
linee di polisilicio della gate. A meno che non vi siano motivi per accedere al nodo X, non c’è la
necessità di usare una via, ed il collegamento tra il drain del NMOS sottostante X ed il source del
NMOS sovrastante X è dato dalla continuità della regione ndiff.
Fig. 1.37 – Stick-diagram di una porta NAND