Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-1 7. I linguaggi descrittivi HDL. Introduzione. I linguaggi descrittivi HDL (Hardware Description Language) nascono negli anni 80 con lo scopo di documentare progetti hardware complessi. L esigenza era essenzialmente quella di utilizzare una metodologia standard per descrivere il comportamento dei sistemi elettronici. Questi linguaggi sono molto simili ai linguaggi software, ma contemplano costrutti atti alla definizione di architetture e di funzionalità tipiche dell hardware, come la sincronizzazione ed il parallelismo tra processi. Se inizialmente questi linguaggi sono sfruttati al solo scopo di documentazione, ben presto essi vengono utilizzati anche per la simulazione al fine di verificare il corretto comportamento del sistema. Ciò naturalmente è molto importante per rendersi conto della correttezza dell algoritmo scelto per la risoluzione di un particolare problema. A questo livello nel programma che descrive il funzionamento possono essere introdotti costrutti sintattici che prescindono dalla vera e propria implementazione hardware del sistema. L aumento degli anni della complessità dei sistemi, permessa anche dal progredire incessante della tecnologia, ha reso sempre più stringente l esigenza di automatizzare al massimo le procedure di sintesi. Tecniche ed algoritmi sempre più sofisticati hanno permesso di sviluppare CAD che avessero capacità di tradurre descrizioni ad alto livello di sistemi elettronici in architetture che facessero riferimento direttamente a blocchi logici di libreria. Naturalmente il tipo di descrizione di sistemi, al fine della loro successiva sintesi, non può più prescindere dall implementazione e la sintassi del linguaggio deve rispettare alcuni vincoli precisi che ne rendano possibile l implementazione, primo tra questi la necessità che il sistema sia sincrono. Questo implica che qualsiasi blocco logico abbia le uscite registrate, ovvero che qualsiasi variazione in uscita sia sincrona con il fronte attivo del clock. Ciò si ottiene appunto attraverso l uso di un flip-flop. La tipologia di descrizione adatta ad essere sintetizzata è la descrizione RTL (Register Transfer Logic). In essa viene specificata l architettura del sistema con la descrizione del flusso di dati attraverso i registri che fungono da unità di memorizzazione delle informazioni. I linguaggi HDL attualmente più utilizzati sono il VHDL (VHSIC, Very High Speed Integrated Circuits HDL) diffuso soprattutto in Europa, la cui sintassi richiama quella del Pascal e soprattutto dell ADA, e il Verilog, più simile al C è attualmente in via di rapida diffusione a causa della sua maggiore semplicità rispetto al VHDL, in confronto molto più prolisso. Utilizzo dei linguaggi HDL. I campi di utilizzo dei linguaggi descrittivi HDL possono essere classificati, secondo la loro finalità, nelle seguenti categorie. 1. Descrizione di sistemi al fine di effettuarne la sintesi. 2. Descrizione di sistemi al fine di descriverne il comportamento. 3. Descrizione strutturale del sistema. 4. Descrizione del testbench.
Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-2 La descrizione al fine della sintesi deve essere una descrizione RTL e deve prevedere solo costrutti sintetizzabili. La descrizione comportamentale di blocchi logici è effettuata prima di prevedere la realizzazione RTL di un blocco da sintetizzare, oppure dopo la sintesi per descrivere il comportamento di un modulo già sintetizzato e mappato su una certa tecnologia. Ciò dà la possibilità di simulare insieme blocchi diversi, alcuni dei quali descritti in RTL ed altri in attraverso la loro funzionalità. Ciò può essere importantissimo quando alcuni dei blocchi hardware sono moduli esterni al sistema da progettare e quindi da sintetizzare, ma fanno parte integrante del sistema globale. Si pensi, ad esempio, di dover progettare un sistema che debba interagire con un microprocessore standard e una memoria. La descrizione strutturale del sistema consiste in un listato che contiene le istanze dei moduli e le loro interconnessioni. Ciò costituisce la netlist del sistema che viene utilizzata soprattutto nell interscambio di dati tra diversi pacchetti software. Esistono linguaggi appositamente studiati solo per questo scopo, come ad esempio l EDIF, ma possono essere utilizzati anche gli i comuni linguaggi HDL. La descrizione del testbench, ovvero del banco di prova, è una descrizione comportamentale degli stimoli esterni del sistema. Questo approccio permette di descrivere i segnali in ingresso e di controllare quelli in uscita per verificare se corrispondono a quello attesi semplificando notevolmente la fase di test. Questa descrizione, come illustrato in Figura 1, costituisce a tutti gli effetti un modulo del sistema. Testbench module Figura 1 Modulo di testbench Partizione del sistema. La partizione di un sistema elettronico è la fase che precede quella vera e propria di descrizione dei singoli moduli a livello RTL e consiste nella sua suddivisione in sottoblocchi. Questa è effettuata direttamente a livello di descrizione HDL dal progettista programmatore oppure dal compilatore che per effettuare particolari ottimizzazioni raggruppa moduli indipendenti o suddivide moduli singoli. Normalmente i criteri che orientano la partizione sono la suddivisione in moduli secondo la funzione espletata, l orientamento del progettista e l ottenimento dei migliori risultati dalla successiva fase di sintesi. Da una attenta analisi si riescono infatti a ottenere oggetti sintetizzati ottimali, più semplici ed in tempi più brevi.
Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-3 Si possono identificare alcune regole alla base dei criteri di partizione. L idea è sempre quella di rendere indipendenti parti del circuito per le quali esistono algoritmi di ottimizzazione specialistici. Alcune di queste regole inoltre sono del tutto generali e valgono non solo per l obiettivo di ottenere una sintesi ottimale, ma sono buone norme anche per la progettazione diretta di qualsiasi circuito elettronico. 1. Non introdurre gerarchie nei cammini combinatori. Questo implica il non portare su moduli differenti blocchi combinatori che potrebbero essere inglobati su un modulo singolo. Non possiamo infatti prevedere a priori quanto possa essere spinta l ottimizzazione sul blocco combinatorio intero. 2. Registrare tutte le uscite di ogni blocco. Porre ovvero un flip-flop comandato dal clock globale del sistema su tutte le uscite dei moduli. 3. Evitare di porre glue-logic (tipo poche porte di collegamento) tra blocchi. 4. Separare i progetti con differenti obiettivi di ottimizzazione. Ciò significa evitare di porre in un unico modulo due sottoblocchi per i quali sarebbero auspicabili criteri di ottimizzazione differenti. Ad esempio un blocco, molto critico, potrebbe essere ottimizzato per velocità, ed un secondo per area. 5. Isolare le macchine a stati. Esistono algoritmi molto efficienti per ottimizzare questo tipo di circuiti di controllo, ma questi funzionano solo se non sono presenti altri elementi combinatori e/o sequenziali che non ne fanno parte logicamente. 6. Mantenere una adeguata dimensione dei blocchi. Evitare di realizzare moduli che generano circuiti di dimensioni molto differenti tra loro. Ciò renderebbe difficile il floorplan e lunga la sintesi di blocchi troppo grandi. 7. Separare nel sistema la core-logic, i pads, i clock, e la logica JTAG. Ognuno di questi componenti ha sistemi specifici di sintesi e di ottimizzazione. Descrizione RTL di sistemi elettronici. La descrizione RTL è, come detto, la modalità tipica usata per la sintesi. Un modulo RTL sarà costituito da parti combinatorie le cui uscite sono registrate e i cui ingressi provengono dall esterno del modulo o dall uscita di altri registri interni al modulo stesso, come mostrato dall esempio di Figura 2. Figura 2 Schematico RTL di un sistema
Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-4 Tutti registri del modulo sono flip-flop, ovvero sono comandati su un fronte del clock (lo stesso per tutti i moduli del sistema) e sono ovviamente sincroni, ovvero il fronte attivo del clock comanda contemporaneamente tutti i flip-flop. Se dalla fase di sintesi risulterà che alcuni registri sono stati tradotti in hardware come latch, ovvero comandati sul livello anziché sul fronte, ciò significherà un errore in fase di descrizione del sistema. Una struttura così descritta agevola enormemente la fase di sintesi e, soprattutto, di ottimizzazione. Una volta stabilito infatti il tempo di clock, le procedure di ottimizzazione cercheranno di tradurre in hardware ogni blocco combinatorio in modo che il tempo di ritardo sul cammino critico aggiunto ai tempi di ritardo propri di setup e di hold dei flip-flop, sia minore del tempo di clock stesso. Ogni blocco combinatorio registrato può essere descritto in due sezioni separando la parte combinatoria da quella sequenziale come illustrato dallo schema in Figura 3. A B C clock Figura 3 Separazione della parte combinatoria e sequenziale La prima specifica le uscite B del solo blocco combinatorio al variare degli ingressi A, mentre la seconda sincronizza le uscite C del registro, eventualmente a più bit, i cui ingressi B provengono dalle uscite della parte combinatoria. Il Verilog. Il Verilog è un linguaggio di descrizione hardware che permette la descrizione di un sistema digitale in un ampio spettro di livelli di astrazione, dal comportamentale allo strutturale. Esso include inoltre costrutti gerarchici che permettono al progettista di controllare facilmente la complessità di un sistema. Il Verilog è stato originariamente sviluppato alla fine del 1983 come prodotto proprietario della Cadence per la simulazione e verifica, ma successivamente sono stati sviluppati numerosi strumenti per la simulazione dei guasti, l analisi temporale e la sintesi. Il linguaggio è attualmente standardizzato dallo standard IEEE 1364-1995 ed è disponibile per l utilizzo con qualsiasi CAD elettronico. L organizzazione Open Verilog International (http://www.ovi.org) ne promuove la diffusione. Per quanto riguarda la sintassi del linguaggio si rimanda ad un testo specifico.
Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-5 Calcolo delle capacità e dei tempi di ritardo. Il calcolo delle capacità è necessario al calcolo dei tempi di ritardo. La capacità di uscita può essere vista come la somma delle capacità di ingresso delle porte alle quali quella in questione è collegata e di quella relativa alle linee di connessione in uscita. In Synopsys di default la prima viene posta a zero, mentre la seconda è calcolata attraverso il Wireload Model. Si può specificare il carico in unità di carico, attraverso: un numero, il nome di una cella, un multiplo di una cella. Il compilatore usa il carico di fanout per regolare il fanout massimo. Se il fanout esterno più quello interno eccede il fanout massimo, verranno aggiunti dei buffer opportuni. Il compilatore ottimizza il progetto basandosi sulle condizioni operative del processo, della tensione e della temperatura come illustrato in Figura 4. Delay Delay Delay Processo Tensione Temperatura Figura 4 Variazioni del tempo di ritardo I ritardi relativi alle celle e alle linee verranno opportunamente scalati secondo le condizioni operative. Le librerie sono normalmente caratterizzate usando le condizioni operative nominali. L ottimizzatore usa i modelli di Wire Load per stimare la capacità, la resistenza e l area delle linee prima del floorplanning o del layout. Il modello di Wire Load è basato sulla lunghezza media statistica di una linea per un dato fanout per una certa area. Attraverso una opzione si può specificare quale Wire Load Model usare per linee che attraversano i confini gerarchici. I tre modelli possibili sono: top, enclosed e segmented. Il modello top ignora i livelli più bassi di wireloads. Il modello enclosed usa la migliore approssimazione per il wireload. Il modello segmented usa alcuni wireloads. Alcune variabili permettono di specificare: il tempo di transizione maggiore sulle porte, il massimo fanout sulle porte di ingresso, la massima capacità sulle porte. Le regole di progetto contengono i vincoli sulle linee, ma sono associate con le uscite delle celle per una certa libreria tecnologica. Molte librerie specificano le regole di progetto di default. Tali regole non devono essere assolutamente violate, poiché questo interferirebbe sui vincoli legati alle ottimizzazioni. Un progettista può pensare di eseguire il progetto con regole più restrittive di quelle dettate dalle regole di progetto, ma non meno restrittive. Le regole di progetto non sono applicate alle porte. Queste ereditano le regole delle celle che pilotano le uscite o che ricevono i segnali di ingresso.
Marcello Salmeri - Progettazione Automatica di Circuiti e Sistemi Elettronici Capitolo 7-6 Il Wire Load Model descrive il modello per il calcolo della lunghezza e della capacità delle linee (vedi Figura 5). Lunghezza Fanout Figura 5 Calcolo delle capacità delle linee Esempio: wire_load ( 10x10 ) { resistance : 0.5 capacitance : 1.1 area : 0.05 slope : 0.5 fanout_length (1, 2.6) fanout_length (3, 2.9) fanout_length (5, 3.2) fanout_length (7, 3.9) fanout_length (9, 4.1) fanout_length (10, 4.7) } L ottimizzatore calcola la lunghezza attraverso l interpolazione tra due valori o lo slope. Attraverso il coefficiente di capacità viene dunque calcolata la capacità relativa e il coefficiente di area viene calcolata l area della linea. I ritardi delle celle sono calcolati usando uno dei seguenti quattro diversi modelli fornito dalla fonderia: 1. Modello lineare. 2. Modello lineare a due tratti. 3. Modello lineare a più tratti. 4. Modello non lineare.