Il mio intento, scrivendo questo articolo, e' quello di fornire una conoscenza generale toccando i punti cruciali del mondo della progettazione degli ASIC ma nello stesso tempo senza entrare in approfondimenti.
Spero che la lettura sia interessante e piacevole, che il lettore al termine abbia soddisfatto la sua curiosita' e abbia acquisito un buon bagaglio di conoscenza sull'argomento.
Mi auspico di riuscire nell'intento poiche' un tale compito non e' facile vista la complessita' della materia in esame.
Chi e'
interessato ad una descrizione dettagliata ed esaustiva puo', partendo
da questo articolo, successivamente fare
riferimento
al seguente link riguardante un ottimo libro in inglese sull'argomento
"Application-Specific Integrated
Circuits
di Michael John e Sebastian Smith - Addison-Wesley Editore" dove potra'
soddisfare ogni curiosita' e dubbio
sulla
materia e dove ogni argomento e' trattato con molto dettaglio e rigore.
Da questo libro d'altronde ho preso spunto per scrivere l'articolo.
Il link a tale libro e' il seguente:
http://www-ee.eng.hawaii.edu/~msmith/ASICs/HTML/ASICs.htm
L'acronimo
ASIC sta per Application Specific Integrated Circuit cioe' un Circuito
Integrato per Applicazioni
Specifiche
ossia "Custom" cioe' personalizzato.
"Fare un ASIC" significa quindi realizzare un Circuito Integrato che realizzi esattamente un insieme di funzioni logiche che ci siamo prefissi di implementare ossia che risponda alle specifiche tecniche che lo descrivono.
Quindi l'applicazione di questi dispositivi e' indicata laddove la componentistica commerciale disponibile non consente l'ottenimento delle funzionalita' richieste dalla specifica implementazione o le prestazioni ad esso associate.
E' questa
la chiave del successo degli ASIC: un IC (Circuito Integrato) personalizzato
che integra al proprio interno
le funzioni
di più schede realizzate con tecnologie tradizionali e che, correttamente
inserito nel sistema, porta ad un incremento della qualità e ad
una riduzione della dimensione e dei costi del sistema stesso.
I vantaggi nel realizzare un ASIC sono quindi molteplici: dimensioni e pesi ridotti, diminuzione dei costi di produzione, riduzione dei consumi, migliori prestazioni in termini di funzionalità e velocità, aumento dell'affidabilità, non riproducibilità (segretezza del progetto), migliore qualità ed impiego di tecnologie avanzate.
Ecco spiegato quindi l'enorme successo e il grande sviluppo di questi dispositivi negli anni!
Ovviamente ci sono alcune situazioni nelle quali non e' appropriato utilizzare un IC personalizzato per ogni parte di un sistema microelettronico.
Se si
necessita di memorie molto grandi, ad esempio, e' ancora preferibile l'uso
di IC di memorie standard, ad esempio DRAM (dynamic random-access memory)
o SRAM (static random-access memory) congiuntamente con custom (personalizzato)
IC.
FIG.1 Un Circuito
Integrato(IC).
(a) Un pin-grid array
(PGA)
(b) Il silicon die
(dado di silicio) o chip vero e proprio e'solo parte di tutto il contenitore.
La Figura 1 mostra come e' fatto un IC (questo e' un PGA cioe' un Pin Grid Array mostrato nella sua parte inferiore. I piedini che si vedono infatti verranno inseriti nei fori di una PCB cioe' Printed Circuit Board ossia di un circuito stampato).
Un ASIC e' in genere incapsulato in un involucro ceramico o anche plastico.
Il dado di silicio o chip vero e proprio e' solo quello sotto il "coperchio" rappresentato nella figura 1.
Il resto e' occupato dalle linee che collegano i piedini agli ingressi e uscite del chip.
La dimensione del nostro "dado di silicio" puo' variare da pochi millimetri a qualche centimetro su un lato a seconda della complessita'.
La complessita' di un ASIC e' misurato dal numero di "gates" logici o dal numero di transistors che contiene al suo interno.
L'unita' di misura di un "gate equivalente" corrisponde a un NAND a due ingressi (il circuito che realizza la funzione logica booleana F = A * B).
Il numero di transistors equivalente a un gate dipende dalla tecnologia usata.
In genere un gate corrisponde a quattro transistors per cui da cio' si puo' risalire al numero di transistors che ci sono in un ASIC.
L'industria dei semiconduttori dai primi IC del 1970 fino ad oggi ha avuto una rapida evoluzione.
All'inizio, con la SSI (small-scale integration) cioe' la integrazione a piccola scala, i primi IC contenevano pochi (1 a 10) gates logici NAND or NOR.
Si e' poi passato alla MSI (medium-scale integration) cioe' la integrazione a media scala con cui si passa ad una maggiore complessita' di funzioni logiche integrate come i contatori e simili.
La LSI (large-scale integration) cioe' la integrazione a larga scala in cui ci sono funzioni logiche molto complesse come i primi microprocessori in un singolo chip.
L'era della VLSI (very large system integration) offre microprocessori molto complessi completi di cache memory e funzioni aritmetiche molto avanzate ed e' costituita da milioni di transistors in un singolo pezzo di silicio.
Con il progredire della tecnologia CMOS i transistors diventano sempre piu' piccoli e quindi il chip contiene un sempre piu' alto numero di gates.
Oggi infatti e' possibile realizzare i cosidetti "System On chip" ossia l'integrazione di interi sistemi in un singolo dispositivo ivi inclusi microprocessori, DSP, memorie RAM, PLL ed altre funzionalita' commercialmente disponibili sotto il termine generico di "Intellectual Properties".
Per dare un'idea della complessita' di questi oggetti basta far notare che possono contenere anche oltre 100 milioni di transistors, un valore simile a quello di un Processore Pentium di ultima generazione.
I primi IC utilizzavano la tecnologia bipolare cioe' la TTL (transistor-transistor logic) o la ECL (emitter-coupled logic piu' veloce ma anche con caratteristiche di maggior consumo).
La tecnologia MOS (metal-oxide-silicon transistor) anche se precedente alla bipolare era inizialmente piu' difficile da realizzare rispetto a quella bipolare.
Appena
questi problemi furono risolti, negli anni '70 questa tecnologia comincio'
a prendere piede ed a favorire il grande
sviluppo
degli IC.
La tecnologia
MOS (infatti divento' piu' semplice da produrre, aveva una maggiore densita'
di integrazione e consumava
una
minore potenza che l'equivalente bipolare).
Negli anni '80 la tecnologia MOS fu sostituita da quella CMOS (complementary MOS) che utilizzava in pratica due tipi di transistor uno di tipo NMOS (n-channel MOS) e l'altro di tipo PMOS (p-channel MOS).
Il principale vantaggio dei CMOS e' il minor consumo e la semplificazione nel processo di fabbricazione permettendo anche un maggior guadagno in termini di dimensione del chip.
Anche
se la tecnologia CMOS oggi e' quella dominante a causa del suo minor costo,
per alcuni tipi di applicazioni e'
usata
anche la tecnologia BiCMOS (una combinazione della bipolare con la CMOS)
la dove viene richiesta maggiori
tensioni
rispetto alla CMOS.
La BiCMOS viene quindi utilizzata nell'elettronica di potenza, automobili, circuiti per la telefonia.
Gli ICs (Integrated Circuit) cioe' i circuiti integrati sono fatti su un sottilissimo (poche centinaia di microns di spessore) wafer di silicio circolare contenente centinaia di dadi (chips).
I transistors e le connessioni metalliche sono costruite su molti strati (circa 10-20 strati) costruiti uno sopra l'altro.
Ogni strato viene costruito usando una maschera che permette di definire la disposizione dei transistors o le interconnessioni metalliche.
La prima mezza dozzina di strati definisce i transistors mentre l'ultima dozzina le connessioni metalliche tra i transistors.
Gli ASICs si distinguono in "full-custom ASIC" cioe' IC totalmente personalizzati, "semicustom ASIC" e "programmable ASIC".
Un esempio di "full-custom ASIC" e' un microprocessore.
In questo tipo di ASIC tutte le celle logiche sono completamente personalizzabili come pure il "layout" ossia la disposizione dei componenti del circuito e la loro interconnessione.
Questo permette al progettista di includere circuiti analogici, celle di memoria ottimizzate e cosi'via.
I "full-custom IC" sono i piu' complessi e versatili tipi di IC e quindi anche i piu' costosi da produrre e da progettare.
Il tempo necessario a produrre (non incluso il tempo di progettazione) e' di almeno otto settimane.
In questo caso il "designer" cioe' il progettista abbandona il tipico approccio di utilizzare celle logiche predefinite.
Questo avviene se non esistono celle di libreria per il nostro progetto o perche' non sono abbastanza veloci o perche' non abbastanza piccole o perche' consumano troppa potenza.
Noi possiamo aver necessita' di usare la tecnologia "full-custom" anche nel caso in cui la tecnologia ASIC e' molto nuova o troppo specializzata per cui non esistono celle di libreria disponibili.
La tecnologia
piu' usata e' comunque la "semicustom ASIC" per la quale tutte le celle
logiche sono predefinite e quasi
tutte
le maschere per gli strati sono personalizzabili. Chiaramente in questo
caso i costi di produzione sono piu'
bassi
e la progettazione risulta facilitata.
Ci sono due tipi di "semicustom ASIC": la "standard-cell-based ASIC" e il "gate-array-based ASIC".
La "standard-cell-based ASIC" (CBIC) usa celle logiche predefinite (ad esempio AND gates, OR gates, multiplexers, flip-flops) conosciute come celle standard (SC).
Vengono definite le "standard-cell areas" che sono costituite da SC disposte su righe come un muro e' formato da mattoni.
Il progettista ASIC definisce il piazzamento delle SC all'interno del IC e le sue interconnessioni.
Tuttavia le SC possono essere piazzate ovunque nel silicio e questo significa che le maschere sono personalizzate e sono uniche per ogni particolare cliente.
Il vantaggio della CBIC e' che il progettista risparmia tempo, denaro e riduce i rischi usando una predisegnata, predefinita libreria di SC.
C'e' da dire comunque che ogni SC puo' essere ottimizzata individualmente.
Durante il disegno di una SC di libreria infatti ogni transistor in ogni SC puo' essere scelto in modo da ottimizzare la velocita' o minimizzare l'area a seconda selle esigenze.
Lo svantaggio di tale tecnologia e' il tempo e/o il costo di designare le nuove SC di libreria e il tempo necessario a fabbricare tutti gli strati dell'ASIC per ogni nuovo design.
Nel "gate-array-based ASIC" i transistors invece sono predefiniti nel wafer del silicio. Un insieme predefinito di transistors e' combinato in modo opportuno in modo da formare il "base array" cioe' l'array base.
Il piu' piccolo elemento che viene replicato per formare l'array base e' chiamato la "base cell" cioe' la cella base (chiamato anche cella primitiva).
Nel GA solo gli strati di metallo a livello piu' alto, i quali definiscono l'interconnessione tra transistors, sono definite dai designer usando maschere personalizzate.
Il progettista sceglie quindi tra una libreria di celle logiche predisegnate e precaratterizzate.
Queste celle logiche sono spesso chiamate "macros". La ragione di questo e' che la costituzione della cella base e' la stessa per ogni cella logica e solo le interconnessioni (all'interno della cella e tra celle) sono personalizzate.
Il costo di fabbricazione e' quindi inferiore rispetto ad una SC o un full-custom ASIC come pure il costo di progettazione.
Uno degli svantaggi dei GA e' la struttura predefinita e quindi meno flessibile.
Questo in alcuni casi puo' creare difficolta' come ad esempio nel caso di implementazione di memorie che risulta difficile e inefficiente.
I "Programmable logic devices" sono IC disponibili in configurazioni standard da un catalogo e sono venduti in grossi volumi a vari clienti.
Questo perche' questi dispositivi possono essere di volta in volta programmmati o configurati in modo da personalizzare il nostro progetto.
Le PLDs sono costituite da una matrice di macrocelle logiche costituite da una parte logica combinatoria programmabile seguita da un elemento di memoria, latch o flip flop.
Le piu'
importanti caratteristiche delle PLDs sono che sono dispositivi preconfezionati
e quindi non personalizzabili, poi
sono
caratterizzati da una fase di progettazione piu' rapida e una assenza della
fase di fabbricazione.
I PLDs utilizzano diverse tecnologie per permettere di programmare il nostro dispositivo. Il piu' semplice tipo e' la PROM (read-only memory) programmabile una sola volta, poi la EPROM memoria riprogrammabile ma per cancellarla necessita di esposizione a raggi ultravioletti, la EEPROM riprogrammabile ma cancellabile elettricamente.
Un Gate Array programmabile un po' piu' complesso delle PLDs e' l'FPGA (Field-Programmable Gate Array).
Ci sono veramente poche differenze tra un FPGA e una PLD.
Un FPGA e' generalmente piu' grande e piu' complessa di una PLD.
Le caratteristiche principali di una FPGA sono la presenza di un metodo per la configurazione delle celle logiche di base e le sue interconnessioni, il "core" cioe' il cuore, la parte interna del device e' costituita da una matrice regolare di celle logiche di base programmabili che possono implementare sia logica combinatoria che sequenziale (flip-flops), una matrice di interconnessioni tra le celle logiche di base e delle celle di I/O (ingresso/uscita) programmabile che collegano il core con l'esterno.
I Gate Array programmabili rispetto ai GA tradizionali hanno un minore tempo di progettazione e di sviluppo, una assenza di una fase di fabbricazione (assenza di costo di fabbricazione), una maggiore flessibilita' perche' basta cambiare il programma nella PROM per cambiare il progetto e quindi in generale un minore costo di sviluppo.
Come contropartita pero' hanno prestazioni inferiori agli ASIC ed una minore integrazione, inoltre per grossi volumi di produzione il costo unitario di una FPGA e' piu' alto rispetto ad un ASIC.
Quindi la scelta tra l'uno e l'altro e' dettata, come si intuisce bene, dalla particolare applicazione.
Il flusso di progettazione di un ASIC e' la sequenza di passi da seguire per realizzare un integrato.
I passi sono mostrati nella figura sottostante e descritti di seguito.
FIG.2 FLUSSO DI PROGETTAZIONE DELL'ASIC
1. Design
entry. Si inserisce il design in un sistema di progettazione di ASIC
o usando un HDL ossia un linguaggio
di descrizione dell'hardware (VHDL o Verilog) oppure utilizzando una descrizione
tramite schematico.
2. Logic
synthesis cioe' la sintesi logica. A partire dal HDL e usando un tool di
sintesi si genera una netlist cioe'
una descrizione delle celle logiche e le loro interconnessioni.
3. System partitioning cioe' partizionamento del sistema. Si suddivide l'ASIC in blocchi piu' piccoli.
4. Prelayout
simulation ossia simulazione di prelayout. Si effettua una prima simulazione
del progetto per verificare
il corretto funzionamento del nostro sistema. Questa simulazione non tiene
conto dei ritardi di celle e delle net
di interconnessioni. E' solo una verifica logica.
5. Floorplanning. Si posiziona fisicamente i vari blocchi della nostra netlist all'interno del nostro chip.
6. Placement. Si decidono le locazioni delle celle logiche all'interno di ogni blocco.
7. Routing. Si effettuano le interconnessioni tra celle e blocchi.
8. Extraction.
Si determinano le resistenze e capacita' delle interconnessioni per il
calcolo dei ritardi di propagazione
introdotte da queste.
9. Postlayout
simulation. Si controlla che il nostro progetto si comporta ancora correttamente
dopo avere introdotto
i carichi delle interconnessioni che introducono ritardi.
I passi 1-4 fanno parte del disegno logico e quelli 5-9 di quello fisico.
Ci sono alcune aree di sovrapposizione tra le due fasi.
Ad esempio il system partitioning puo' essere considerato sia logico che fisico.
In altre
parole quando effettuiamo questa fase dobbiamo considerare fattori sia
logici che fisici.
Lo scopo della fase di "Design Entry" e' quello di descrivere un sistema microelettronico tramite un EDA (Electronic-Design Automation) tools ossia un insieme di strumenti computerizzati che permettono di descrivere questo sistema.
Un tipo di design entry e' lo schematic entry chiamato anche schematic capture.
Questo consiste nel fare disegni che rappresentano funzioni logiche e interconnetterle tra di loro.
Il circuito di un ASIC e' quindi rappresentato un po' nello stesso modo un architetto disegna una costruzione.
Lo schematico
e' quindi un disegno, un formato quindi facile da capire e usare per noi
ma il computer invece ha bisogno di
lavorare
con una versione ASCII o binaria del nostro schematico che noi chiameremo
"netlist".
Quindi il programma che gestisce lo schematic entry produce una netlist cioe' una descrizione di tutti i componenti e le loro interconnessioni.
Fino a poco tempo fa' lo schematic entry veniva molto usato. Ma man mano che la complessita' dei sistemi microelettronici diventava sempre piu' grande si sono andati difondendo altri tipi di design entry come i linguaggi di descrizione dell'hardware (HDL) che sono simili ai linguaggi di programmazione per intenderci ma effettuano una descrizione di un circuito elettronico.
Questi linguaggi sono il VHDL e il Verilog HDL.
Il U.S. Department of Defense (DoD) ha sviluppato il VHDL (VHSIC hardware description language) come parte del VHSIC (very high-speed IC) programma agli inizi del 1980.
Questa compagnia senti' per prima l'esigenza di qualcosa di piu' dello schematic entry per descrivere ASIC molto grandi e cosi' propose il linguaggio di descrizione dell'hardware.
Cosi
il VHDL divento' uno standard utilizzato per documentazione, design entry,
simulazione e mezzo di verifica
dell'ASIC.
Il VHDL e' stato subito accettato all'inizio come descrizione e documentazione e poi per il design entry, la simulazione e la sintesi.
Ecco qui di seguito un esempio di modello VHDL: un Contatore.
Questo modello descrive un "black box" ( scatola nera) che contiene un generatore di clock a 50 MHZ e un contatore.
Il contatore si incrementa sul fronte negativo del clock contando da zero a sette e poi iniziando di nuovo da zero.
Il modello contiene processi separati che vengono eseguiti nello stesso tempo.
Questo modello di processi concorrenti e' praticamente la principale differenza tra il VHDL (che descrive un circuito elettronico) e i linguaggi di programmazione come il C in cui l'esecuzione di ogni processo avviene in modo sequenziale.
Le frasi
che seguono i "--" non fanno parte del VHDL ma sono solo dei commenti che
rendono piu' leggibile il VHDL.
entity Counter_1 is end; -- declare a "black box" called Counter_1
library STD; use STD.TEXTIO.all; -- we need this library to print architectture Behave_1 of Counter_1 is
-- describe the "black
box"
-- declare a signal
for the clock, type BIT, initial value '0'
signal Clock : BIT := '0';
-- declare a signal
for the count, type INTEGER, initial value 0
signal Count : INTEGER := 0;
begin
process begin -- process to generate the clock
wait for 10 ns; -- a delay of 10 ns is half the clock cycle
Clock <= not Clock;
if (now > 340 ns) then wait; end if; -- stop after 340 ns
end process;
-- process to do the
counting, runs concurrently with other processes
process begin
-- wait here until
the clock goes from 1 to 0
wait until (Clock = '0');
-- now handle the
counting
if (Count = 7) then Count <= 0;
else Count <= Count + 1;
end if;
end process;
process (Count) variable L: LINE; begin -- process to print
write(L, now); write(L, STRING'(" Count="));
write(L, Count); writeline(output, L);
end process;
end;
Gateway Design Automation sviluppo' il Verilog come linguaggio di simulazione.
Cadence rilevo' la Gateway nel 1989 e dopo alcuni studi rese il Verilog di dominio pubblico.
Open verilog International (OVI) fu successivamente creata per sviluppare lo standard del linguaggio Verilog vero e proprio.
Verilog e' un linguaggio molto semplice e immediato da imparare specialmente se si e' familiari con il C.
E' inoltre piu' orientato alla descrizione dei circuiti elettronici e la sua sintassi e' semplice.
VHDL al contrario e' adatto anche alla descrizione di sistemi qualsiasi e piu' generali ma la sua sintassi e' piu' complessa.
Ecco lo stesso esempio di prima di un "black box" che contiene un generatore di clock a 50 MHZ e un contatore da zero a sette e poi inizia di nuovo da zero e cosi via implementato con un modello Verilog.
`timescale 1ns/1ns
// Set the units of time to be nanoseconds.
module counter;
reg clock;
// Declare a reg data type for the clock.
integer count;
// Declare an integer data type for the count.
initial // Initialize
things; this executes once at t=0.
begin
clock = 0; count = 0; // Initialize signals.
#340 $finish; // Finish after 340 time ticks.
end
/* An always statement
to generate the clock; only one statement follows the always so we don't
need a begin and an end. */
always #10 clock
= ~ clock; // Delay (10ns) is set to half the clock cycle.
/* An always statement
to do the counting; this executes at the same time (concurrently) as the
preceding always statement. */
always
begin // Wait here until the clock goes from 1 to 0.
@ (negedge clock);
// Now handle the counting.
if (count == 7)
count = 0;
else count = count + 1;
$display("time = ",$time," count = ", count);
end
endmodule
Il progettista quando crea un modello comportamentale in HDL usa un "design entry" grafico o testuale che non contiene nessun riferimento a celle logiche.
Insieme alla descrizione di un modello HDL possiamo usare diagrammi di stato, descrizioni grafiche, tavole della verita', tabelle RAM/ROM e schematici a livello di porte logiche.
Una volta il modello comportamentale HDL e' pronto, due cose sono richieste per procedere: un sintetizzatore logico (software e documentazione) e una libreria di celle logiche (ad esempio celle logiche NAND e cosi' via) quest'ultima e' chiamata una "target library".
Questi due elementi permettono quindi di passare da una descrizione di un circuito logico ad una descrizione fatta da porte logiche e loro interconnessioni. La maggior parte delle societa' che realizzano i software di sintesi realizzano solo questo come pure la maggior parte dei produttori di ASIC (gli ASIC vendor) forniscono solo librerie di celle.
A questo punto il modello comportamentale e' simulato per controllare che il suo comportamento e' quello atteso ossia che le nostre specifiche vengono rispettate. Poi si usa il sintetizzatore logico per generare la netlist, un modello strutturale, il quale contiene solo riferimenti a celle logiche con un formato che puo' essere ad esempio l'EDIF molto usato o il Verilog.
La netlist e' quindi simulata di nuovo e comparata con i risultati ottenuti con la simulazione del modello HDL.
Qui di
seguito e' riportato un esempio di sintesi di un Comparatore/Mux descritto
sia con schematico che con un modello
comportamentale
Verilog HDL e il risultato dopo la sintesi senza ottimizzazione e poi con
relativa ottimizzazione.
// comp_mux.v
module comp_mux(a,
b, outp);
output [2:0] outp;
function [2:0] compare;
input [2:0] ina, inb;
begin
if (ina <= inb)
compare = ina;
else compare = inb;
end
endfunction
assign outp = compare(a,
b);
endmodule
`timescale 1ns / 10ps
module comp_mux_u (a, b, outp);
input [2:0] a; input [2:0] b;
output [2:0] outp;
supply1 VDD; supply0 VSS;
in01d0 u2 (.I(b[1]), .ZN(u2_ZN));
nd02d0 u3 (.A1(a[1]), .A2(u2_ZN), .ZN(u3_ZN));
in01d0 u4 (.I(a[1]), .ZN(u4_ZN));
nd02d0 u5 (.A1(u4_ZN), .A2(b[1]), .ZN(u5_ZN));
in01d0 u6 (.I(a[0]), .ZN(u6_ZN));
nd02d0 u7 (.A1(u6_ZN), .A2(u3_ZN), .ZN(u7_ZN));
nd02d0 u8 (.A1(b[0]), .A2(u3_ZN), .ZN(u8_ZN));
nd03d0 u9 (.A1(u5_ZN), .A2(u7_ZN), .A3(u8_ZN), .ZN(u9_ZN));
in01d0 u10 (.I(a[2]), .ZN(u10_ZN));
nd02d0 u11 (.A1(u10_ZN), .A2(u9_ZN), .ZN(u11_ZN));
nd02d0 u12 (.A1(b[2]), .A2(u9_ZN), .ZN(u12_ZN));
nd02d0 u13 (.A1(u10_ZN), .A2(b[2]), .ZN(u13_ZN));
nd03d0 u14 (.A1(u11_ZN), .A2(u12_ZN), .A3(u13_ZN), .ZN(u14_ZN));
nd02d0 u15 (.A1(a[2]), .A2(u14_ZN), .ZN(u15_ZN));
in01d0 u16 (.I(u14_ZN), .ZN(u16_ZN));
nd02d0 u17 (.A1(b[2]), .A2(u16_ZN), .ZN(u17_ZN));
nd02d0 u18 (.A1(u15_ZN), .A2(u17_ZN), .ZN(outp[2]));
nd02d0 u19 (.A1(a[1]), .A2(u14_ZN), .ZN(u19_ZN));
nd02d0 u20 (.A1(b[1]), .A2(u16_ZN), .ZN(u20_ZN));
nd02d0 u21 (.A1(u19_ZN), .A2(u20_ZN), .ZN(outp[1]));
nd02d0 u22 (.A1(a[0]), .A2(u14_ZN), .ZN(u22_ZN));
nd02d0 u23 (.A1(b[0]), .A2(u16_ZN), .ZN(u23_ZN));
nd02d0 u24 (.A1(u22_ZN), .A2(u23_ZN), .ZN(outp[0]));
endmodule
FIG.4
- Il Comparatore/Mux dopo la sintesi logicca ma prima dell'ottimizzazione.
Questa
figura mostra la netlist strutturale in formato Verilog, comp_mux_u.v e
lo schematico che ne deriva.
`timescale 1ns / 10ps
module comp_mux_o (a, b, outp);
input [2:0] a; input [2:0] b;
output [2:0] outp;
supply1 VDD; supply0 VSS;
in01d0 B1_i1 (.I(a[2]), .ZN(B1_i1_ZN));
in01d0 B1_i2 (.I(b[1]), .ZN(B1_i2_ZN));
oa01d1 B1_i3 (.A1(a[0]), .A2(B1_i4_ZN), .B1(B1_i2_ZN), .B2(a[1]), .ZN(B1_i3_Z;
fn05d1 B1_i4 (.A1(a[1]), .B1(b[1]), .ZN(B1_i4_ZN));
fn02d1 B1_i5 (.A(B1_i3_ZN), .B(B1_i1_ZN), .C(b[2]), .ZN(B1_i5_ZN));
mx21d1 B1_i6 (.I0(a[0]), .I1(b[0]), .S(B1_i5_ZN), .Z(outp[0]));
mx21d1 B1_i7 (.I0(a[1]), .I1(b[1]), .S(B1_i5_ZN), .Z(outp[1]));
mx21d1 B1_i8 (.I0(a[2]), .I1(b[2]), .S(B1_i5_ZN), .Z(outp[2]));
endmodule
FIG.5 - Il comparatore/Mux dopo la sintesi e l'ottimizzazione logica.
La figura mostra la netlist strutturale, comp_mux_o.v e lo schematico che ne deriva.
Normalmente viene utilizzato uno "script" per mandare in esecuzione il sintetizzatore logico.
Uno script e' un file di testo che indirizza il nostro tool ad eseguire una serie di comandi di sintesi.
La FIG.4 mostra una netlist strutturale, comp_mux_u.v, e lo schematico derivato dopo la sintesi logica ma prima della ottimizzazione logica.
Questo schematico derivato dalla netlist e' creato da un software a partire dalla netlist (e' proprio l'opposto di quello che avviene quando si parte da uno schematico fatto a mano!).
La FIG.5 mostra invece la netlist strutturale, comp_mux_o.v, e lo schematico derivato dopo la ottimizzazione logica.
Quindi la sintesi e' costituita da due fasi: la sintesi logica e l'ottimizzazione.
Quindi il nostro sintetizzatore logico e' costituito da vari programmi ognuno dei quali e' specializzato a svolgere una certa funzione.
I passi seguiti sono: analisi della descrizione HDL, traslazione (o elaborazione) del HDL ad una struttura di dati.
Questa struttura di dati e' poi convertita ad una rete di celle logiche generiche.
Ad esempio la rete di FIG.4 usa porte NAND (a 3 o piu' ingressi) e inverters.
Questa struttura e' indipendente dalla tecnologia poiche' ogni libreria tecnologica contiene questo tipo di porte logiche.
Il risultato dell'ottimizzazione logica e' ancora una struttura "technology-indipendent".
Il passo finale e' poi il "logic mapping" ossia il sintetizzatore mappa la logica ottimizzata ad una libreria logica specifica della tecnologia utilizzata.
Simulare significa controllare il comportamento logico del circuito che abbiamo progettato applicando degli stimoli agli ingressi e andando a vedere se il comportamento delle uscite e' quello atteso.
Possiamo distinguere i seguenti diversi modi di simulazione:
Questa
lista e' ordinata da un tipo di simulazione ad alto livello (piu' astratta
e generale) a quella a piu' basso livello (piu' realistica e dettagliata).
Passando dalla simulazione ad alto livello a quella a piu' basso livello, le simulazioni diventano sempre piu' accurate ma man mano piu' complesse ed impiegano molto tempo macchina.
Nella
"behavioural simulation" cioe' simulazione comportamentale si considera
il nostro sistema come costituito da
"black
box" cioe' grandi blocchi di cui non si conosce la costituzione interna
ma lo si considera soltanto da un punto
di vista
dei suoi ingressi e uscite.
La "functional
simulation" ossia simulazione funzionale invece non tiene conto dei tempi
di propagazione dei segnali
ma considera
dei valori fissi ed unitari per i ritardi (ad esempio 1 ns) di ogni porta
logica.
Una volta
stabilito che il nostro sistema si comporta correttamente dopo la verifica
tramite questi due tipi di
simulazione,
bisogna controllarlo tenendo conto delle sue prestazioni in termini di
tempo ossia considerando i ritardi
reali
di propagazione delle porte logiche e delle net di interconnessione.
Un circuito infatti puo' funzionare benissimo da un punto di vista logico ma poi nella pratica funziona in modo anomalo quando andiamo a considerare i ritardi di propagazione dei segnali.
Questo tipo di simulazione e' molto complessa in quanto tratta una quantita' molto grande di dati.
Inoltre piu' il nostro ASIC e' grande e piu' la situazione e' critica.
Per ASIC di qualche milione di gates sono infatti necessari elaboratori molto potenti e la simulazione puo' durare anche molte ore o giorni.
Per questo a volte si preferisce utilizzare, in luogo della timing simulation o simulazione a "gate level", la "timing analysis" unita alla "verifica formale".
Questa combinazione di verifica sostituisce a tutti gli effetti la timing simulation ed e' piu' veloce.
La timing
analysis analizza il comportamento del circuito da un punto di vista statico
calcolando i ritardi di ogni
cammino
tra due successivi flip-flops o tra un ingresso e un flip-flop o tra un
flip-flop e un uscita.
La verifica formale controlla invece che ci sia corrispondenza logica tra la descrizione HDL ed il circuito reale costituito da porte logiche.
La simulazione e' utilizzata anche durante le differenti fasi del flusso di progettazione di un ASIC.
La simulazione di prelayout (ossia prima che il nostro circuito sia piazzato fisicamente all'interno del nostro ASIC) include il ritardo delle celle logiche ma non delle net di interconnessioni.
Questo perche' una stima delle capacita' delle net (che causano il ritardo di propagazione) puo' essere incluso dopo aver completato la sintesi logica ma solo dopo l'implementazione fisica all'interno dell'ASIC il vendor potra' fornirci i ritardi reali dovuti alle capacita' e alla lunghezza delle net.
Durante la fabbricazione i nostri ASIC sono testati in due fasi utilizzando i test di produzione.
La prima fase consiste nel test sul wafer vero e proprio.
I nostri "die" di silicio infatti vengono realizzati non uno per volta ma su dei wafer di silicio in cui gli ASIC sono disposti a matrice.
Ogni wafer e' testato, utilizzando un array di probe che si inseriscono direttamente sui nostri dadi, uno per volta.
Il tester di produzione applica agli ingressi del dado segnali generati da un programma di test e misura la risposta del test.
Un programma di test genera spesso centinaia o migliaia di differenti vettori di test applicati ad una frequenza di parecchi Megahertz per centinaia di millisecondi.
I chip che falliscono il test sono immediatamente marchiati.
Il produttore (o ASIC vendor) o il progettista o entrambi sviluppano il programma di test.
Questo tipo di test di produzione e' volto soltanto alla rilevazione dei difetti di fabbricazione del chip e non a problemi funzionali o di progettazione.
Tramite
una seghetta con diamante i dadi vengono separati ed un secondo test finale
viene fatto (in genere con gli stessi
vettori
di test) prima di inviare i chip al cliente.
Una volta
giunto al cliente l'ASIC viene inserito su una printed-circuit board (PCB
o board) insieme ad altri componenti
e viene
cosi testato dal punto di vista funzionale.
Se ci sono molti malfunzionamenti su diverse board di test allora il problema e' molto probabilmente dovuto al chip difettoso per cui questi vengono rinviati all'ASIC vendor che ha sofisticati sistemi di analisi e quindi puo' risalire al motivo del guasto. Se i test di produzione sono adeguati, i guasti sono spesso dovuti ai processi di saldatura, a danni causati da scariche elettrostatiche o ad altri problemi di interfacciamento tra la board di test e il chip.
Se il problema invece e' dovuto a difetti di fabbricazione allora puo' significare che il programma di test puo' essere inadeguato.
Come possiamo intuire la diagnosi e i guasti rilevati a livello di test di board sono molto costosi.
Se i difetti poi vengono rilevati piu' tardi ancora e cioe' al livello di sistema questi chiaramente sono ancora piu' costosi.
Gli ASIC programmabili (FPGA) sono un caso speciale.
Ogni ASIC programmabile e' testato al punto che il produttore puo' garantire con un alto grado di confidenza che questo e' privo di difetti di fabbricazione.
Il test di produzione e' piu' facile per alcuni tipi di architettura di ASIC programmabile che per altri.
Nelle tecnologie degli ASIC riprogrammabili il produttore puo' testare le sue caratteristiche di programmabilita' mentre nelle tecnologie "antifuse" (cioe' quelle programmabili una volta sola) questo non e' possibile.
Un simile ASIC e' testato nello stesso modo di ogni altro ASIC tradizionale.
Gli ASIC programmabili in generale hanno anche test, difetti e problemi di fabbricazione simili a tutti gli altri membri della famiglia degli ASIC.
Quando
un architetto pianifica il progetto di costruzione di una citta', decide
il numero, il tipo e la dimensione delle
costruzioni.
Quindi progetta ogni costruzione considerando il posizionamento delle stanze al suo interno.
Poi il costruttore realizza la costruzione seguendo il design dell'architetto e tutta la parte dell'impiantistica elettrica viene poi effettuata per ultimo.
Allo stesso modo il "physical design" cioe' l'implementazione fisica di un ASIC e' normalmente diviso in "system partitioning", "floorplanning", "placement" and "routing".
Riferendoci all'analogia precedente un sistema microelettronico e' la citta' e gli ASIC sono le costruzioni.
Il "system partitioning" corrisponde alla pianificazione della citta', il "floorplanning" e' il lavoro di posizionamento delle stanze all'interno effettuato dall'architetto, il "placement" o piazzamento e' realizzato dal costruttore e infine il "routing" corrisponde all'installazione dell'impianto elettrico.
FIG.6 - Parte dell'ASIC
design flow raffigurante il "physical design".
Sono mostrate le fasi di system partitioning, floorplanning, placement
e routing.
La FIG.6 mostra parte del flusso di progettazione di un ASIC (omettando in questa fase la simulazione, test ed altre fasi del "logical design" gia' illustrate in altri punti di questo articolo.
Alcune fasi della FIG.6 potrebbero essere effettuate in un ordine diverso da quello mostrato.
Ad esempio noi potremmo, dipendentemente dalla dimensione del sistema, effettuare prima il partizionamento e dopo la fase di "design entry" o sintesi.
Quindi per prima cosa dobbiamo effettuare un partizionamento del sistema microelettronico per dividerlo in piu' ASICs.
Nella
fase successiva di "floorplanning" noi stimiamo le dimensioni e definiamo
le iniziali posizioni relative dei vari blocchi
funzionali
di cui e' costituito il nostro ASIC.
Nello stesso tempo allochiamo dello spazio per il segnale di clock e per le nets di alimentazione e decidiamo sull'allocazione degli I/O (ingressi/uscite) e dei "power" pads.
La fase di "placement" ossia piazzamento definisce la locazione delle celle logiche all'interno dei nostri blocchi predispone dello spazio per l'interconnessione delle celle logiche stesse.
Il "placement" per la progettazione di un "gate array" o una "standard cell" assegna ad ogni cella logica una posizione in una determinata riga.
Per un FPGA invece il "placement" sceglie quali tra le risorse logiche fisse del chip debbono essere usate per quella determinata cella logica.
Una volta effettuata la fase di "floorplanning" e "placement" e' arrivato il momento di fare le connessioni tramite il routing.
Il "routing" e' quindi la fase del design che si occupa della interconnessione tra le celle logiche tramite le nets.
Il "routing" e' una parte molto delicata e difficile del "physical design" perche', come si puo' intuire, va ad impattare sui ritardi delle nets.
Percio' viene suddiviso in due fasi il "routing" globale e quello locale.
Il "routing"
globale determina le interconnessioni tra le celle logiche piazzate e i
blocchi logici cioe' in questa fase
vengono
determinate solo le connessioni principali.
Nella fase successiva di "routing" locale, che e' quindi la fase piu' dettagliata e particolareggiata, vengono effettuate le connessioni delle celle logiche con le interconnessioni principali.
Walter
Di Iullo
Hardware
Design Engineer Specialist
Email:
diiullo@jumpy.it