|
Appunti tecniche |
|
Visite: 1091 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:ConversioneGeneralità. Col termine conversione si indica la trasformazione di alcuni parametri Relazione di elettronicaRELAZIONE DI ELETTRONICA PREMESSE TEORICHE · Macchine elettriche rotantiMACCHINE ELETTRICHE ROTANTI Le macchine elettriche rotanti si suddividono |
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).
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
Transistor
Layout
(netlist) (netlist)
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 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 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 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 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.
Appunti su: |
|
Appunti Gestione | |
Tesine costruzione | |
Lezioni Ingegneria tecnico | |