INTRODUZIONE ALLA PROGETTAZIONE DEGLI ASIC  di Walter Di Iullo


PREMESSA

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
 


COS'E' UN ASIC?

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.
 


COM'E' FATTO UN ASIC

 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.


TECNOLOGIA DEGLI ASIC E SUA EVOLUZIONE NEL TEMPO

Prima di vedere come fare e quindi descrivere tutti i passi da seguire per realizzare un progetto di un IC personalizzato, vediamo brevemente di descrivere la tecnologia utilizzata e la loro evoluzione nel tempo.

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.


TIPI DI ASICs

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.


FLUSSO DI PROGETTAZIONE DEGLI ASIC

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.
 


DESIGN ENTRY

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.


VHDL

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;
 


VERILOG

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
 


LOGIC SYNTHESIS

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




FIG.3 Schematico del Comparatore/Mux e Verilog HDL design entry

   `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.


LA SIMULAZIONE

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.


IL TEST

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.


PHYSICAL DESIGN

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.



Note sull'Autore:

Walter Di Iullo
Hardware Design Engineer Specialist
Email: diiullo@jumpy.it