CAPITOLO 2
Questo capitolo contiene una breve storia sull’evoluzione nella
progettazione dei circuiti integrati, seguita da una approfondita analisi dei
mezzi che vengono usati attualmente a tale scopo, dedicando particolare
attenzione agli strumenti software utilizzati.
L’uso dei vari programmi di composizione di circuiti e di simulazione è
caldamente consigliato dalla fonderia ES2, la quale per garantire il corretto
funzionamento dell’integrato una volta fabbricato, pretende siano state fatte
tutte le simulazioni software possibili a priori. Alcuni passi della metodologia
da seguire sono obbligatori, altri sono opzionali anche se caldamente
raccomandati: io ho cercato di seguire tutti i passi descritti nell’ES2 Cadence
Design Kit [7] che integra le librerie della fonderia ES2 nell’ambiente di
lavoro di Cadence DFWII.
2.1 Evoluzione nella progettazione dei circuiti integrati
La progettazione e la realizzazione di circuiti integrati è stata fino a
pochi anni fa un’esclusiva degli Stati Uniti e del Giappone. Per questo motivo
da alcuni anni la Comunità Economica Europea ha deciso di lanciare un
programma di ricerca chiamato ESPRIT (European Strategic Program for
Research in Information Technology) con lo scopo di promuovere iniziative di
ricerca nel mondo delle industrie e delle università. Questo programma è nato
proprio per rendere tecnologicamente indipendente l’Europa dagli altri Paesi
per quanto riguarda la progettazione di circuiti integrati. In particolare
nell’ambito di ESPRIT è
nata un’organizzazione chiamata prima
EUROCHIP e ora EUROPRACTICE a cui fanno riferimento diverse
università e industrie europee. Il fine di Europractice è di favorire
l’interazione ed uno scambio produttivo fra le università e le imprese private
nel seguente modo: vengono forniti alle università a costi molto ridotti tutti i
prodotti software necessari a sviluppare progetti completi purché le finalità
siano di tipo didattico (in questo contesto anche la produzione dei prototipi ha
un costo notevolmente ridotto). In questo modo le industrie possono poi
acquisire personale specializzato nel settore senza dovere compiere questa
formazione personalmente. Si tenta così di colmare il vuoto di competenze nel
settore sia a livello industriale sia accademico.
La progettazione di circuiti integrati è in continua evoluzione ed ha
subito radicali cambiamenti negli ultimi 30 anni. Sin dalle prime esperienze di
27
integrazione di più transistor su silicio, cioè dal 1960, la progettazione di
circuiti integrati era riservata esclusivamente ad ingegneri elettronici molto
esperti e a specialisti dei semiconduttori. L’unico tipo di progettazione
possibile era di tipo full-custom secondo cui tutti i dettagli implementativi del
circuito sono sotto il controllo del progettista il quale deve dimensionare i
transistor uno a uno e comporre layout geometrici che vengono poi simulati
per mezzo di un simulatore analogico. Per questi motivi lo sviluppo di circuiti
complessi, contenenti decine o centinaia di migliaia di transistor, richiedeva
tempi molto lunghi e considerevoli sforzi.
70 %
60 %
50 %
40 %
30 %
20 %
10 %
1982
Full-custom
1990
Semi-custom
1995
FPGA
Fig. 2.1 : Rapporto di produzione fra progettazione full-custom e semicustom.
Nei primi anni Ottanta la progettazione full-custom cominciò a cedere il
passo ad un tipo di progettazione più ad alto livello, la progettazione semicustom In questa nuova modalità di lavoro il progettista tratta con celle
ottimizzate fornite direttamente dalle fonderie insieme con i loro parametri di
lavoro, tipicamente porte logiche (ad esempio NAND, NOR, XOR), memorie
RAM, dispositivi di I/O (pad), ecc., e le compone in schemi circuitali dove
sono evidenziati i collegamenti (schematic se la visualizzazione è di tipo
grafico o netlist se è di tipo descrittivo). Queste rappresentazioni sono poi
simulate via software tenendo conto dei tempi di ritardo di ogni singola porta e
poi sono trasformate in layout geometrici con l’aiuto di efficienti programmi
28
(placement & routing). In questo modo il progettista non tratta mai con
singoli transistor, né è tenuto a sapere la struttura interna delle celle usate.
Per tutti questi motivi negli ultimi anni la progettazione semi-custom di
circuiti digitali è diventata dominante rispetto a quella full-custom come
visibile in fig. 2.1. Nella stessa figura è visualizzata anche la produzione di
FPGA (Field Programmable Gate Array), circuiti standard programmabili
dall’utente in base all’applicazione per cui verranno utilizzati. Come
metodologia di progetto gli FPGA possono essere ricondotti alla progettazione
semi-custom. La progettazione full-custom viene praticata tuttora nel campo
analogico e, in campo digitale, da chi non si accontenta delle prestazioni delle
standard cell, cioè delle porte logiche standard fornite dalla fonderia, ma
preferisce ottimizzare ogni minimo dettaglio per incrementare al massimo la
velocità di funzionamento del circuito elettronico.
in
p o lis ilic io
VDD
in
out
m e ta llo d iffu sio n e p
d iffu s io n e n
(a )
in
(b )
out
o u t < = n o t(in )
(d )
(c )
Fig. 2.2 : NOT CMOS rappresentato dal punto di vista del layout (a),
schematic (b), simbolo (c) e descrizione VHDL (d).
Un ulteriore salto metodologico nella progettazione di circuiti elettronici
digitali è avvenuta con l’introduzione dei i linguaggi descrittivi ad alto livello
29
HDL (Hardware Description Language). Gli HDL sono linguaggi di
programmazione ad alto livello che includono strutture dati e istruzioni tali da
poter descrivere il funzionamento dell’hardware. Essi supportano la
descrizione di un circuito su vari livelli di astrazione, partendo da una prima
descrizione del comportamento voluto e introducendo via via strutture
aggiuntive in un processo di raffinamento gerarchico finché non si raggiunge
il livello delle porte logiche. In ognuno di questi livelli gerarchici il codice
HDL non rappresenta solo una descrizione ma può essere simulata per
verificarne la funzionalità logica e sintetizzata cioè convertita in un circuito
vero e proprio costituito da varie celle standard scelte dalle librerie di una
fonderia. I più famosi linguaggi HDL sono il Verilog e il VHSIC HDL, più
comunemente noto come VHDL. Il Verilog è usato soprattutto in America
mentre il linguaggio più diffuso in Europa è il VHDL, il cui standard è stato
fissato nel 1987 ed è chiamato IEEE-1076. La fig. 2.2 mette a confronto il
modo di visualizzare una semplice porta logica NOT dal punto di vista fullcustom, cioè a livello di layout, semi-custom a livello di schema elettrico e di
simbolo dotato di parametri di funzionamento e al livello più generale di
descrizione VHDL.
Grazie al linguaggio VHDL e all’uso dei programmi della Cadence
comprati attraverso Europractice i tempi di la progettazione di circuiti integrati
sono stati ridotti drasticamente: ad esempio la progettazione del processore
fuzzy a 4 ingressi del ’94 è stata stimata in 1.5 anni uomo mentre il lavoro
relativo al processore HEPE96 ha richiesto in lavoro di 0.5 anni uomo. Il mio
lavoro relativo al processore HEPE97 è stato ancora più breve grazie ai
vantaggi offerti dal VHDL. Contemporaneamente sono stati abbassati anche i
tempi di attesa dal momento in cui un progetto viene inviato alla fonderia fino
alla sua riconsegna. Ora infatti questo tempo si aggira sui 2 mesi di attesa e si
prevede in un futuro non molto lontano la restituzione del circuito integrato in
tempi inferiori alle 2 settimane.
2.2 Flusso di progetto
Il diagramma di flusso di figura 2.3 evidenzia tutti i passi necessari
nell’ordine in cui devono essere eseguiti, con le necessarie iterazioni che
servono a migliorare e ad ottimizzare il progetto. I passi principali possono
essere così elencati :
(1) Generazione dello schema elettrico del circuito (schematic)
(1.1) Stesura del codice VHDL.
(1.2) Generazione di megacelle (opzionale).
30
(1.3) Simulazione funzionale del codice VHDL(Leapfrog).
(1.4) Generazione dello schema elettrico attraverso la sintesi del codice
VHDL (Synergy).
(1.5) Inclusione dei pad di I/O (dispositivi per l’input/output) e di
alimentazione.
(2) Simulazione
(2.1) Simulazione circuitale (Verilog XL).
(2.2) Simulazione temporale (Veritime).
(2.3) Simulazione dei difetti di fabbricazione (Verifault XL).
(3) Generazione del layout
(3.1) Posizionamento delle megacelle.
(3.2) Posizionamento delle porte logiche standard (standard cell).
(3.3) Creazione dei canali di collegamento.
(3.4) Routing globale (attribuzione delle connessioni logiche ai canali
fisici)
(3.5) Routing dettagliato (creazione delle connessioni fisiche).
(3.6) Estrazione delle capacità parassite post-layout.
(3.7) Simulazione post-layout tenendo conto delle capacità parassite
dovute alle connessioni fisiche.
(4) Verifica del progetto
(4.1) DRC (Design Rule Check) : verifica che i parametri geometrici
del circuito siano rispettati.
(4.2) ERC (Electrical Rule Check) : verifica che i parametri elettrici
del circuito siano rispettati.
(4.3) LVS (Layout Versus Schematic) : verifica che le strutture dello
schematic e del layout coincidano.
(5) Sottomissione del progetto e fabbricazione
Una volta finito il progetto viene inviato alla fonderia ES2 per un
controllo e per la fabbricazione finale.
Nei seguenti paragrafi verranno spiegati in dettaglio tutti i passi qui
menzionati, sottolineando con particolare attenzione come funzionano
internamente i vari programmi di sintesi e di simulazione e come riescono a
fornire un circuito finale le cui probabilità di funzionare sono molto alte.
31
no
Fig. 2.3 : Diagramma di flusso nella progettazione di circuiti integrati.
32
2.3 Il linguaggio VHDL [8]
Il linguaggio VHDL è un linguaggio descrittivo dell’hardware digitale
che permette di descrivere le funzionalità dei circuiti elettronici con un livello
di astrazione più alto del livello delle singole porte logiche. Il VHDL sta
diventando rapidamente il mezzo più diffuso sia in Europa sia in America per
la progettazione di circuiti integrati digitali. Le aziende americane che
progettano e sviluppano ambienti integrati di CAD elettronico si stanno
standardizzando sul VHDL come input e output dei lori prodotti. Fra questi si
trovano in commercio programmi di simulazione e di sintesi, programmi che
generano codice VHDL a partire dallo schema elettrico e programmi che
convertono il VHDL in altri linguaggi descrittivi dell'hardware e viceversa.
La descrizione VHDL di un circuito può avere diversi livelli di
astrazione : il livello più alto (quello più lontano dall’hardware) contiene una
sommaria descrizione sul comportamento dell’intera rete, un livello intermedio
descrive la suddivisione del circuito nei vari sottoblocchi ed il funzionamento
di ciascuno di questi mentre il livello di astrazione più basso, quello più vicino
all’hardware, è la descrizione del circuito a livello delle porte logiche. Il
grande vantaggio di questo approccio risiede nel fatto che ogni descrizione
VHDL a qualsiasi livello può essere simulata funzionalmente e può essere
eventualmente convertita in uno schema elettrico tramite sintesi, in modo che
il funzionamento del circuito può essere tenuto sotto stretto controllo ad ogni
livello di astrazione.
Quando si comincia la progettazione di un circuito integrato conviene
descrivere con il linguaggio VHDL il livello di astrazione più alto definendo
ingressi e uscite ed il comportamento interno a grandi linee, poi conviene fare
uno schema a blocchi del circuito e una descrizione VHDL per ognuno di
questi blocchi. La descrizione VHDL del livello più alto conterrà al suo
interno tutti i sottoblocchi collegati fra loro tramite segnali opportunamente
temporizzati.
Un altro grande vantaggio del linguaggio VHDL sta nel fatto che il
codice può essere mappato in uno schema circuitale vero e proprio usando le
porte logiche di una qualsiasi libreria tecnologica. Quando un circuito viene
costruito manualmente con un CAD elettronico qualsiasi come EDGE e sorge
la necessità di riprogettarlo interamente con una libreria tecnologica diversa
tutto il progetto deve essere ricominciato da zero, in quanto i parametri di
funzionamento delle celle variano da una fonderia all’altra. Invece il codice
VHDL che sta alla base di un progetto è assolutamente indipendente dalla
libreria usata e rimane tale e quale qualsiasi sia la piattaforma tecnologica sulla
quale verrà poi implementato. Questa caratteristica del VHDL risulta molto
33
utile in quanto dover riprogettare un intero circuito con una libreria diversa
può capitare più spesso di quanto non si creda : ad esempio il chip da me
progettato è stato implementato con la libreria tecnologica ES2 0.7 µm CMOS
Library Design Kit, la libreria più moderna che la ES2 fornisce tramite
Europractice. Se in un futuro prossimo si volesse riprogettare il processore
usando una tecnologia più avanzata per incrementarne ulteriormente le
prestazioni, ad esempio a 0.5 µm, oppure si volesse passare ad una libreria
tecnologica di un’altra fonderia non sarebbe necessario ripartire dal principio.
In questo modo una nuova versione del chip potrebbe essere realizzata
riducendo drasticamente il tempo e gli sforzi occorsi la prima volta.
Senza entrare nel merito di una approfondita descrizione della sintassi e
delle istruzioni del linguaggio VHDL per la quale si rimanda al VHDL
Language Reference Manual i paragrafi seguenti contengono una descrizione
della terminologia corrente usata in VHDL e una spiegazione di come il
VHDL riesce a tenere conto della natura intrinsecamente sequenziale /
parallela dell’hardware da descrivere.
2.3.1 Terminologia VHDL
I termini elencati di seguito sono correntemente usati in VHDL e
verranno utilizzati nei capitoli successivi nella spiegazione del codice sorgente
dei blocchi del processore. I commenti relativi alle linee di codice VHDL sono
riportate in corsivo.
Entità : costituisce l’interfaccia fra il circuito in esame ed il mondo esterno.
Essa specifica il numero e il tipo delle porte di ingresso e di uscita senza
contenere alcun dettaglio sull’architettura interna del circuito.
In VHDL l’entità corrisponde al simbolo nelle tradizionali metodologie
di progetto dei CAD elettronici. Negli schemi elettronici tradizionali solo
i simboli delle porte logiche semplici come NOT, NAND, XOR, ecc.,
hanno una rappresentazione grafica dedicata, riconosciuta ormai come
standard, mentre tutti i blocchi più complicati sono rappresentati come
rettangoli dotati di ingressi e uscite e di un nome che li identifica. Questa
stessa funzione è svolta dal nome dato all’entità. Ad esempio l’entità di
un semplice multiplexer a 2 ingressi può essere così descritta :
entity multiplexer is
port(a,b,s : in bit ;
out : out bit) ;
end entity
34
Il nome multiplexer è assegnato all’entità che contiene tre bit in ingresso
a, b, s ed un bit in uscita, out.
Architettura : descrive quanto avviene all’interno della “scatola nera” definita
dall’entità.
Continuando quindi il paragone di prima l’architettura è la controparte
VHDL della vista schematic cosi come l’entità lo è del simbolo con una
sostanziale differenza : mentre la vista schematic è ovviamente di tipo
strutturale, cioè a livello di porte logiche e relativi collegamenti,
l’architettura VHDL può essere sia di tipo strutturale sia di tipo
comportamentale (behavioral). Una architettura di tipo strutturale
contiene una lista di tutte le porte usate con i relativi collegamenti,
mentre una architettura di tipo comportamentale si limita a descrivere il
comportamento logico desiderato del circuito con una serie di espressioni
logiche comuni a molti linguaggi di programmazione. Ad esempio
l’architettura behavioral del sopracitato multiplexer è semplicemente :
architecture behavioral of multiplexer is
if(s = ’1’) then
out <= a ;
--assegnazione del valore di a all’uscita out
else
out <= b ;
--assegnazione del valore di b all’uscita out
end if ;
end architecture ;
con una sintassi molto simile alla maggior parte dei linguaggi di
programmazione.
Configurazione : si usa l’istruzione di configurazione quando si vuole porre
all’interno della descrizione VHDL di un circuito un blocco appartenente
alla libreria o un blocco costruito in precedenza. Ad esempio se si vuole
inserire la cella multiplexer descritta precedentemente la sintassi
dell’istruzione di configurazione è la seguente :
mpx : multiplexer port map(a => A, b => B, s => S, out => OUT) ;
Questa istruzione crea una copia della cella multiplexer di nome mpx e ne
associa gli ingressi ai segnali esterni A, B, S e OUT.
35
Attributo : è un insieme di dati utili associato alla descrizione VHDL di un
circuito. Per esempio si possono attribuire ad un circuito caratteristiche
di funzionamento quali la massima corrente d’uscita, la temperatura
massima di lavoro o il carico capacitivo che le uscite dovranno pilotare.
Processo : l’istruzione “process” è l’unità di base di una architettura di tipo
comportamentale VHDL. Essa permette di rendere sequenziale l’ordine
di esecuzione di diverse istruzioni che altrimenti opererebbero in
parallelo.
2.3.2 Esempi di progettazione VHDL
In questo paragrafo verranno descritti i vari modi possibili per descrivere
con il linguaggio VHDL un semplice flip-flop di tipo set-reset. Il simbolo e lo
schema circuitale sono ovviamente noti e sono visualizzati in fig. 2.4 : si tratta
di passare da questo tipo di descrizione schematica alla descrizione VHDL.
Q
(b )
(a )
F ig . 2 : S im b o lo (a ) e sc h e m a tic (b ) d i u n flip -flo p d i tip o se t-re se t.
Fig. 2.4: Simbolo (a) e schematic (b) di un flip-flop di tipo set-reset.
La stesura del codice per l’entità non può essere che la seguente :
entity srff is
port(set, reset :
q, notq :
end srff ;
in bit ;
out bit) ;
-- set e reset sono ingressi a 1 bit
-- q e notq sono uscite a 1 bit
Passando alla descrizione dell’architettura si possono intraprendere tre
strade diverse :
36
1) Architettura strutturale :
Un primo modo di descrivere l’architettura del flip-flop è a livello delle
porte logiche che lo costituiscono : le due porte NAND vengono riferite e
collegate fra loro tramite opportuni segnali :
architecture netlist of srff is
component nand2
-- descrizione del componente usato
port(a, b : in bit ;
-- a e b sono due ingressi a 1 bit
c : out bit) ; --c è una uscita a 1 bit
end component ;
begin
--inizia la descrizione dei collegamenti
U1 : nand2 port map(a => set, b => notq, c => q) ;
U2 : nand2 port map(a => reset, b => q, c => notq) ;
end netlist ;
Vengono generate due copie U1 e U2 della porta logica nand2, un
semplice nand a due ingressi, e i rispettivi ingressi a, b e l’uscita c vengono
collegati come scritto. Una architettura di questo tipo si chiama netlist ed è un
modo esattamente equivalente di descrivere lo schema circuitale elencando
tutte le singole porte ed i rispettivi collegamenti. È ovvio che adottando
questo tipo di architettura il progettista deve già avere chiaro in mente lo
schema elettrico, quindi non sfrutta in pieno le potenzialità del linguaggio
VHDL e dei programmi di sintesi.
2) Architettura comportamentale (behavioral) :
In questo tipo di rappresentazione le uscite sono definite in base ad
operazioni logiche effettuate sugli ingressi :
architecture behavioral of rsff is
begin
q
<= NOT(notq AND set) ; --istruzione di assegnazione al segnale q
notq <= NOT(q AND reset) ; --istruzione di assegnazione al segnale notq
end behavioral ;
Tramite un programma di sintesi come Synergy gli operatori logici AND
e NOT vengono implementati in hardware con due porte NAND. Inoltre
occorre sottolineare che le due istruzioni di assegnazione ai segnali q e notq
sono istruzioni concorrenti, cioè non vengono eseguite in un ordine
prestabilito. Ogni assegnazione viene eseguita appena si ha un cambiamento su
37
uno dei due segnali che si trova alla destra del simbolo di assegnazione “<=”.
Nel caso considerato appena si ha una variazione di notq viene eseguita la
prima istruzione che produce una variazione di q, quest’ultima variazione
produce quindi l’esecuzione della seconda istruzione di assegnazione.
3) Architettura sequenziale :
Il terzo modo di rappresentare l’architettura di un circuito consiste
nell’usare l’istruzione “processo” che permette di rendere le istruzioni di
assegnazione a segnale di tipo sequenziale :
architecture sequential of rsff is
begin
process(set, reset)
--inizio dell’istruzione “processo”
begin
if(set = ’1’ and reset = ’0’) then
--caso 1
q <= ‘0’ ; notq <= ‘1’ ;
elsif(set = ’0’ and reset = ’1’) then
--caso 2
q <= ‘1’ ; notq <= ‘0’ ;
elsif(set = ’1’ and reset = ’1’) then
--caso 3
q <= NOT(notq) ;
notq <= NOT(q) ;
end if ;
end process ;
end sequential ;
L’istruzione “process” viene eseguita quando avviene una variazione su
uno dei due ingressi set e reset e le istruzioni contenute all’interno del
processo sono eseguite in modo sequenziale. In questo modo una volta partito
il processo prima viene assegnato un valore a q e soltanto dopo a notq. Se
invece la riga di codice VHDL fosse stata :
notq <= ‘X’ ; q <= ‘X’ ;
dove per ‘X’ si intende un qualunque valore logico, allora l’ordine di
esecuzione delle istruzioni sarebbe stato l’opposto.
In conclusione sono stati descritti tre tipi di architetture per la medesima
entità e può sorgere la domanda : quale è l’architettura più adatta per
descrivere il flip-flop set-reset ?
L’architettura di tipo netlist è indicata se si ha già chiaro in mente lo
schema circuitale ma può essere conveniente usarla solo per circuiti molto
38
piccoli; inoltre è la meno flessibile in quanto si riferisce a componenti di una
ben precisa libreria, quindi non sfrutta in pieno i vantaggi offerti dal VHDL.
Per quanto riguarda gli altri due tipi di architettura un uso sapiente di
istruzioni sequenziali e parallele all’interno della stessa architettura può
portare ad efficienti modellizzazioni del comportamento dell’hardware.
Gli esempi qui riportati dovrebbero permettere di leggere e capire come è
stato strutturato il codice VHDL di ogni blocco del processore il cui codice è
riportato in versione integrale e completo in Appendice B. Lo stile usato quasi
ovunque è quello di una architettura mista behavioral / sequenziale :
l’architettura tipo è suddivisa in vari processi indipendenti, alcuni sincronizzati
con il clock (cioè vengono attivati solo dall’arrivo del fronte di salita o di
discesa del clock), altri sincronizzati con la variazione di segnali di tipo più
generale come reset o memory enable. Tutti questi processi sono indipendenti
fra loro, perciò a volte può risultare difficile avere un controllo pieno della
propagazione dei segnali fra i vari processi. È per questo motivo che risulta
utile avere un simulatore di codice VHDL quale Leapfrog Simulator che
permette di conoscere istante per istante come variano i segnali all’interno di
ogni processo e quindi permette un controllo del comportamento globale.
2.4 Generazione delle megacelle
Alcuni componenti elettronici standard come le memorie RAM, ROM,
FIFO ed i moltiplicatori possono essere generati automaticamente grazie ad
un programma fornito dalla fonderia ES2 senza doverli progettare a partire da
una descrizione VHDL o dal livello delle porte logiche. Il programma in
linguaggio C ES2generate permette di generare una qualsiasi delle megacelle
citate inserendo soltanto i parametri di lavoro voluti dall’utente. Ad esempio
nel processore HEPE97 sono presenti tre memorie RAM generate come
megacelle. Il programma interattivo ES2generate richiede il numero di parole
della memoria ed il numero di bit per ogni parola e produce in uscita le diverse
configurazioni finali fra cui è possibile scegliere. Per quanto riguarda la
memoria delle regole Ramrule, che contiene tutte le regole del sistema fuzzy,
inserendo il numero di parole, 64, ed il numero di bit per parola, 9, si ottiene
in uscita la possibilità di scegliere fra 4 possibili configurazioni della
Ramrule :
Tempo d’accesso
1) 8.79 ns
2) 8.02 ns
3) 8.03 ns
Dimensioni laterali
0.372 x 0.847 mm x mm
0.574 x 0.549 mm x mm
0.903 x 0.391 mm x mm
39
Area totale
0.32 mm2
0.32 mm2
0.35 mm2
4) 8.31 ns
1.761 x 0.307 mm x mm
0.54 mm2
La scelta fra queste 4 possibilità può sembrare del tutto arbitraria ma
deve essere guidata da precise linee guida : il parametro più importante da
scegliere in base alla temporizzazione esterna della memoria è il tempo
d’accesso, cioè il tempo che passa dalla commutazione del segnale di
abilitazione della memoria (memory enable) a quando il dato è stato letto o
scritto. Occorre poi prestare attenzione alle dimensioni laterali della memoria
il cui valore è del tutto irrilevante in fase di simulazione dello schema
circuitale ma che può diventare decisivo in fase di progettazione ed
ottimizzazione del layout del progetto. Per riempire al meglio gli spazi
all’interno dell’area utilizzata per realizzare il circuito integrato può risultare
più conveniente scegliere una memoria RAM di forma quasi quadrata oppure
una memoria molto più lunga che larga. Nel nostro caso, per esempio, dopo
avere provato tutte le possibili configurazioni nel layout finale del processore
la scelta è caduta sulla terza possibilità in quanto le dimensioni laterali erano
quelle che meglio si adattavano alla geometria dei vari blocchi. Quando poi la
fonderia ES2 dovrà realizzare fisicamente la memoria su silicio farà uso di
tutti i file generati dal programma ES2generate per precisare i parametri fisici
della memoria.
2.5 Simulazione funzionale con Leapfrog Simulator
Leapfrog Simulator permette di simulare il funzionamento logico
partendo dalla descrizione VHDL di una rete logica a qualsiasi livello di
astrazione. Questo risulta molto utile quando l’architettura VHDL è formata da
più processi che lavorano in parallelo e può non essere più chiaro l’ordine in
cui i vari segnali commutano. Al variare dei segnali in ingresso Leapfrog
visualizza istante per istante il livello logico, “0” o “1” o “X” cioè indefinito,
di qualsiasi segnale interno e di tutte le uscite della rete logica. In questo modo
la rete viene stimolata con valori in ingresso scelti dal progettista che
contemporaneamente tiene sotto controllo l’evolversi temporale di tutti i
segnali usati nell’architettura. Ad esempio il file contenente gli stimoli con cui
si può simulare logicamente una qualsiasi delle architetture con cui si è
descritto il flip-flop tipo set-reset può contenere i seguenti ingressi :
set <= ‘1’ ; reset <= ‘0’ ; --istruzione di assegnazione all’istante iniziale
wait for 50 ns ;
set <= ‘0’ ; reset <= ‘1’ ; --istruzione di assegnazione dopo 50 ns
wait for 50 ns ;
40
set <= ‘1’ ; reset <= ‘1’ ; --istruzione di assegnazione dopo 100 ns
wait for 50 ns ;
All’inizio i due ingressi set e reset vengono settati a 0 e rimangono in
questa situazione per 50 ns, dopodiché variano portandosi nella configurazione
1-0 e così via. Le forme d’onda (C-waves) generate da Leapfrog visualizzano
la variazione delle uscite nel momento esatto in cui ciò dovrebbe avvenire
logicamente, come visibile in fig. 2.5.
SET
RESET
Q
NOTQ
50 n s
50 n s
50 n s
Fig. 2.5: Forme d’onda relative alla simulazione del flip-flop.
La simulazione funzionale del codice VHDL è molto importante anche
perché, una volta accertata la sua correttezza, si può dedicare tutta l’attenzione
al processo di sintesi e alla simulazione dello schema circuitale così ottenuto.
2.6 Sintesi del codice VHDL
L’aspetto più interessante nella progettazione ad alto livello di circuiti
integrati è la sintesi del codice VHDL. La sintesi è un metodo completamente
automatizzato di convertire un alto livello di astrazione (descrizione VHDL) in
un livello di astrazione molto più basso (schema circuitale). A livello
commerciale esistono molti programmi di sintesi: i più usati sono Synergy
della Cadence e Synopsys dell’omonima casa americana. Noi abbiamo usato
41
Synergy per ragioni di compatibilità col software utilizzato che è della
Cadence.
Il sintetizzatore Synergy prende in ingresso il codice VHDL e lo
trasforma in una lista (netlist) di porte logiche prese dalla libreria tecnologica
scelta (processo di mapping). Questa netlist può poi essere ottimizzata per
rispettare vincoli come area, velocità, carico capacitivo, ecc., che sono scelti
dal progettista a seconda dell’applicazione finale. Gli ingressi al processo di
sintesi sono la descrizione VHDL, i vincoli e la libreria tecnologica come si
vede in fig. 2.6.
libreria tecnologica
descrizione VHDL
sintesi
netlist
vincoli
Fig. 2.6 : Schema a blocchi del processo di sintesi.
I prossimi tre paragrafi descrivono quali tipi di vincoli si possono usare e
come funziona più in dettaglio il processo di sintesi vero e proprio.
2.6.1 Il processo di sintesi
Per convertire una descrizione VHDL in uno schema circuitale occorrono
tipicamente tre passi. Prima di tutto la descrizione VHDL viene convertita in
una descrizione booleana delle uscite in funzione degli ingressi, cioè ogni
uscita viene rappresentata come una serie di operazioni logiche AND e OR
effettuate sugli ingressi. Tutte le normali istruzioni VHDL quali IF, CASE,
LOOP e tutte le istruzioni di assegnamento a segnale vengono convertite
nell’equivalente booleano attraverso semplici tabelle di verità che associano i
valori reali degli ingressi ai valori desiderati delle uscite. La descrizione
ottenuta in questo modo è funzionalmente corretta ma non è per niente
42
ottimizzata, cioè se venisse direttamente convertita in uno schema circuitale
implementando ogni operazione logica AND con la porta logica AND ed ogni
operazione logica OR con la relativa cella il risultato ottenuto non sarebbe
accettabile né in termini di area né in termini di velocità. Per questo motivo il
secondo passo consiste nell’applicare algoritmi di ottimizzazione booleana che
portano alla realizzazione di una descrizione logica
equivalente ma
ottimizzata. L’ultimo passo consiste nel mappare la descrizione booleana
finale in porte logiche appartenenti alla libreria scelta e produrre la netlist
finale. Questa netlist viene scelta fra una varietà di possibili soluzioni in base
ai vincoli imposti dal progettista principalmente sull’area e sulla velocità.
Alcune netlist danno origine a schemi circuitali che sono molto veloci ma
richiedono molte celle della libreria, altre producono schemi elettrici più lenti
ma con una superficie minore.
2.6.2 Vincoli
I vincoli forniscono gli obiettivi che i processi di ottimizzazione e
mapping dovrebbero raggiungere e controllano l’implementazione strutturale
del progetto. I vincoli disponibili nei moderni programmi di sintesi riguardano
l’area, i ritardi, la potenza assorbita, il carico, ecc., ma quelli più usati
riguardano essenzialmente l’area e la velocità. Più in dettaglio:
1) Area : il vincolo sull’area viene usato per specificare il valore di superficie
desiderato entro il quale il progettista spera rientri il circuito. L’unità di
misura con cui viene specificata l’area può essere scelta dal progettista ma
di solito si usano i micrometri quadrati (µm2). Imponendo ad un circuito il
vincolo di non superare i 1200 µm2 il programma di sintesi ottimizza la
netlist ottenuta fino a soddisfare l’obiettivo richiesto se ciò è possibile,
altrimenti ricerca il valore più vicino possibile a quello desiderato.
Specificando come vincolo un’area uguale a 0 µm2 l’algoritmo di
ottimizzazione lavorerà fino a trovare l’area più piccola possibile anche se
ciò andrà interamente a scapito del tempo di propagazione del segnale
dall’ingresso alle uscite.
2) Velocità : questo vincolo viene usato per tenere sotto controllo i ritardi
massimi di propagazione del segnale in alcuni percorsi del circuito. Ad
esempio un vincolo temporale tipico è il ritardo massimo con cui il segnale
si propaga dall’ingresso all’uscita. Questo vincolo guida il processo di
ottimizzazione e di mapping fino ad una netlist che soddisfa la richiesta. Per
il sintetizzatore questo tipo di richieste è il più difficile da rispettare. La
figura 2.7 permette di chiarire meglio questo concetto. Lo schema disegnato
43
è molto rappresentativo per una tipica rete logica sequenziale : il flusso
logico dei dati è sincronizzato con un clock e nel tempo che passa da un
colpo di clock al successivo il segnale deve essere elaborato dalla logica
combinatoria che si trova fra uno strato di registri ed il successivo. Si può
comunicare al sintetizzatore quale dovrebbe essere la frequenza di lavoro
del clock in modo che l’ottimizzatore manipoli la logica combinatoria in
modo tale che il segnale prodotto faccia in tempo a sincronizzarsi con il
periodo di clock successivo. Altrimenti si può direttamente porre un vincolo
temporale sulle uscite della logica combinatoria in relazione agli ingressi.
Per raggiungere questo obiettivo il sintetizzatore esegue un’analisi
temporale dei ritardi in ogni nodo del circuito, tenendo conto del tempo di
propagazione di ogni singola porta e sommando questi ritardi per ogni porta
che viene attraversata. Se alla fine di questo lavoro di verifica il
sintetizzatore giunge alla conclusione che i vincoli temporali sono stati
rispettati, il processo di ottimizzazione e mapping può ritenersi concluso,
altrimenti ulteriori strategie di ottimizzazione dovranno essere applicate.
REGISTRO A
INGRESSO
REGISTRO B
LOGICA
COMBINATORIA
USCITA
CLOCK
Fig. 2.7: Struttura tipica di una rete logica sequenziale.
2.6.3 Libreria tecnologica
La libreria tecnologica contiene tutte le informazioni necessarie al
programma di sintesi per creare una netlist di porte logiche che soddisfi ai
vincoli imposti dal progettista. Di ogni porta logica la libreria tecnologica
contiene non solo la funzionalità logica, ma anche l’area, il ritardo
dall’ingresso all’uscita (minimo, tipico, massimo), il fanin (il valore capacitivo
44
assegnato alla porta d’ingresso), il fanout (la capacita di pilotare le porte che
seguono) e tutte le caratteristiche fisiche utili al sintetizzatore. Le tabelle tab.
2.1 e 2.2 riportano tutte le caratteristiche della porta logica AND2 (AND a due
ingressi) della libreria StdLib della ES2.
13.400 µm
38.000 µm
7
4.26 µW/MHz
0.029 pF
0.033 pF
1.31 pF
Lunghezza
Larghezza
Numero di transistor
Dissipazione
Fanin in A
Fanin in B
Fanout in Y
Tab. 2.1: Tabella con le caratteristiche di una porta logica AND2 della libreria
StdLib della ES2.
CODICE
tplh
tphl
tplh
tphl
dtplh
dtphl
DA
a
a
b
b
aob
aob
A
y
y
y
y
y
y
MIN
0.14 ns
0.19 ns
0.17 ns
0.18 ns
0.37 ns/pF
0.39 ns/pF
TIP
0.30 ns
0.40 ns
0.36 ns
0.38 ns
0.78 ns/pF
0.82 ns/pF
MAX
0.60 ns
0.80 ns
0.71 ns
0.75 ns
1.55 ns/pF
1.63 ns/pF
Tab. 2.2: Tempi di ritardo fra ingresso e uscite della porta AND2.
Nella successiva fig. 2.8 è visualizzato il funzionamento dell’algoritmo
del sintetizzatore per calcolare il tempo che il segnale impiega fra la porta A1
e la C1. Esso è dato da:
ritardo totale = (ritardo intrinseco) + (ritardo dovuto al carico) +
(ritardo dovuto alla connessione fisica)
dove:
• il ritardo intrinseco è il tempo che la porta B1 impiegherebbe per
commutare se non dovesse pilotare altre porte;
45
• il ritardo dovuto al carico è il ritardo dovuto al carico capacitivo da pilotare
rappresentato dalla porta C1 ;
• il ritardo dovuto alla connessione fisica è il tempo che il segnale impiega
per propagarsi lungo la connessione fisica fra le porte B1 e C1.
ritardo dovuto al carico
A1
B1
C1
ritardo intrinseco
ritardo dovuto
al collegamento fisico
Fig. 2.8: Le tre componenti del ritardo attraverso la porta B1.
Normalmente il sintetizzatore tiene conto soltanto delle prime due
componenti a meno che il ritardo dovuto alle connessioni fisiche non sia
giudicato determinante dal progettista: in questo caso occorre settare le opzioni
del sintetizzatore in modo che ad ogni collegamento sia assegnato un ritardo.
In base ai valori riportati nella libreria tecnologica della cella ES2 il
sintetizzatore calcola il tempo minimo ed il tempo massimo che il segnale
impiega per fare commutare la porta B1.
Inoltre il sintetizzatore tiene conto del fanin e del fanout di ogni porta per
controllare che non vi siano dei sovraccarichi (overload) : ad esempio la porta
AND2 ha un fanout dichiarato di 1.31 pF, cioè può pilotare senza problemi
tante porte logiche in parallelo tali che la capacità totale risulti inferiore a 1.31
pF. Se questo valore viene oltrepassato la cella AND2 non è più capace di
pilotare le porte che la seguono e il funzionamento dell’intera rete risulta
pregiudicato.
A volte però può capitare che il sintetizzatore commetta degli errori e
produca degli schemi elettrici con sovraccarichi di diversa entità: si ha un
important overload quando il rapporto fra il carico capacitivo effettivo e
quello massimo pilotabile è maggiore di 1.4, un overload normale invece
46
quando questo rapporto è compreso fra 1 e 1.4. L’unico modo per risolvere
questo tipo di problema è intervenire direttamente sullo schema elettrico
introducendo delle porte buffer (BUF39 nella libreria standard della fonderia
ES2) che hanno un basso fanin e sono in grado di pilotare un alto carico
capacitivo.
La libreria tecnologica può anche contenere dati riguardanti le variazioni
dei parametri di funzionamento di una cella in funzione delle condizioni
effettive di lavoro, quali la tensione di alimentazione o la temperatura del
dispositivo. Tenendo conto di tutti questi fattori è molto probabile che lo
schema elettrico finale sia perfettamente corrispondente alle aspettative del
progettista sotto ogni punto di vista.
2.7 Strumenti di simulazione
Poiché le reti logiche diventano giorno dopo giorno sempre più
complicate i progettisti si trovano di fronte all’arduo problema di assicurarsi
che i loro progetti funzionino correttamente una volta realizzati. I costi di
realizzazione uniti al tempo totale di fabbricazione rendono vitale la necessità
che il progetto commissionato sia corretto e perfettamente funzionante in ogni
sua parte, prima di essere commissionato alla fonderia. È per tutti questi
motivi che la simulazione circuitale assistita al calcolatore assume particolare
importanza, in quanto ci si aspetta che un progetto che abbia superato tutte le
simulazioni software funzioni esattamente allo stesso modo una volta
implementato in hardware.
Un approccio possibile per simulare il funzionamento di un progetto è
dividere la verifica funzionale e temporale in due processi separati, per mezzo
di due programmi diversi ognuno ottimizzato per il proprio compito. In questo
modo il simulatore funzionale è libero di usare un semplice modello per i
ritardi che permette una verifica funzionale molto veloce. Un secondo
programma gestisce separatamente la verifica dei tempi usando algoritmi
sofisticati creati appositamente per l’analisi temporale. L’ambiente integrato di
lavoro Cadence utilizza questo tipo di approccio con i due simulatori Verilog e
Veritime. Verilog è un simulatore logico estremamente veloce che permette
una rapida analisi funzionale, Veritime è il corrispettivo analizzatore dei tempi
che permette un’approfondita analisi temporale del medesimo circuito.
Veritime è capace di svolgere o una analisi temporale di ogni percorso della
rete logica desiderato oppure una unica forma di analisi ibrida che fonde la
potenza di una analisi temporale basata sulla conoscenza dei vettori di ingresso
e di programmi che calcolano il tempo impiegato dal segnale su ogni possibile
percorso del circuito. I prossimi paragrafi descrivono più in dettaglio il
47
funzionamento di Verilog e Veritime e come devono essere usati per testare
nel modo più approfondito possibile il funzionamento di un circuito.
2.8 Simulazione circuitale con Verilog XL
Il primo controllo da effettuare sullo schema elettrico ottenuto con il
sintetizzatore Synergy ha lo scopo di verificare che questo si comporti
esattamente come descritto nel codice VHDL. Poiché il codice VHDL è stato
simulato in precedenza con alcuni vettori di ingresso usando il simulatore
Leapfrog, conviene stimolare la rete circuitale ottenuta con gli stessi ingressi
per verificare che i risultati siano compatibili.
Il procedimento è analogo alla simulazione logica: in un file di stimolo
STL (Simulation Test Language) vengono scritti i vettori di test che verranno
posti in ingresso al circuito; quindi le uscite e tutti i segnali interni richiesti dal
progettista vengono monitorati per controllare che i risultati siano corretti.
Tutti i segnali di cui si vuole controllare l’evoluzione temporale sono graficati
con forme d’onda (c-waves) esattamente come avveniva con Leapfrog ma
tenendo conto del ritardo introdotto da ogni cella. Fra le opzioni di
simulazione si può scegliere se considerare per ogni cella il tipo di ritardo
minimo, tipico o massimo fra i tre valori che si trovano nella libreria
tecnologica: di solito viene scelto il ritardo massimo per mettersi nel caso
peggiore possibile, anche se la possibilità che tutte le celle di una rete
commutino con il ritardo massimo è una situazione altamente improbabile, è
molto più probabile una distribuzione normale dei ritardi attorno ad un valore
medio. La fig. 2.9 mostra le forme d’onda relative al flip-flop setreset
48
Fig. 2.9: Forme d’onda relative alla simulazione del flip-flop con Verilog.
generate da Verilog e va confrontata con la fig. 2.3 che riporta le forme d’onda
generate da Leapfrog. Poiché il simulatore Verilog usa lo stesso algoritmo per
il calcolo dei ritardi di Synergy si può verificare l’accuratezza del lavoro
svolto dal sintetizzatore. In più Verilog produce in uscita il file dl.log nel quale
è riportato il carico capacitivo reale di tutti i segnali interni al circuito,
compresi eventuali sovraccarichi che devono essere eliminati con
l’introduzione di celle buffer nello schema circuitale.
Vediamo come esempio una parte di un file di stimolo STL relativo ad un
flip-flop di tipo D per capire in particolar modo come temporizzare il clock ed
i segnali in ingresso rispetto al clock:
Input.stl di un flip-flop di tipo D
--definizione dei segnali usati
defpin
defpin
defpin
Data_in
Ck
Data_out
in
clk
out
--dato in ingresso
--clock
--dato in uscita
--definizione delle temporizzazioni
deftiming 100ps 2ns 20ns
defclock
“…..11111”
Ck --basso per 10 ns e alto per 10
ns
defstrobe in edge “.....%%%%%”
Data_in
--il dato cambia dopo 10
ns
defformat (Data_in)
deftest
xv(0)
--entra il dato a livello logico 0
xv(1)
--entra il dato a livello logico 1
49
endtest
Ck
D a ta _ in
10 ns
10 n s
20 ns
Fig. 2.10: Temporizzazione del flip-flop tipo D descritto nel file input.stl.
La visualizzazione grafica dei segnali relativi a questi stimoli è riportata
in fig. 2.10. Per prima cosa con l’istruzione “defpin” vengono definiti gli
ingressi Data_in e Ck e l’uscita Data_out. Con l’istruzione “deftiming” viene
specificata la temporizzazione degli ingressi: 100ps è la risoluzione usata nella
visualizzazione delle forme d’onda d’uscita (ogni evento che ha una dinamica
inferiore ai 100 ps non viene rilevato da Verilog), 20 ns è il periodo del clock
usato, 2 ns è la decima parte del periodo clock, il valore temporale di ognuno
dei puntini, unità o percentuali che si trovano nelle istruzioni successive.
L’istruzione “defclock” definisce la temporizzazione del segnale Ck, cioè
come varia il clock all’interno dei 20 ns: cinque punti seguiti da cinque unità
stanno a significare che per 10 ns il clock sta a livello logico 0 per poi
commutare e rimanere a livello logico 1 per i rimanenti 10 ns. Se l’istruzione
defclock fosse stata la seguente:
defclock “..11111…” Ck
allora il clock sarebbe rimasto a livello logico 0 per 4 ns (due puntini
equivalgono a 4 ns), a livello 1 per 10 ns e di nuovo a 0 fino alla fine del
periodo. Con la stessa istruzione si potrebbe definire un clock asimmetrico, ad
esempio un clock che rimane più tempo a livello logico 0 che a 1, mettendo
più puntini che unità. L’istruzione “defstrobe in edge” definisce la
temporizzazione dell’unico ingresso Data_in rispetto al clock: i 5 punti seguiti
da 5 simboli “%” significano che il dato commuta 10 ns dopo l’inizio del
50
periodo clock, come visibile in fig. 2.10. Usando quindi le istruzioni defclock
e defstrobe si può modellare a piacimento la temporizzazione dei segnali di
ingresso ad una rete data. La successiva istruzione “defformat” contiene una
lista di tutti gli ingressi ad esclusione del clock (in questo caso solo Data_in)
mentre tutte le istruzioni comprese fra “deftest” ed “endtest” contrassegnate
con la parola chiave “xv” costituiscono la successione dei livelli logici dei
segnali d’ingresso con le temporizzazioni definite sopra: in questo caso ad
esempio durante il primo periodo di clock Data_in si trova a livello logico 0
mentre durante il secondo si trova ad 1.
Una volta verificato il funzionamento del circuito con Verilog è
necessario passare ad una più approfondita analisi temporale con Veritime,
che è capace di evidenziare problemi spesso invisibili a Verilog.
2.9 Analisi temporale con Veritime
Veritime è un programma della Cadence dedicato ad una analisi
approfondita della temporizzazione delle reti logiche digitali. I prossimi
paragrafi sono dedicati ad una spiegazione dettagliata del modo di operare di
Veritime e degli algoritmi che ne stanno alla base confrontandoli con quelli
usati dal sintetizzatore Synergy e da Verilog.
2.9.1 Dispositivi di memoria e vincoli temporali
Le reti logiche contengono generalmente parti di logica puramente
combinatoria, dove il segnale scorre attraverso le porte rispettando i relativi
ritardi di propagazione. Ogni blocco di logica combinatoria è di solito seguito
e preceduto da uno o più elementi pilotati da un clock che servono a
memorizzare lo stato dei segnali per il periodo di clock successivo. Questi
elementi di logica sequenziale, che d’ora in poi saranno chiamati dispositivi di
memoria, sono essenziali per costruire architetture di tipo pipeline e sono
particolarmente importanti per Veritime.
Lo scopo principale dell’analisi dei tempi è verificare che il flusso di dati
attraverso i blocchi di logica combinatoria sia sufficientemente veloce da non
violare i vincoli imposti sui “dispositivi di memoria”. Dal punto di vista
dell’analisi di una rete si può dire che tali dispositivi suddividono l’intera rete
in blocchi più semplici da trattare.
Questi dispositivi di memoria comprendono :
• flip-flop di tipo latch : un flip-flop di questo tipo lascia passare il dato solo
se la linea del clock è attiva, mentre memorizza l’ultimo valore in ingresso
quando il clock è a livello logico 0.
51
• flip-flop di tipo edge-triggered : un flip-flop di questo tipo trasferisce il
dato dall’ingresso all’uscita solo quando si ha una transizione sul valore del
clock (ad esempio quando passa dal valore 0 a 1). Si usa il termine registro
per indicare un insieme di flip-flop di tipo edeg-triggered che sono
comandati in parallelo dal medesimo clock.
• memorie RAM : le memorie vengono usate per memorizzare una grande
quantità di dati. Anche se di solito non sono pilotate da un clock devono
rispettare alcuni rigidi vincoli temporali (timing check). Ad esempio
l’indirizzo inviato ad una RAM non deve variare non solo durante la fase di
scrittura in memoria ma anche per un certo periodo precedente e seguente la
scrittura. Vincoli temporali di questo tipo sono una parte importante del
progetto e una completa analisi temporale ne deve tenere conto.
In una analisi di Veritime i vincoli temporali imposti su ciascuno dei
dispositivi di memoria sopra descritti sono incorporati nella libreria
tecnologica. I più comuni vincoli temporali sono quelli di setup, di hold e di
nochange (vedi fig. 2.11 e fig. 2.12).
C loc k
4
se tu p
3
ho ld
reg ion e d i v iola zio n e
(il d ato non d ev e cam bia re in que sto p erio do )
Fig. 2.11: Diagramma temporale dei vincoli di setup e hold.
52
I vincoli di setup e hold specificano che il dato in ingresso deve rimanere
stabile per un certo periodo di tempo prima e dopo che vari il segnale del
clock. Il vincolo nochange invece è usato per specificare che il dato non deve
assolutamente commutare di livello entro un periodo specificato dal
progettista. Le RAM hanno una serie di vincoli relativi alla temporizzazione
del bus di indirizzi, del bus di dati di ingresso e uscita e dei segnali di enable
di lettura e di scrittura che sono tutti specificati nella libreria Megacell.
clo ck
4
3
lim ite 1
lim ite 2
reg io n e d i v io lazio n e
Fig. 2.12: Diagramma temporale del vincolo nochange.
La maggior parte dei vincoli temporali è usata per governare il rapporto
fra due ingressi di un dispositivo di memoria, tipicamente un dato e un clock.
Veritime trova una violazione quando la relativa temporizzazione dei percorsi
che conducono a tali ingressi è tale da violare il vincolo temporale che governa
il dispositivo.
2.9.2 Come Veritime trova le violazioni temporali
Per verificare la presenza di violazioni temporali nella temporizzazione
di un flip-flop Veritime deve calcolare gli istanti di tempo in cui si ha una
variazione sul dato e sul clock. Per fare questo il simulatore deve analizzare
tutta la logica combinatoria che sta a monte del flip-flop, tenendo in
considerazione tutti i possibili percorsi che il dato e il clock possono scegliere.
In più sia per il dato, sia per il clock, Veritime tiene conto dell’istante minimo
e di quello massimo in cui può avvenire la commutazione : l’istante minimo è
calcolato utilizzando il percorso più corto assegnando ad ogni porta
attraversata il ritardo di propagazione minimo, l’istante massimo invece è
53
calcolato sul percorso più lungo assegnando il ritardo di propagazione
massimo ad ogni porta. In questo modo entrambi i segnali in ingresso al flipflop avranno un intervallo di tempo in cui possono commutare.
La scelta del percorso più corto con ritardi minimi e di quello più lungo
con ritardi massimi è dovuta alla necessità di prendere in considerazione i due
casi estremi che possono verificarsi. Una volta eseguiti questi calcoli Veritime
esamina la sovrapposizione dei due intervalli : se c’è la possibilità che il
vincolo temporale associato al flip-flop non sia rispettato viene visualizzato un
messaggio di errore. Di fronte ad un problema di questo tipo si possono
intraprendere diverse azioni, ad esempio si può :
1) aumentare il periodo del clock (e quindi diminuire la frequenza di lavoro) ;
2) diminuire la lunghezza del collegamento fisico fra due punti sul layout ;
3) usare componenti più veloci o, in un progetto full-custom, riprogettare certi
transistor per renderli più veloci ;
4) usare algoritmi logici più veloci, ad esempio sostituendo un sommatore in
cascata con un carry look ahead ;
5) cambiare l’architettura del progetto, ad esempio spezzando in più periodi di
clock una operazione complessa .
Ognuno di questi accorgimenti richiede di dovere riprendere e modificare
l’architettura del progetto fino a quando non siano state eliminate tutte le
violazioni. Il simulatore Veritime aiuta a scegliere fra le varie possibili
decisioni da prendere con alcune utilità che lo contraddistinguono : ad esempio
Veritime può evidenziare il percorso che dà dei problemi direttamente sullo
schematic in modo che si possa intervenire solo nel punto critico. Un’altra
caratteristica utile di Veritime è la funzione distribuzione dei percorsi, che
può aiutare a stimare quanto sia difficile correggere i problemi temporali nel
circuito. Questa routine calcola il tempo impiegato su ciascuno dei possibili
percorsi fra un insieme di ingressi e un insieme di uscite, producendo in uscita
l’istogramma della distribuzione dei ritardi : se solo pochi percorsi producono
una violazione allora il problema può essere risolto con il minimo sforzo
modificando i soli percorsi interessati, se invece un numero di percorsi molto
grande è fonte di violazioni allora il blocco circuitale deve essere riprogettato
da capo. La funzione di distribuzione dei percorsi usa un algoritmo ottimizzato
per essere molto veloce anche quando il numero totale di percorsi possibili è
enorme.
Prima di prendere delle decisioni drastiche occorre però studiare
accuratamente l’errore visualizzato da Veritime, in quanto si potrebbe anche
trattare di un falso errore. Una falsa violazione non rappresenta un errore vero
54
e proprio, ma solo una situazione che il simulatore presenta come una
potenziale violazione. In alcune reti è comune avere dozzine di false violazioni
per ogni errore vero e proprio. Questa situazione può essere altrettanto
pericolosa quanto avere degli errori non trovati in quanto può essere molto
difficile trovare delle vere violazioni in mezzo ad una marea di falsi errori e
può diventare facile abituarsi ad ignorare tutti i messaggi d’errore di Veritime.
La causa primaria delle false violazioni sono i falsi percorsi, cioè
percorsi che esistono ma non sono effettivamente usati per opera della logica
di controllo che gestisce la funzionalità dell’intero progetto. Si veda ad
esempio il caso di una semplice ALU (Arithmetic Logic Unit), una rete
combinatoria progettata per svolgere calcoli aritmetici e logici: mentre la ALU
sta compiendo una operazione logica fra gli ingressi tutte le celle che
appartengono al blocco aritmetico non vengono usate, perciò eventuali
violazioni temporali che riguardano questa parte della rete sono assolutamente
prive di importanza. Una delle caratteristiche più apprezzabili di Veritime è la
sua abilità di interagire con la simulazione logica per eliminare questi falsi
percorsi. Conoscendo i vettori di ingresso e come si propagano all’interno
della rete Veritime può sapere quale parte del circuito non è correntemente
usata e quale invece lo è : in questo modo in uscita verranno visualizzate
soltanto le violazioni vere.
2.9.3 Calcolo della lunghezza dei percorsi con Veritime
Il modo in cui Veritime calcola la lunghezza minima e massima lungo un
percorso è abbastanza semplice come evidenziato in fig. 2.13. Il ritardo lungo
ogni porta logica sul cammino è specificato nel formato min:tip:max, cioè
ritardo minimo, tipico e massimo. Veritime calcola il ritardo minimo lungo un
percorso sommando tutti i ritardi minimi e, allo stesso modo, il ritardo
massimo è dato dalla somma di tutti i singoli ritardi massimi. Le due
connessioni in figura di cui non è specificato il ritardo sono considerate come
se non avessero ritardo.
55
M OD 1
p u n to d 'in iz io
p u n to d i fin e
# (2 :4 :6 )
G1
# (2 :4 :6 )
G2
# ( 5 :7 :9 )
G3
# (8 :1 0 :1 2 )
# ( 4 :6 :8 )
# ( 2 0 :3 0 :4 0 )
p erc o rso
m in im o
2
+
5
+
0
+
8
+
2
+
20
+ 0 +
p erco rso
m assim o
6
+
9
+
0
+
12
+
6
+
40
+ 0 +
4
8
= 41
= 81
Fig. 2.13: Esempio di calcolo della lunghezza di un percorso con Veritime.
Oltre ai ritardi minimi e massimi di una porta, la libreria tecnologica
contiene due valori distinti per il ritardo nel caso di una transizione da 0 a 1
Fig. 2.14: Calcolo della lunghezza di un percorso in base alla commutazione
positiva o negativa del segnale di ingresso.
(tplh) e da 1 a 0 (tphl). In fig. 2.14 è mostrato come Veritime tenga conto di
queste differenze di ritardo.
Facciamo il caso che ogni porta logica NOT che si trova sul tracciato
impieghi 2 ns per commutare da 0 a 1 e 3 ns per portarsi da 1 a 0. In questo
modo si avranno due ritardi diversi se in ingresso si avrà una transizione
positiva o negativa: se in ingresso si ha una transizione positiva il ritardo totale
56
è di 7 ns in quanto due porte NOT commutano da 0 a 1; nel caso contrario è di
8 ns. Questo modo di determinare la lunghezza temporale dei percorsi rende
Veritime meno “pessimistico” di altri simulatori che non fanno differenza fra
ritardi relativi a commutazioni da 0 a 1 e da 1 a 0.Quando Veritime conosce
sia il ritardo minimo, tipico e massimo di propagazione, sia quello relativo alle
transizioni positive e negative di tutti gli elementi che si trovano sul percorso,
esso prende in considerazione tutte le possibili combinazioni rendendo il
processo di simulazione molto lungo, specialmente nel caso di circuiti
complessi.
2.9.4 Visualizzazione delle violazioni con Veritime
Appena viene scoperta una violazione temporale Veritime la visualizza in
uscita e la registra su un file in modo che possa essere analizzata in un
secondo momento visto che una simulazione temporale può durare diverse ore
se il circuito è sufficientemente complesso. La visualizzazione dell’errore
mostra:
• il tipo di violazione temporale scoperta (setup, hold o altri);
• l’entità della violazione, cioè di quanti ns il vincolo è violato;
• gli intervalli di arrivo dei segnali del dato e del clock.
Un esempio di violazione di setup può essere il seguente:
dff.dato 200 : 500 ns; dff.clock 300 : 700 ns;
tempo di setup di 30 ns;
violazione di setup di 230 ns.
Questa descrizione significa, come meglio intuibile in fig. 2.15, che il
dato in ingresso al flip-flop può arrivare in qualsiasi istante fra 200 e 500 ns,
mentre il clock fra 300 e 700 ns. Questo significa che potenzialmente si può
avere o una violazione di setup o una violazione di hold o nessuna violazione a
seconda dell’istante in cui i due segnali commutano. Ad esempio se il dato
commuta all’istante 400 ns ed il clock all’istante 420 ns si ha una violazione di
setup; nel caso opposto si avrebbe una violazione di hold. Se il dato commuta
all’istante 400 ed il clock all’istante 500 non si ha alcuna violazione.
57
0
500
2 00
300
7 00
1 0 00
(n s)
D AT O
CLOCK
V IO L A Z IO N E
23 0 ns
Fig. 2.15: Diagramma temporale di una violazione di setup.
Compito di Veritime è segnalare che tale dispositivo di memoria può
dare dei problemi, sta poi al progettista scegliere l’accorgimento migliore per
eliminare ogni possibilità di malfunzionamento. In questo caso particolare
Veritime cataloga la violazione come violazione di setup in quanto il dato può
commutare prima del clock. Nel caso in cui l’intervallo degli istanti di arrivo
del clock fosse stato shiftato a destra rispetto a quello relativo al clock
Veritime avrebbe catalogato la violazione come appartenente alla categoria di
hold.
L’entità della violazione si calcola sottraendo l’estremo sinistro del range
del clock all’estremo destro del range del dato ed aggiungendo il tempo di
setup di 30 ns che è una caratteristica intrinseca del flip-flop: si ottiene così il
valore di 230 ns che è indicativo dell’entità delle modifiche da apportare al
progetto perché non dia più alcuna violazione.
Un altro dato importante che Veritime è capace di produrre è lo slack
time. Per i progettisti che lavorano con circuiti in cui la parte combinatoria sta
a malapena al passo della logica sequenziale Veritime fornisce una funzione
che permette di scegliere il periodo ottimale del clock. In pratica eseguendo
questa funzione dopo una normale analisi temporale si può vedere quanto si è
andati vicini a violare certi vincoli temporali. Questa informazione è
esattamente quella che serve per sapere se incrementare o decrementare il
periodo del clock. La figura 2.16 mostra gli slack time associati ai vincoli
setup e hold di un flip-flop. Come si vede ci sono due diversi slack time
associati al vincolo temporale, uno che precede la transizione del clock e uno
che la segue. Questi due tempi, chiamati A e D in figura, possono essere
58
diminuiti il più possibile aumentando la frequenza del clock: quando però il
loro valore dovesse diventare nullo Veritime sarebbe costretto a visualizzare
questa situazione come una possibile violazione temporale.
DATO
CLOCK
A
C
B
D
A: slack time prima del clock
B: tempo di setup
C: tempo di hold
D: slack time dopo il clock
Fig. 2.16: Gli slack time per i vincoli di setup e hold.
In conclusione sfruttando in pieno le potenzialità di Veritime si può
raggiungere una conoscenza profonda del progetto sotto esame e dei modi per
correggerlo e migliorarlo, in modo che quando verrà poi implementato
fisicamente su silicio non dia il minimo problema.
2.10 Simulazione dei difetti di fabbricazione con Verifault XL
Verifault XL è un simulatore di difetti di fabbricazione che opera nello
stesso ambiente di Verilog XL e usa le medesime librerie tecnologiche.
Verifault permette la simulazione di difetti di fabbricazione che possono
eventualmente essere presenti in un circuito integrato. Usando Verifault il
progettista dovrebbe essere capace di costruire una serie di vettori di test da
dare in ingresso al chip in modo da rivelare la presenza di tali errori, se, a
parità di ingressi, il valore fornito in uscita differisce da quello previsto
teoricamente dai programmi di simulazione.
Il modello logico usato da Verifault è molto semplice : Verifault pone in
diversi punti della rete logica degli “errori”, cioè dei segnali che si
59
mantengono ad un valore costante comunque varino gli ingressi. Il livello
logico a cui si mantengono questi punti influenza ovviamente la funzionalità
dell’intera rete, ma se i vettori di test non sono stati scelti con cura si
potrebbero avere lo stesso dei valori corretti anche in presenza di tali errori.
Verifault effettua una statistica degli errori scoperti rispetto al numero di errori
effettivi con l’insieme di vettori in ingresso specificati dal progettista. Un
esempio di statistica fornita da Verifault è la seguente :
C A R RY _ IN
A
B
G1
SOM M A
G2
G3
G4
G5
C A R RY _ O U T
lo cazio n e d ell'erro re
A B
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
Tab ella d i v erità
C IN S U M C O U T S U M * C O U T *
0
0
0
1
0
1
1
0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
0
1
1
1
1
1
1
0
1
Fig. 2.17: Schema logico di un full-adder con un segnale fisso a 1.
Errori trovati : 82.2 % (l’uscita ha livello logico opposto a quello corretto)
Errori potenziali : 11.7 % (l’uscita si trova in alta impedenza e non a 0 o 1)
Errori non rivelati : 6.1 % (le uscite sono le medesime del circuito corretto)
In questo caso il numero di difetti trovati è molto alto ma rimane
comunque una piccola percentuale di errori che non possono venire scoperti
mantenendo lo stesso set di vettori in ingresso. È quindi buona norma lavorare
sul set di dati in ingresso per massimizzare la percentuale di errori trovati. In
60
fig. 2.17 viene riportato un esempio pratico per capire come funziona
effettivamente Verifault : nel semplice full-adder rappresentato è stato
introdotto un difetto sull’uscita della porta XOR G1 il cui stato è fissato al
livello logico 1. Confrontando la tabella di verità della rete corretta con quella
della rete “errata” si vede che in quattro casi su otto le uscite hanno un valore
diverso da quello corretto. Dal confronto delle due tabelle di verità Verifault
individua la violazione e la classifica come rivelata, potenzialmente rivelata o
non rivelata secondo quanto specificato nella tabella di fig. 2.18. Nella tabella
si vede che se l’uscita del circuito corretto e quella del circuito errato
coincidono l’errore non viene scoperto, altrimenti il difetto è rivelato. Quando
l’uscita del circuito privo di errori si trova nello stato 1, mentre in presenza di
difetti si trova in alta impedenza (Z) o in uno stato indefinito (X) il simulatore
cataloga l’errore come potenzialmente rivelato. La certezza di avere scoperto
un errore c’è solo quando l’uscita corretta è a livello logico 0 o 1 e l’uscita
sbagliata si trova al livello logico opposto.
circu ito co n errori
circuito
co rretto
0
1
Z
X
0
N
R
P
P
1
R
N
P
P
Z
N
N
N
N
X
N
N
N
N
N : no n tro vato
R : rivelato
P : po tenzialm ente trovato
Z : alta im peden za
X : stato lo gico indefinito
Fig. 2.18: Criteri per la catalogazione dei difetti.
61
La simulazione con Verifault, che si occupa di errori fisici e non più di
errori logici come i precedenti simulatori presi in rassegna, è caldamente
consigliata nell’ES2 Cadence Design Kit. Infatti i vettori di ingresso
selezionati appositamente per rivelare il numero più alto possibile di errori
saranno poi gli stessi dati in ingresso al chip una volta che ne sarà effettuato il
test con un ASIC tester qualsiasi. Se si usasse un insieme di vettori di test più
piccolo non si potrebbe poi sapere se il chip può funzionare correttamente in
qualsiasi tipo di applicazione sia utilizzato.
2.11 Dallo schematic al layout
Dopo avere realizzato lo schema circuitale e dopo avere superato con
successo tutte le verifiche imposte dai tre simulatori Verilog, Veritime e
Verifault il passo successivo della progettazione consiste nel passare da una
rappresentazione logica del circuito ad una rappresentazione fisica vera e
propria che contenga tutte le specifiche grazie alle quali la fonderia ES2 possa
realizzare il circuito integrato richiesto. Nel tipo di progettazione semi-custom
da noi adottato la realizzazione del layout non è estremamente difficoltosa in
quanto si riduce alla disposizione geometrica di standard cell e megacelle
all’interno di una superficie delimitata dai dispositivi di input/output ma può
richiedere un lavoro lungo parecchi mesi prima di raggiungere una
configurazione finale soddisfacente e ben ottimizzata. Fortunatamente l’opera
di realizzazione del layout è assistita passo dopo passo da programmi di
“placement & routing” all’interno dell’ambiente di lavoro “Cell Ensemble”. I
programmi offerti da Cell Ensemble assistono ogni passo logico che porta
dallo schematic al layout vero e proprio. In questo e nei prossimi paragrafi
segue una descrizione sommaria di tutti questi passi.
2.11.1 Inclusione dei pad di I/O e di alimentazione
La prima cosa da fare è scegliere i pad di I/O dalla libreria PadLib e porli
negli ingressi e nelle uscite della vista schematic. I pad di I/O sono delle
normali porte logiche progettate ed ottimizzate appositamente per pilotare gli
ingressi e le uscite di una rete logica: le loro caratteristiche sono contenute
nella libreria tecnologica PadLib, ma la loro composizione interna non è
assolutamente di interesse per il progettista. Ci sono pad CMOS e pad TTL,
pad invertenti e non invertenti, pad con resistenza di pull-up di vari valori, pad
con trigger di Schmitt : il progettista sceglie fra essi i più adatti alle proprie
esigenze. Il parametro più importante dei pad di uscita è il fanout : in tutti i
componenti della libreria questo valore non è inferiore a 100 pF in quanto le
62
uscite del chip devono essere in grado di pilotare qualsiasi dispositivo senza
problemi (si ricordi che tipicamente una porta d’ingresso ha un fanin di
qualche decimo di pF). Un’altra osservazione è che l’introduzione di ulteriori
porte logiche in una rete potrebbe produrre dei problemi sui timing check in
quanto ognuno dei pad aggiunti reca con sé un ritardo aggiuntivo che è di circa
2 ns. Comunque se la temporizzazione interna dei segnali è corretta basta
modificare di poco la struttura della temporizzazione dei segnali in ingresso
per eliminare qualsiasi tipo di problema.
Inoltre vanno inseriti nello schema circuitale i pad di alimentazione e di
massa che sono divisi in due categorie : in un circuito integrato un pad VDD
può alimentare o solo il nucleo, cioè tutto quello che è compreso all’interno
dell’area delimitata dai pad, o solo la periferia, cioè tutti i pad di I/0 che si
trovano nell’anello esterno del chip, e lo stesso discorso vale per un pad GND.
Quindi nell’elenco dei piedini di ingresso e uscita di un circuito integrato si
useranno sempre le seguenti notazioni :
VDD_Core:
VDD_Pery :
GND_Core:
GND_Pery :
pad di alimentazione del nucleo ;
pad di alimentazione della periferia ;
pad di massa del nucleo ;
pad di massa della periferia.
Al progettista non rimane che scegliere quanti pad mettere per ogni categoria
in base al calcolo della potenza assorbita dal nucleo e dalla periferia. Mettere
un numero di pad insufficiente a fornire la corrente richiesta alla frequenza
di lavoro dell’integrato può compromettere gravemente la funzionalità del
chip. Occorre quindi prestare grande attenzione alla scelta del numero di pad,
così come alla scelta della larghezza delle piste per evitare che il chip non
riesca a raggiungere certe frequenze e bruci prima. Può capitare ad esempio
che un circuito integrato assorba una quantità di corrente eccessiva rispetto
alla larghezza delle piste interne (più una pista è larga maggiore è la corrente
che può sopportare). In questo caso la pista si interrompe ed il circuito non
funzionerà ovviamente più senza che sia possibile aggiustarlo. Compito del
progettista del layout è svolgere con cura questi calcoli prima che il circuito
sia realizzato per evitare tali problemi. Tutti i dettagli relativi a questo genere
di calcoli sul chip fuzzy HEPE97 sono riportati in dettaglio nel capitolo 4.
2.11.2 Fase di posizionamento delle celle (placement)
Una volta completato lo schema circuitale con tutti i pad di I/O si può
passare direttamente alla fase di progettazione della geometria del circuito
integrato. In base al numero totale di pad Cell Ensemble calcola le dimensioni
63
approssimative che avrà il chip e visualizza questa regione contornata dai pad
di I/O in alto, dalle standard cell a destra e dalle megacelle a sinistra come
visibile in fig. 2.19.
Fig. 2.19 : Regione centrale del chip contornata dai pad di I/O (sopra),
dalle megacelle (a sinistra) e dalle standard cell (a destra).
L’area stimata per il chip è fortemente influenzata dal numero di pad che
determinano il perimetro totale: infatti se questo numero è molto grande l’area
risulterà di conseguenza grande anche se il numero di celle con cui riempirlo è
piccolo. Visto che il costo della realizzazione è lo stesso sia che l’interno sia
pieno sia che sia semivuoto conviene riempirlo il più possibile. Il passo
successivo consiste nel posizionare i piedini attorno alla regione di default
nell’ordine che meglio si crede in relazione a come si pensa di posizionare i
vari blocchi all’interno. Ad esempio se si pensa di collegare tutti i flip-flop
edge triggered al piedino di ingresso del clock con una pista centrale da cui si
dipartono tutti i singoli collegamenti conviene posizionare il pad del clock in
alto al centro. Considerazioni simili possono condurre alla disposizione di tutti
gli altri piedini. Fatto ciò si può passare alla disposizione delle megacelle e
delle standard cell. Di solito le megacelle sono poche (meno di una decina) e
quindi possono essere piazzate direttamente trascinandole col mouse sulla
regione “default”. Per le standard cell va fatto un discorso diverso visto che di
solito sono diverse centinaia, nel caso di HEPE97 infatti ci sono più di 3000
64
standard cell. L’algoritmo di placement dispone le celle nella regione scelta
dal progettista una accanto all’altra su più righe: una riga può contenere un
numero molto alto di standard cell e le varie righe sono separate fra loro da
uno spazio equivalente allo spessore di una riga, cioè all’altezza di una cella
(vedi fig. 2.20). Il modo in cui una cella è posizionata rispetto alle altre è
guidato dalla necessità di minimizzare la lunghezza dei collegamenti fra le
celle e la sovrapposizione fra i due strati metallici che realizzano le
connessioni. Perciò lo scopo dell’algoritmo è fare in modo che due celle che si
trovano vicine logicamente, cioè che sono direttamente collegate nello
schematic, siano vicine anche fisicamente. Per raggiungere questo obiettivo
l’algoritmo è basato sul simulated annealing: partendo da una temperatura
iniziale scelta dal progettista fra 0 e 1000 e facendola decrementare fino a 0 si
provano varie configurazioni possibili che minimizzano la funzione lunghezza
dei collegamenti accettando sempre una variazione della disposizione delle
celle che porta ad una diminuzione della lunghezza ma accettando con una
certa probabilità proporzionale alla temperatura anche una variazione che
porta ad un aumento della funzione da minimizzare. Questa tecnica è molto
usata per trovare un minimo assoluto evitando i minimi locali in cui potrebbe
cadere l’algoritmo. Vista la complessità dell’operazione da ripetere su
centinaia di celle l’operazione di placement può durare svariate ore tanto che
conviene lanciare il processo di annealing la sera e lasciarlo lavorare per tutta
la notte.
Fig. 2.20 : Disposizione delle celle l’una accanto all’altra.
2.11.3 Fase di collegamento delle celle (routing)
Alla fine della fase di placement i pad di I/O, le megacelle e le standard
cell sono posizionate sull’area del chip : non rimane altro da fare che passare
alla fase di routing nella quale vengono eseguiti tutti i collegamenti. Il primo
passo consiste nella creazione dei canali di collegamento all’interno dei quali
saranno gettate le piste : in pratica tutto lo spazio vuoto sul chip, ad esempio
65
fra un pad ed il pad adiacente, fra due righe di standard cell o fra una
megacella e una regione di standard cell, viene suddiviso in canali fisici per
ora vuoti entro i quali verranno realizzati tutti i collegamenti. La fase di
realizzazione di questi collegamenti, cioè la fase di routing vera e propria, è
suddivisa in due passi logici distinti chiamati global routing e detailed
routing. Il global routing consiste nell’attribuzione delle connessioni logiche
presenti nello schematic ai canali fisici appena creati. La creazione vera e
propria delle connessioni viene realizzata nella fase successiva del detailed
routing (routing dettagliato). Solo al termine di questo processo si perviene ad
una visione della struttura vera e propria del layout con tutti i collegamenti fra
le celle realizzati con i due strati metallici metallo1 e metallo2 come si vede in
fig. 2. 21 (il metallo 1 è quello più scuro e si trova ad un livello superiore).
Fig. 2.21 : Particolare di un layout completo
Solo a questo punto si può quindi sapere se si è giunti ad una
configurazione accettabile oppure bisogna ricominciare tutto il processo dalla
fase di placement. Può capitare ad esempio di avere sottodimensionato un
canale in modo tale che non riesca a contenere tutte le piste che vanno inserite
al suo interno : in questo caso il detailed routing provvede ad espandere la
larghezza del canale a scapito della struttura geometrica complessiva del chip,
che quindi si può ritrovare con molti “buchi”. Per questo e altri motivi il
processo di modellazione del layout può diventare molto lungo e faticoso.
66
Inoltre mentre la maggior parte dei collegamenti può essere realizzata
automaticamente dal global routing è fortemente consigliato eseguire il routing
di piste “critiche” come il clock, l’alimentazione e la massa a mano per
ottimizzare al massimo le prestazioni. Tale fase del lavoro porta via molto
tempo.
Giunti ad una configurazione accettabile del layout la prima cosa da fare
è l’estrazione delle capacità parassite dovute ai collegamenti metallici e alla
sovrapposizione fra i due strati metallo 1 e metallo 2. Un programma di nome
ES2capExtract provvede ad estrarre le capacità parassite per ogni segnale
all’interno della rete e riporta i risultati all’interno del file net.cap. Una volta
che si è in possesso di questo file occorre ripetere tutte le simulazioni logiche e
temporali con Verilog e Veritime per verificare che i ritardi ulteriori indotti da
queste capacità parassite non provochino problemi come la violazione di
alcuni vincoli temporali o come la comparsa di sovraccarichi che non
esistevano in una simulazione pre-layout. Infatti l’effetto duplice delle capacità
parassite è quello di aumentare i ritardi ed i carichi capacitivi da pilotare. In
presenza dell’uno o l’altro di questi problemi la cosa migliore è ricominciare
da capo la fase di generazione del layout: intervenire direttamente sul layout
per effettuare delle modifiche quali avvicinare due celle o aggiungere dei
buffer è invece alquanto pericoloso e fortemente sconsigliato in quanto è facile
introdurre degli errori ancora maggiori.
2.11.4 Verifica finale del progetto
Quando poi tutte queste verifiche e simulazioni vengono superate con
successo si può passare ai controlli finali, quelli che riguardano la correttezza
e l’effettiva funzionalità del layout. Questi ultimi controlli si chiamano :
• DRC (Design Rule Check) ;
• ERC (Electrical Rule Check) ;
• LVS (Layout Versus Schematic).
DRC controlla che siano rispettati tutti i parametri geometrici del layout
quali la larghezza delle piste, la distanza tra due piste o due piedini adiacenti,
le dimensioni di un contatto, confrontando i valori che trova sul layout con
tutte le specifiche della tecnologia CMOS 0.7 µm. In questo modo la fonderia
si cautela che il layout progettato sia effettivamente realizzabile fisicamente
con gli strumenti disponibili nella tecnologia corrente. Può capitare che DRC
dia dei problemi sulla larghezza di certe piste disegnate automaticamente dal
detailed routing senza l’intervento diretto del progettista : in questo caso
67
occorre ripercorrere dall’inizio la fase di routing sperando che il programma di
routing non sbagli più.
ERC si occupa di controllare che tutte le connessioni elettriche siano
rispettate in modo che non vi siano piste “floating”, cioè non collegate a
nessuna altra pista, e che non vi siano sovrapposizioni indesiderate fra i due
livelli metallici che possono portare ad eventuali cortocircuiti.
Per ultimo LVS verifica che la struttura fisica del layout con tutte le
porte logiche che contiene e le rispettive connessioni corrisponda esattamente
alla struttura logica dello schematic per evitare che vi possano essere stati
errori nella conversione: per fare questo LVS ricava la netlist sia dello
schematic sia del layout e le confronta fino a trovare una corrispondenza
completa.
2.12 Riflessioni finali
Alla fine di tutti questi passi e di questi innumerevoli controlli il
progettista può essere ragionevolmente confidente che una volta trasformato in
circuito integrato il proprio progetto possa funzionare e questa è la cosa più
importante.
Una volta poi che il circuito integrato è stato realizzato può iniziare la
fase di test e di collaudo per verificare la bontà dei risultati delle simulazioni
software fatte a priori. Superata anche questa fase il chip è pronto per essere
utilizzato. Penso che vedere funzionare perfettamente il chip sulla scheda per
cui è stato progettato sia una delle più grandi soddisfazioni a cui può ambire
colui che ha seguito tutte le fasi di progetto. Io ho avuto la fortuna di curare
tutte le fasi di progettazione del processore fuzzy dalla descrizione VHDL fino
al layout e spero di potere seguire anche il collaudo una volta che il chip
ritorni dalla fonderia. Nei grandi centri di sviluppo di circuiti integrati invece
una situazione del genere non capita quasi mai: dove ci sono molte persone
che lavorano ad uno stesso progetto ognuno si specializza in un determinato
settore, ad esempio c’è l’esperto in simulazioni temporali e l’esperto di
progettazione di layout: in questo contesto è molto probabile che l’addetto a
compiere una simulazione con Veritime non abbia la minima idea del
funzionamento globale del circuito che sta testando.
68