Università degli Studi di Cagliari Dipartimento di Ingegneria Elettrica ed Elettronica Corso di Circuiti Integrati Anno Accademico 2015/2016 1 Introduzione In questo breve tutorial utilizzeremo il software Virtuoso della suite Cadence per simulare la funzionalità di uno specchio di corrente in tecnologia CMOS. Il software è installato su una macchina virtuale Linux e per poter lanciare il software è necessario aprire un terminale, posizionarsi nella directory home digitando il comando “cd” e lanciare lo script di avvio mediante il comando “source start_cadence_NCSU” 2 Schematico 2.1 Creazione di un nuovo schematico Una volta avviato il software appariranno due finestre, una chiamata Command Interpreter Window (CIW) permette di vedere i messaggi di errore, aprire nuove finestre e far partire tool utili per il design, l’altra chiamata Library Manager permette di creare nuove librerie, nuove celle o aprire quelle già esistenti. CIW Library Manager Per cominciare sarà necessario creare una nuova libreria all’interno della quale andremo a salvare tutti i progetti. Per farlo è necessario utilizzare il Library Manager e selezionare dal menù file la voce opportuna Menu File -> New -> Library Pulsante barra strumenti A questo punto apparirà una finestra in cui sarà necessario specificare il nome da dare alla Libreria, per esempio MyLibrary, e cliccare OK. Nella nuova finestra che apparirà sarà possibile decidere quale tecnologia associare alla Libreria che stiamo creando. Tra le varie voci selezione quindi “Attach to an existing technology library” e successivamente tra le varie tecnologie disponibili scegliere NCSU_TechLib_FreePDK45 come mostrato nelle immagini sottostanti. Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro A questo punto la nostra Libreria comparirà nell’elenco delle librerie disponibili all’interno del Library Manager e sarà possibile creare al suo interno nuove celle. Per creare una cella utilizzare l’apposito comando del Library Manager Menu File -> New -> Cell View Pulsante barra strumenti Comparirà la seguente schermata dalla quale sarà possibile selezionare la Libreria in cui andare a salvare la nuova cella, il nome della cella e il tipo di cella. In questo caso noi vogliamo creare uno schematico quindi il typo dovrà essere schematic. Una volta scelto il nome, per esempio current_mirror, possiamo cliccare OK e a questo punto apparirà un nuovo foglio di lavoro all’interno del quale potremmo andare a disegnare il circuito. Per salvare lo schematico appena creato e in generale per salvare lo schematico dopo ogni modifica si deve utilizzare il comando “Check and Save”. Menu File -> Check and Save Pulsante barra strumenti 2.2 Piazzamento dei componenti Il primo passo della creazione dello schematico è il piazzamento dei componenti sul foglio di lavoro. Per fare questo bisognerà prendere i componenti da una libreria standard oppure da una creata appositamente. Nel nostro caso utilizzeremo i dispositivi della libreria NCSU_Devices_FreePDK che contiene al suo interno diverse tipologie di transistor caratterizzati da diverse tensioni di soglia (VTL per transistor con basse tensioni di soglia, VTG per tensioni di soglia intermedie e VTH per alte tensioni di soglia). Per piazzare un componente utilizzare l’apposito menù o pulsante sulla barra degli strumenti oppure semplicemente schiacciare la lettera “i” Menu Create -> Instance Pulsante barra strumenti Si aprirà una finestra di scelta come quella mostrata in Figura 1: Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Per ogni nuova istanza è necessario specificare a) La libreria in cui risiede il componente da istanziare b) Il nome della cella da istanziare c) La view della cella da istanziare che in questo caso sarà symbol (in quanto nello schematico andremo a piazzare il simbolo del componente) d) Un nome significativo da assegnare all’istanza Per specificare tutti i parametri è possibile schiacciando il tasto Browse aprire una interfaccia grafica che permette di scegliere in maniera semplificata il componente da istanziare come mostrato sotto Per istanziare un NMOS, scegliamo la Libreria NCSU_Devices_FreePDK45, la Cell NMOS_VTG e la View symbol. Una volta selezionate tutte le voci cliccare close per ritornare alla schermata precedente Nella finestra mostrata a sinistra è possibile a questo punto selezionare le dimensioni da dare al transistor mediante i parametri width e length. Le dimensioni minime della tecnologia utilizzata corrispondono a 50 nm per la lunghezza e a 90 nm per la larghezza del transistor Figura 1: Istanziare un componente Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Per piazzare il componente dopo aver premuto hide è necessario scegliere dove posizionarlo e cliccare col tasto sinistro del mouse. A questo punto si possono continuare a piazzare nuovi componenti dello stesso tipo fino a che non si preme il tasto ESC. Figura 2: Componente piazzato Una volta piazzato il componente, come mostrato in Figura 2, se ne possono ancora modificare le proprietà (i parametri). Per farlo, posizionare il cursore sul componente (M1, in Figura 2) e selezionarlo premendo il tasto sinistro del mouse. Una volta selezionato è possibile cliccarci sopra col tasto desto e scegliere la voce properties nel menu che si apre. A questo punto comparirà una finestra identica a quella utilizzata per l’impostazione dei parametri mostrata in Figura 1. I parametri obbligatori sono la L (Length) e la W (Width), gli altri sono opzionali. Nel compilarli si tenga conto della sintassi per gli ordini di grandezza che sono esprimibili con le seguenti lettere (colonna 1 della Tabella 1) oppure con la notazione scientifica (colonna 2): Tabella 1: sintassi ordini di grandezza LETTERA FORMATO SCIENTIFICO VALORE f E-15 Femto (10-15) p E-12 Pico (10-12) n E-09 Nano (10-9) u E-06 Micro (10-6) m E-03 Milli (10-3) k E+03 Chilo (10+3) M E+06 Mega (10+6) Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro 2.3 Aggiunta dei fili di interconnessione Dopo avere piazzato tutti i componenti si aggiungono i fili di interconnessione tramite il comando: Menu Create -> Wire (narrow) Pulsante barra strumenti Si clicca col tasto sinistro del mouse sul terminale da cui parte il filo (wire), ogni volta che si vuole fare una curva a 90° si preme nuovamente il tasto sinistro. Per terminare di disegnare il wire bisogna arrivare ad un altro terminale oppure fare doppio click col tasto sinistro del mouse. Figura 3: Aggiunta di un wire (a), schematico completo (b) Ad ogni filo disegnato è possibile assegnare un nome. E’ bene dare un nome significativo ai nodi principali, in modo che sia poi semplice visualizzare ed interpretare le forme d’onda generate dalla simulazione (che saranno etichettate col nome del file di cui si vuole misurare la tensione). Per assegnare un nome ad un wire: Menu Pulsante barra strumenti Create -> Wire Name Lanciando questo comando si apre la finestra in Figura 4: Figura 4: Assegnazione del nome ad un wire Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Per assegnare un nome è sufficiente scrivere il nome nell’apposita casella e cliccare Hide; a questo punto basterà cliccare sul filo a cui si vuole assegnare il nome perchè il comando venga eseguito. Una volta assegnato il nome desiderato premere il tasto ESC. Per i nodi di massa e alimentazione invece dell’assegnazione classica del nome possono essere utilizzati dei componenti presenti nella libreria AnalogLib che assegnano in automatico i nomi corretti. Ad esempio per realizzare il collegamento a massa del circuito realizzato sinora, è possibile istanziare il componente gnd della libreria AnalogLib per arrivare alla situazione mostrata in Figura 5. Analogamente se avessimo voluto collegare il terminale di alimentazione avremmo potuto utilizzare il componente di libreria vdd. Questi componenti non fanno altro che assegnare al terminale a cui sono connessi il nome gnd! per la massa e il nome vdd! per l’alimentazione. Oltre al nome, per tutti i nodi che risultino essere di ingresso/uscita, è necessario creare una porta che specifichi la direzione del segnale su quel pin. Gli ingressi saranno di tipo Input, le uscite Output, le alimentazioni sono bidirezionali (Inout). Quando si definisce una direzione per il nome del filo (Input, Output, Inout) comparirà il simbolo del terminale (una piccola freccia con l’orientazione determinata dalla direzione del terminale), mentre se il nodo è interno allora comparirà solo il nome. Per creare un pin: Menu Pulsante barra strumenti Create -> Pin definire il nome del pin e la direzione, cliccare Hide e piazzare il pin nello schematico come mostrato in Figura 5.b. Per il nodo di massa non è necessario definire un pin di ingresso/uscita in quanto il componente di gnd istanziato assegna al nodo di massa un nome globale (gnd!) che può essere quindi visto ad ogni livello della gerarchia. In generale tutti i nodi che terminano con un punto esclamativo (!) sono nodi globali. Figura 5: (a) Piazzamento della massa e degli altri terminali (b) e creazione dei pin Il collegamento fra i terminali può avvenire disegnando tutto il wire oppure, per non complicare troppo il disegno, usando la connessione per nome: due wire risultano connessi fra loro se hanno lo stesso nome. 2.4 Editing Il menu Edit fornisce la possibilità di modificare lo schematico, tramite comandi di copia (Edit -> Copy), di cancellazione (Edit -> Delete) e di spostamento. In particolare, esistono due tipologie di spostamento: il move e lo stretch: Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Menu Pulsante barra strumenti Edit -> Move Edit -> Stretch Il comando move sposta un componente staccando tutti gli eventuali collegamenti e connessioni di fili, mentre il comando stretch trascina il componente lasciando connessi i fili. 2.5 Symbol Per poter utilizzare lo schematico che abbiamo creato come blocco di libreria da poter istanziare successivamente in altri schematici è necessario associare allo schematico un simbolo. Per fare questo: Menu Create -> Cellview -> From Cellview Pulsante barra strumenti si aprirà una nuova finestra, come mostrato in Figura 6.a. (a) Figura 6 Creazione del simbolo (b) da questa finestra è possibile creare una nuova vista a partire da una già esistente. Nel nostro caso la vista di partenza sarà lo schematico che abbiamo creato e la vista di destinazione sarà il simbolo. Premendo OK comparirà la finestra mostrata in Figura 6.b. Da questa finestra è possibile selezionare la posizione dei pin presenti nello schematico, nell’esempio i pin Iin e Iout verranno posizionati nella parte superiore del simbolo. Una volta premuto OK il simbolo sarà creato e verrà visualizzato sullo schermo. Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro 3 Testbench Per simulare il circuito è buona norma creare una nuova cella di testbanch all’interno della quale verrano istanziati la cella da testare e i generatori di segnale. Quindi come fatto in precedenza, dal Library Manager si creerà all’interno della nostra Liberia una cella di nome tb_current_mirror. All’interno della cella creeremo una istanza del simbolo dello specchio di corrente precedentemente creato e poi aggiungeremo i generatori che si trovano tutti nella libreria AnalogLib. Nel nostro caso ci vorrà sicuramente un generatore di tensione che fornisce l’alimentazione in continua (1 V nel processo in esame), un generatore di corrente che generi la corrente di ingresso allo specchio e un altro generatore di tensione costante che generi una opportuna tensione sul nodo di uscita della corrente Iout. A seconda del tipo di analisi quest’ultimo generatore potrà avere un valore fisso o un valore parametrico ad esempio se volessimo andare a visualizzare come varia la corrente di uscita al variare della tensione sul nodo di uscita. Per piazzare i generatori si procede come per un normale componente ricordandosi che si trovano tutti nella libreria AnalogLib e che i generatori di tensione costanti sono chiamati vdc e quelli di corrente costante idc. I generatori vanno piazzati nello schematico, collegati alla massa da un lato ed all’opportuno terminale dall’altro. In Figura 7 è mostrata lo schematico con i generatori, da notare che è stato modificato il nome di ciascun generatore per dargli un valore significativo (VDD, VOUT e IIN) e la connessione è stata fatta per nome anzi che tracciando tutto il filo (ossia si è dato il nome Iin al pezzo di filo connesso al terminale del generatore Iin ed il nome Iout al pezzo di filo connesso al terminale positivo del generatore VOUT). Da notare infine che poichè il nodo di massa all’interno dello specchio di corrente precedentemente creato è stato definito come nodo globale non è necessario effettuare un collegamento fisico in quanto il collegamento avviene per nome a tutti i livelli della gerarchia utilizzando la label gnd! o equivalentemente il componente gnd della libreria AnalogLib. Figura 7: Piazzamento dei generatori Per un generatore costante sia esso di tensione o di corrente è sufficiente specificare solamente il valore della tensione desiderata. Per modificare il valore dei generatori inseriti una volta selezionati si potrà cliccare col tasto destro e scegliere la voce properties. Si aprirà un menù come quello mostrato in Figura 8 dove il parametro DC Voltage rappresenta appunto il valore di tensione continua erogato dal generatore. Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Figura 8 Modifica parametri generatore continua Per creare un generatore il cui valore possa essere poi variato parametricamente in fase di simulazione è possibile invece di indicare un valore numerico, assegnare una variabile per il parametro DC Voltage. Ad esempio per il generatore di tensione VOUT è possibile definire il parametro DC Voltage con il valore testuale “vout” il cui valore sarà definito in fase di simulazione. Tuttavia inizialmente i generatori verranno settati con i seguenti parametri VDD -> 1 V VOUT -> 0.5 V IIN -> 1 μA Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro 4 Simulazione Una volta completato lo schematico del testbench è possibile procedere con la simulazione del circuito. Per fare questo usare il comando: Menu Launch -> ADE L Pulsante barra strumenti e si aprirà la finestra mostrata in Figura 9 dalla quale è possibile settare il tipo di analisi da effettuare, i segnali da visualizzare e i parametri da far variare. Figura 9 Interfaccia grafica per l’impostazione della simulazione 4.1 Definizione del tipo di analisi Definito il circuito e gli stimoli (i generatori) non resta che definire le analisi da compiere per stimare i parametri di interesse. Nella nostra prima simulazione calcoleremo il punto di lavoro del circuito quando la tensione di uscita vout è pari a Vdd/2 cioè nel nostro caso 0.5 V. Un’analisi di questo tipo richiede un’analisi in continua (dc). Per definire il tipo di analisi richiesto: Menu Analyses -> Choose Pulsante barra strumenti Si aprirà una finestra che consente di scegliere uno dei possibili tipi di analisi (continua, transistorio, alternata e così via). La finestra di scelta è mostrata in Figura 10, bisogna selezionare la voce che corrisponde all’analisi desiderata (nel nostra caso, analisi in continua, dc). Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Figura 10: Setup di una simulazione dc (continua) Per effettuare una analisi in continua è sufficiente scegliere la voce dc e spuntare la casella Save DC Operating Point e premere OK. A questo punto la simulazione è pronta per essere eseguita mediante il comando: Menu Simulation -> Netlist and Run Pulsante barra strumenti Una volta terminata, la simulazione di punto di lavoro non produce alcun output di tipo grafico. Per visualizzare i risultati è necessario selezionare il comando: Menu Pulsante barra strumenti Results -> Print -> DC Operating Point A questo punto cliccando su qualsiasi componente nello schematico è possibile visuallizare il suo punto di lavoro. Se ad esempio dopo aver eseguito il comando precedente si clicca sul generatore di tensione VDD si otterrà il suo punto di lavoro, cioè la tensione presente ai suoi capi, la corrente che sta erogando. Poiché però i transistor dello specchio di corrente sono racchiusi gerarchicamente all’interno del simbolo nel testbench, per poter visualizzare il loro punto di lavoro è necessario dapprima scendere nella gerarchia. In generale per qualsiasi blocco istanziato in uno schematico mediante il simbolo è possibile vedere la sua implementazione mediante il comando Menu Edit -> Hierarchy -> Descend Edit Pulsante barra strumenti cliccando poi successivamente sul simbolo del componente di cui si vuole visualizzare il contenuto. A questo punto una finestra permetterà di scegliere la vista all’interno del quale si vuole discendere,nel nostro caso siamo interessati a visualizzare lo schematico e quindi dopo aver verifichiamo che la voce view corrisponda a schematic cliccando OK apparirà lo schematico. Per tornare al testbench si potrà usare il comando: Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Menu Edit -> Hierarchy -> Return Pulsante barra strumenti Per vedere il punto di lavoro del transistor M2 dello specchio di corrente sarà dunque necessario dapprima discendere la gerarchia come visto e poi mediante il comando: Menu Results -> Print -> DC Operating Point Pulsante barra strumenti Cliccare sul transistor M2 per ottenere la seguente schermata: Dove sono presenti tutti i parametri più significativi del transistor come ad esempio la tensione di soglia (Vth) la gm la Rout e molti altri. Tali valori possono essere anche utilizzati per ricavare alcuni parametri dei transistor utili in fase di progetto. Si proceda ad esempio con la stima dei parametri mostrati nella tabella successiva per il transistor M2 dello specchio di corrente (per farlo si ricordino le equazioni che governano il funzionamento di un transistor MOS). PARAMETRO μnCox Vthn λn Simulazione di circuiti integrati – Uso di VIrtuoso VALORE CI 2015/16 - Massimo Barbaro 4.2 Analisi in continua con variazione parametrica di un valore Per effettuare analisi parametriche è possibile definire il valore di uno o più dello schematico parametri (ad esempio la tensione di un generatore o la lunghezza di un transistor) come etichette testuali il cui valore sarà poi definito di volta in volta prima di lanciare la simulazione. Ad esempio se volessimo visualizzare come varia la corrente in uscita dallo specchio di corrente al variare della tensione di uscita potremmo definire il valore di tensione del generatore VOUT con l’etichetta testuale “vout”. Una volta fatto questo potremmo eseguire il comando per effettuare una simulazione come nel caso precedente: Menu Launch -> ADE L Pulsante barra strumenti A questo punto per importare nella simulazione tutti i parametri definiti nello schematico è sufficiente cliccare col tasto destro nell’area chiamata Design Variables e selezionare la voce Copy Frome Cellview in modo tale che tutti i parametri definiti nello schematico siano importati nella simulaione e si possa procedere alla definizione del loro valore. È necessario definire SEMPRE un valore per ogni parametro definito. A questo punto se volessimo effettuare un’analisi in continua per diversi valori del parametro “vout” dovremmo nuovamente definire un’analisi in continua come prima ma questa volta dovremmo anche spuntare la voce Design Variables come mostrato in Figura 11. Figura 11 Analisi in DC con variazione parametrica Si dovrà poi procedere a compilare i campi corrispondenti: nel campo Variable Name bisogna indicare il nome dato alla variabile, nel nostro caso vout, nel campo Start il valore iniziale del parametro, nel nostro caso 0, e nel campo Stop il valore finale, nel nostro caso 1. Una volta terminato premere OK. Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro 4.3 Scelta della forme d’onda da visualizzare Non appena cliccato su OK si ritorna alla schermata principale da cui si può procedere alla definizione delle forme d’onda da visualizzare attraverso il comando: Menu Outputs -> Setup Pulsante barra strumenti A questo punto compare la finestra di scelta delle forme d’onda da visualizzare, mostrata in Error! Reference source not found.Cliccando sul pulsante From Design sarà possibile selezionare direttamente dallo schematico le tensioni e le correnti che si vogliono visualizzare. Figura 12 Schermata di scelta delle forme d’onda da visualizzare Cliccando sul filo la corrispondente tensione sarà aggiunta ai segnali da visualizzare (Figura 12.a), cliccando invece sul terminale di un componente (Figura 12.b) si andrà a visualizzare la corrente che entra in quel nodo. (a) (b) Figura 13 Selezione forme d’onda da visualizzare. (a) selezione di una tensione e (b) di una corrente Nel nostro caso selezioniamo per la visualizzazione le correnti di ingresso e uscita dallo specchio (Iin e Iout) e poi clicchiamo ESC per terminare la selezione dei segnali da visualizzare. A questo punto la simulazione è impostata completamente e può essere lanciata mediante il comando: Menu Pulsante barra strumenti Simulation -> Netlist and Run Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro Una volta terminata la simulazione comparirà una nuova finestra contente i grafici delle forme d’onda dei segnali scelti per la visualizzazione come mostrato in Figura 14. Figura 14 Plot of the input/output current in a current mirror Per esercizio si potrebbe vedere come varia la corrente di uscita al variare della lunghezza di canale (fissando questa volta la tensione di uscita a 0.5 V) definendo la lunghezza dei transistor dello specchio in maniera param Simulazione di circuiti integrati – Uso di VIrtuoso CI 2015/16 - Massimo Barbaro