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