POLITECNICO DI TORINO III Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica Tesi di Laurea Generazione automatica di march test per memorie SRAM Utilizzo di un algoritmo genetico per la generazione di march test a partire da informazioni di layout Relatori: prof. Paolo Prinetto prof. Alfredo Benso ing. Stefano Di Carlo Candidato: Alberto Scionti Luglio 2007 Indice 1 Introduzione 1.1 Gli algoritmi genetici per il design, layout e test di circuiti VLSI . . . 1.2 Obiettivo del lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 4 2 Memorie 2.1 Architettura di un circuito SRAM . . 2.2 Matrice di memoria . . . . . . . . . . 2.2.1 Cella di memoria statica . . . 2.3 Circuito di precarica . . . . . . . . . 2.4 Address decoding . . . . . . . . . . . 2.4.1 Struttura dell’address decoder 2.4.2 Selezione delle colonne . . . . 2.5 Sense amplifier . . . . . . . . . . . . 2.6 Write driver . . . . . . . . . . . . . . 2.7 Modello sperimentale di memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7 8 9 14 15 16 17 17 19 21 3 Algoritmi genetici 3.1 Struttura di un AG . . . . . 3.2 Selezione . . . . . . . . . . . 3.3 Crossover . . . . . . . . . . 3.4 Mutazione . . . . . . . . . . 3.5 Inversione . . . . . . . . . . 3.6 Elementi teorici . . . . . . . 3.6.1 Teoria degli schemi . 3.6.2 N-point crossover . . 3.7 Adattamento dei parametri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 28 30 32 34 35 36 38 41 43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Modelli di guasto e algoritmi di collaudo 45 4.1 Modelli di guasto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.2 Classificazione delle primitive di guasto . . . . . . . . . . . . . . . . . 48 4.2.1 Guasti di natura statica . . . . . . . . . . . . . . . . . . . . . 50 2 4.3 4.4 4.2.2 Guasti di natura dinamica . . . . . . . . . . . . . . . . . . . . 52 Pattern di collaudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 March test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 5 Generazione automatica di march test 5.1 Architettura dello strumento per la generazione di march test 5.2 Codifica della soluzione . . . . . . . . . . . . . . . . . . . . . . 5.3 Indirizzamento delle celle di memoria . . . . . . . . . . . . . . 5.3.1 Address mode e address order . . . . . . . . . . . . . . 5.4 Algoritmo di generazione dei march test . . . . . . . . . . . . 5.5 Funzione di fitness . . . . . . . . . . . . . . . . . . . . . . . . 5.5.1 La funzione di valutazione . . . . . . . . . . . . . . . . 5.5.2 Calcolo della fitness . . . . . . . . . . . . . . . . . . . . 5.6 Operatori genetici e funzioni specifiche . . . . . . . . . . . . . 5.6.1 Validazione della popolazione . . . . . . . . . . . . . . 5.6.2 Interfacciamento con il simulatore . . . . . . . . . . . . 5.6.3 Incremento della lunghezza delle sequenze di test . . . 5.6.4 Condizione terminale . . . . . . . . . . . . . . . . . . . 5.7 Interfaccia utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 56 58 60 61 62 63 63 65 67 67 69 74 75 80 6 Caso di studio 6.1 Difetti nella matrice di memoria 6.1.1 Analisi dei difetti . . . . 6.1.2 Parametri di ingresso . . 6.2 Generazione di march test . . . 6.2.1 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . 83 83 84 86 87 94 . . . . 96 96 97 98 99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Modello sperimentale di memoria A.1 Modulo circuitale SRAM con matrice 3x3 . A.2 Cella statica . . . . . . . . . . . . . . . . . A.3 Circuito di precarica . . . . . . . . . . . . A.4 Porte logiche . . . . . . . . . . . . . . . . Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 3 Capitolo 1 Introduzione La disponibilità di nuove tecnologie di fabbricazione permette oggi di realizzare sistemi integrati su un singolo circuito digitale (system on chip) dotati di tutti i componenti e le funzioni che in passato erano disponibili a livello di piastra. Le memorie sono i moduli con la più alta densità di transistor presenti su un circuito integrato digitale, e negli attuali system on chip la maggior parte dell’area a disposizione sul silicio viene impiegata per la loro realizzazione. La Semiconductor Industry Association indica che entro il 2015 l’area dedicata alla realizzazione di dispositivi di memoria coprirà circa il 90% - 94% dell’area totale a disposizione sul circuito integrato [1]. Attualmente è possibile trovare circuiti digitali con decine di dispositivi di memoria che differiscono tra loro per dimensioni, tecnologia, protocolli di accesso e temporizzazioni. 1.1 Gli algoritmi genetici per il design, layout e test di circuiti VLSI Data la crescente complessità dei circuiti digitali, la loro progettazione e verifica richiede l’utilizzo di strumenti EDA (Electronic Design Automation) efficienti, in grado di agevolarne lo sviluppo. Molti degli strumenti attuali consentono di assistere il progettista nelle diverse fasi del processo di design, in modo da consentire lo sviluppo del circuito in tempi rapidi. Questi strumenti infatti, sono in grado di svolgere automaticamente diversi compiti complessi quali, ad esempio, la generazione del layout e il calcolo del routing per i dispositivi presenti sul circuito. In altri casi 1 1 – Introduzione hanno un intervento limitato e lasciano le decisioni critiche al progettista, come nel caso dello sviluppo di circuiti full custom in cui la generazione del layout o il calcolo del routing possono essere eseguiti parzialmente a mano. La figura 1.1 mostra le fasi principali del processo di design di circuiti digitali complessi. Inizialmente vengono Figura 1.1. Processo di design di circuiti VLSI create le specifiche del circuito in linguaggio naturale o con linguaggi di modellazione di alto livello, successivamente le specifiche vengono tradotte a livello comportamentale attraverso l’uso di un linguaggio come il VHDL o il Verilog. A partire dalla descrizione comportamentale uno strumento automatico può generare la descrizione del circuito a livello RTL (Register-Transfer Level), in altri casi può essere creata manualmente utilizzando strumenti grafici o linguaggi di alto livello come il VHDL. Strumenti di sintesi automatica possono essere utilizzati per tradurre la descrizione RTL a livello gate o a livello elettrico (nuovamente la definizione dell’architettura di basso livello può essere gestita dal progettista in modo diretto). Una volta che 2 1.1 – Gli algoritmi genetici per il design, layout e test di circuiti VLSI il circuito è stato sintetizzato, è necessario controllarne il funzionamento, attraverso una fase di verifica funzionale, per garantire che il comportamento rispetti le specifiche iniziali. A tale scopo possono essere impiegati strumenti automatici per la simulazione funzionale, cosı̀ come possono essere utilizzati strumenti di verifica formale. Vengono inoltre eseguite simulazioni del circuito a livello elettrico e delle tempistiche dei segnali e viene analizzato il consumo di potenza, che rappresenta un importante vincolo progettuale. Infine la fase di calcolo del layout e del routing e di generazione delle maschere di incisione può essere parzialmente o completamente automatizzata per mezzo di strumenti specifici, cosı̀ come la fase di generazione dei pattern di collaudo. Nella maggioranza dei casi gli strumenti automatici si avvalgono di euristiche per poter completare il compito in tempi ragionevoli e spesso queste euristiche utilizzano gli algoritmi genetici. Data la loro efficacia nel risolvere problemi di ottimizzazione complessa, sono stati impiegati in diverse aree del design di circuiti digitali a larghissima scala di integrazione, quali il routing e il posizionamento di macrocelle, il partizionamento, il mapping su dispositivi FPGA, la valutazione della potenza dissipata e la generazione automatica di vettori di collaudo. Ad esempio, presso il dipartimento di automatica e informatica del Politecnico di Torino è stato sviluppato uno strumento per la generazione automatica di sequenze di test applicabili a circuiti sequenziali [20, 21]. I difetti fisici presenti nei dispositivi di memoria dipendono fortemente dal tipo di tecnologia di fabbricazione utilizzata per la realizzazione del circuito, pertanto l’impiego di nuovi processi di fabbricazione comporta l’insorgere di nuove tipologie di difetti e di conseguenza di nuovi modelli di guasto per i quali è necessaria la realizzazione di algoritmi di collaudo. Lo sviluppo di algoritmi efficienti specifici per i circuiti di memoria, assume un ruolo fondamentale al fine di garantire un elevato grado di copertura dei guasti e di conseguenza un innalzamento del livello qualitativo nella produzione dei circuiti stessi. Per rispondere adeguatamente a queste esigenze, negli ultimi anni la ricerca ha portato lo sviluppo di algoritmi e strumenti in grado di generare in modo automatico sequenze di test ottimali. Dato l’orientamento del mondo industriale verso l’impiego di soluzioni di collaudo per memorie denominate march test, la ricerca ha puntato verso lo sviluppo di strumenti di generazione automatica di sequenze di test basate sul modello dei march test. Questo tipo di algoritmi utilizzano una descrizione logica formale dei difetti fisici nota come modello di guasto funzionale, definita come sequenza di eccitazione e 3 1 – Introduzione osservazione del guasto e rappresentata attraverso grafi di transizione o mediante la notazione dei march test. Questo processo di astrazione risulta essere indipendente dalla specifica architettura del circuito e si adatta allo sviluppo di architetture di MBIST (Memory Built-In Self-Test), per le quali è facile implementare sessioni di test complesse caratterizzate da un elevato grado di programmabilità. Gli attuali strumenti per la generazione automatica di march test impiegano modelli di guasto funzionali che sono sviluppati in modo non automatizzato, e la cui definizione richiede spesso una quantità di tempo notevole. 1.2 Obiettivo del lavoro L’obiettivo di questo lavoro è stato lo sviluppo di uno strumento automatico, basato su un algoritmo genetico, per la generazione di sequenze di collaudo per memorie SRAM espresse sotto forma di march test. Lo strumento utilizza la descrizione a livello elettrico del circuito di memoria non difettoso e di quello difettoso per determinare la sequenza di collaudo. I difetti sono pertanto inseriti direttamente nel modello del circuito sotto forma di alterazioni dello schema elettrico. Un simulatore esterno (a livello elettrico) fornisce l’andamento dei segnali relativi ai due modelli di memoria, per una data sequenza di operazioni. Lo strumento quindi analizza i dati forniti dal simulatore al fine di determinare il march test in grado di coprire il difetto iniettato. Inoltre i march test generati sono in grado di rappresentare i modelli di guasto funzionali presenti in letteratura [15, 18], e possono essere impiegati da strumenti tradizionali di generazione di test al fine di massimizzare la copertura dei guasti. 4 Capitolo 2 Memorie La progettazione di un moderno circuito digitale VLSI consente l’utilizzo di un elevato numero di moduli di memoria ciascuno dei quali differisce per caratteristiche quali la tecnica di accesso e di memorizzazione dei dati, le tempistiche di accesso e la tecnologia di fabbricazione. Circuiti digitali moderni possono arrivare a contenere anche centinaia di moduli di memoria embedded. Tra le tipologie di memoria embedded che possono essere utilizzate per la realizzazione di circuiti complessi vi sono moduli ROM, E2 PROM, FLASH, DRAM e moduli SRAM, i quali costituiscono la maggior parte dei core presenti sul chip. In aggiunta, si sta diffondendo anche l’uso di moduli CAM sia nella versione standard sia in quella ternaria (TCAM). Tutti questi tipi di memoria possono essere realizzati con differenti tecnologie produttive, ciascuna delle quali presenta caratteristiche particolari. La principale tecnologia di fabbricazione resta quella CMOS, impiegata per la fabbricazione delle memorie statiche e della logica del circuito. Tuttavia la richiesta di prestazioni elevate porta all’impiego di tecnologie differenti come, ad esempio, la tecnologia SOI (Silicon On Insulator) che permette di ottenere velocità di commutazione maggiori rispetto al tradizionale CMOS. Inoltre la tecnologia SiGe (silicio-germanio) impiegata in contesti applicativi come il settore delle telecomunicazioni, richiede sempre più spesso l’uso di dispositivi di memoria. I moduli di memoria presenti sugli odierni circuiti digitali possono avere un numero di porte di accesso superiore a uno. In passato il numero di dispositivi multiporta presenti sul chip era molto basso e i dispositivi stessi disponevano di un numero molto basso di porte, per contro oggi sia il numero di dispositivi, sia il numero di porte per dispositivo è aumentato notevolmente e non 5 2 – Memorie è raro trovare memorie dotate di nove porte. La tecnica di accesso alle diverse porte costituisce un elemento ulteriore di differenziazione. In alcuni casi infatti si parla di memorie pseudo-multiporta, in quanto si usa un clock a più alta frequenza per garantire N accessi sequenziali all’interno di un singolo ciclo di clock di sistema. L’uso di memorie ad accesso casuale in tecnologia statica (SRAM) è ancora preponderante nei circuiti digitali odierni per via della loro elevata velocità di accesso ai dati. Basti pensare ai moderni microprocessori la cui area sul silicio è sempre maggiormente adibita ad ospitare memorie cache, e in cui tutte le tecniche legate alla predizione dei salti condizionali o alla traduzione da indirizzi virtuali a reali è realizzata in hardware appogiandosi su blocchi di memoria statica. Dai dati contenuti nella roadmap tracciata dall’ente International Technology Figura 2.1. Previsione di sviluppo dell’area occupata da una singola cella statica Roadmap for Semiconductor [2], emerge il continuo trend di riduzione delle dimensioni delle celle statiche, come è visibile nella figura 2.1, e il conseguente continuo aumento nella densità dei transistor visibile in figura 2.2. Da tali dati emerge quindi il fatto che i dispositivi di memoria, e in particolare quelli realizzati in tecnologia statica, sono e saranno i dispositivi a più alta densità nei circuiti attuali e di prossima generazione, e che pertanto sia richiesto lo sviluppo di tecniche di test adeguate. Per questo lavoro si è quindi deciso di focalizzare l’attenzione su questo tipo di dispositivi, e come primo obiettivo si è realizzato un modello di memoria statica descritto a livello transistor. 6 2.1 – Architettura di un circuito SRAM Figura 2.2. 2.1 Densità di transistor per i circuiti SRAM espressa in milioni per cm2 Architettura di un circuito SRAM Un circuito di memoria ad accesso casuale, realizzato in tecnologia statica (SRAM) utilizza un insieme di celle realizzate mediante dispositivi latch per immagazzinare l’informazione binaria al suo interno, e poterla successivamente richiamare. Lo schema rappresentato in figura 2.3 mette in evidenza i principali moduli logici costituenti un circuito SRAM: • memory array: contiene il vettore di celle che permettono l’immagazzinamento dell’informazione e generalmente presenta un’organizzazione matriciale di tipo N × M; • address decoder: permette la selezione di una cella all’interno del vettore di memorizzazione durante un’operazione di lettura o di scrittura, in base alla decodifica dell’indirizzo presente sul bus di ingresso. Poichè il vettore di memorizzazione presenta in genere un’organizzazione matriciale, l’indirizzo è suddiviso in due campi, che permettono di selezionare, attraverso la loro decodifica, rispettivamente la riga e la colonna relative alla cella in esame (row decoder/column decoder); • precharge circuit: permette di portare allo stesso potenziale le bit line connesse alle celle della matrice di memoria prima di un’operazione di lettura o scrittura; 7 2 – Memorie Figura 2.3. Schema a blocchi di una memoria SRAM • column selection circuit: permette di isolare le celle della matrice di memoria dai circuiti di I/O, quando nessuna delle celle è coinvolta in un’operazione di lettura o di scrittura; • I/O interface: l’interfaccia di I/O è costituita da circuiti separati per lettura e per la scrittura dell’informazione nella matrice di memoria. I circuiti che realizzano le operazioni di scrittura del dato presente sul bus in ingresso sono indicati come write driver, mentre i circuiti che realizzano la lettura del dato in una cella sono indicati come sense amplifier; • R/W logic: questo modulo contiene la logica necessaria a guidare le operazioni di lettura e scrittura, procedendo ad abilitare le sezioni corrette del modulo di I/O. 2.2 Matrice di memoria La struttura principale di un circuito SRAM è rappresentata dalla matrice di memoria (memory array), in quanto fornisce il supporto per l’immagazzinamento fisico dei dati. Dal punto di vista logico è possibile rappresentare la struttura interna di un dispositivo di memoria come un vettore lineare di elementi di memoria. Tuttavia 8 2.2 – Matrice di memoria dal punto di vista progettuale, l’organizzazione delle celle in forma di vettore pone grossi limiti, legati alla difficoltà di riuscire a trovare un piazzamento corretto del circuito all’interno dell’area di silicio a disposizione, per via della struttura fortemente allungata che ne deriva. Per questioni legate all’ottimizzazione del layout del circuito, il vettore logico viene organizzato in una matrice di elementi (vettore a due dimensioni), pur mantenendo la sequenzialità delle celle, che possono continuare ad essere rappresentate, dal punto di vista logico, come vettore lineare. Scegliendo un’organizzazione di tipo matriciale l’indirizzo associato a ciascuna cella viene suddiviso in due campi che permettono la selezione della riga e della colonna relative. L’organizzazione a matrice può essere estesa ulteriormente verso strutture a tre dimensioni in cui l’indirizzo associato alle celle è suddiviso in tre campi: due permettono di individuare la riga e la colonna all’interno di una sottomatrice la cui selezione è fornita dal contenuto del terzo campo. Queste tecniche di partizionamento sono utilizzate per minimizzare in fase di progettazione la presenza di difetti, in particolare di difetti intraword che si presentano tra i bit di una stessa parola di dato. In generale i circuiti di memoria permettono l’immagazzinamento di dati sotto forma di parole di N bit, ciascun elemento del vettore logico immagazzina quindi N bit di dato. A livello fisico ciascuna cella immagazzina un singolo bit di dato, pertanto la gestione delle parole di dato ad N bit viene realizzata agendo sulla rete combinatoria dei decoder di indirizzo, capaci in questo caso di selezionare per ogni operazione le N celle associate alla parola di dato, e attivare i rispettivi N circuiti di scrittura o lettura. 2.2.1 Cella di memoria statica Un circuito di memoria SRAM utilizza una matrice di celle elementari per immagazzinare l’informazione, ciascuna delle quali è costituita da un latch. Rispetto alle celle di memoria costituite da un condensatore integrato (utilizzate per la realizzazione dei circuiti DRAM), l’utilizzo di un dispositivo latch non richiede fasi periodiche di refresh, inoltre il latch garantisce ridotti tempi di accesso, e quindi maggiore velocità di scrittura e di lettura, anche se l’area occupata sul silicio risulta maggiore rispetto ad una cella realizzata mediante condensatore integrato. La struttura più semplice in grado di realizzare un latch è costituita da due inverter in cascata reazionati positivamente. La reazione positiva tra i due inverter consente di forzare lo stato 9 2 – Memorie del latch in modo stabile, infatti se si indica con A e Ā rispettivamente l’ingresso e l’uscita del primo inverter e con B e B̄ quelli del secondo, allora valgono le relazioni: Ā = B B̄ = A Se si forza dall’esterno il valore del nodo di ingresso A = 0 allora sono valide le relazioni A = B̄ = 0 e B = Ā = 1, le quali permettono di stabilire come il latch mantenga in modo stabile lo stato interno: S0 = { A = 0, B = 1 } Analogamente se si forza il valore del nodo di ingresso A = 1 la catena di relazioni diventa A = B̄ = 1 e B = Ā = 0, ciò permette di definire l’altro stato stabile che caratterizza il dispositivo latch: S1 = { A = 1, B = 0 } L’informazione binaria viene immagazzinata all’interno della cella in forma differenziale, associando ciascuno dei due bit a uno dei due stati stabili del latch, in generale l’associazione prevede di memorizzare il bit 0 sotto forma di stato S0 e il bit 1 sotto forma di stato S1 . Dal punto di vista circuitale ciascuna cella di memoria deve essere facilmente scrivibile e deve risultare stabile sia durante le operazioni di lettura sia durante i cicli di idle, inoltre deve essere in grado di mantenere il proprio stato interno indipendentemente dalle azioni svolte sulle altre celle vicine. Lo schema circuitale standard, mostrato in figura 2.4, è costituito da 6 transistor mosfet, di cui quattro utilizzati per la realizzazione del latch interno e due per le connessioni esterne. In particolare i transistor indicati come PASS 1 e PASS 2 sono impiegati come trasmission gate (data la simmetria strutturale dei dispositivi mosfet) per la connessione del latch con le due bit line esterne per lo scambio dei dati. I due trasmission gate sono connessi al terminale di controllo per la selezione della linea WL (word line) all’interno della matrice di memorizzazione. Il latch integrato è realizzato mediante due inverter CMOS reazionati positivamente, rappresentati rispettivamente dai transistor P 1−N 2 e da P 3−N 4. I dispositivi P 1 e P 3 sono i due transistor a canale p relativi al percorso di pull-up, mentre N 2 e N 4 sono quelli a canale n relativi al percorso di pull-down. In alcuni casi applicativi è possibile ricorrere ad una struttura avente solo 4 transistor a canale n: due trasmission gate e due dispositivi 10 2.2 – Matrice di memoria Figura 2.4. Architettura di una cella statica standard relativi al percorso di pull-down, mentre il percorso di pull-up è realizzato mediante due resistori integrati di elevato valore. Ad oggi l’architettura a 6 transistor rimane quella maggiormente impiegata a livello industriale. L’architettura della cella a 6 transistor può essere implementata a livello fisico in differenti modi. Il layout scelto per la realizzazione della singola cella influisce sia sul layout complessivo del circuito, ed in particolare della matrice di memorizzazione, sia sulla sensibilità del sistema agli errori. In figura 2.5 è mostrato un possibile layout per la cella a 6 transistor, in cui si osservano i due pad di connessione con le bit line (true bit line e complement bit line). Il pad presente nella parte superiore è utilizzato per la connessione della singola cella al terminale di alimentazione VDD, cosı̀ come il pad presente nella parte bassa in posizione centrale consente la connessione alla linea di massa del circuito. I due transistor a canale n sono formati dalla zona di diffusione attraversata dalla struttura di polisilicio che costituisce la linea di connessione con la word line. I due dispositivi a canale p sono invece formati dalla zona di diffusione e dalle strutture in polisilicio visibili in alto e che realizzano le connessioni tra i dispositivi mosfet del latch. Infatti ogni volta che la zona di diffusione viene attraversata da una struttura in polisilicio si crea un transistore mosfet. Se si considera il layout alternativo presente in figura 2.6, si osserverà un differente posizionamento dei dispositivi nella cella e un numero differente di pad di connessione con il resto del circuito. I dispositivi mosfet a canale p sono presenti sempre nella parte alta della cella, ma utilizzano ciascuno un terminale separato per 11 2 – Memorie Figura 2.5. Layout per la cella standard a 6 transistor la connessione con la linea di alimentazione VDD. Anche i dispositivi a canale n sono posizionati sempre nella zona bassa della cella, e anche in questo caso utilizzano ciascuno un terminale separato per la connessione verso la linea di massa GND. Inoltre il secondo layout presenta uno sviluppo maggiore nella direzione orizzontale e la presenza di un numero maggiore di pad di connessione influenza il restante layout della matrice di memorizzazione. In questo caso infatti i pad di connessione alle linee di alimentazione e massa possono essere condivisi tra celle adiacenti, cosı̀ come i pad relativi ai terminali delle bit line possono essere utilizzati in comune tra due celle della stessa colonna. Questo secondo layout risulta quindi molto più efficace dal punto di vista della progettazione del circuito di memoria, permettendo un risparmio di area e semplificandone il routing. Tuttavia dal punto di vista del collaudo il secondo layout rende il circuito più sensibile alla presenza di difetti, per esempio un contatto di alimentazione che presenti una resistività eccessiva 12 2.2 – Matrice di memoria Figura 2.6. Layout alternativo per la cella standard a 6 transistor influenzerà il comportamento di tutte le celle ad esso connesse. Pertanto il layout utilizzato nella realizzazione del circuito deve essere accuratamente scelto sia in funzione dell’ottimizzazione dell’area occupata, sia rispetto alla possibile sensibilità ai difetti e all’influenza che questi hanno sulla stabilità della cella. Quest’ultima è rappresentata dal parametro: β= W pef f Ltef f · Lpef f W tef f ! in cui W pef f e Lpef f rappresentano rispettivamente la larghezza e la lunghezza efficace del canale n dei dispositivi di pull-down, mentre W tef f e Ltef f sono rispettivamente la larghezza e la lunghezza efficace dei trasmission gate. A livello industriale si hanno valori di β compresi nell’intervallo [1.0 , 2.0]. Non solo la scelta del layout della cella influenza anche la progettazione dei sistemi di MBIST per l’esecuzione dei test, delle soluzioni di design for testability e dei blocchi ridondanti per la correzione dei guasti. 13 2 – Memorie 2.3 Circuito di precarica A differenza di quanto avviene nelle celle DRAM, lo scopo del circuito di precarica non è quello di eseguire il refresh dei dati in esse contenuti, che a causa delle correnti di leakage andrebbero persi. Il circuito di precarica (precharge circuit) in una memoria SRAM serve a portare il livello di tensione delle due bit line di una colonna al valore di alimentazione VDD, all’inizio di un’operazione di scrittura o di lettura su una delle celle della colonna stessa. Poichè la lettura del contenuto di una cella avviene in modo differenziale, amplificando la differenza di tensione presente tra le due bit line, è importante che la tensione a cui queste si trovano sia posta ad un valore noto e possibilmente uguale. L’operazione di lettura provoca la Figura 2.7. Circuito di precarica per le bit line scarica di una delle linee della colonna, in particolare se la cella memorizza il valore 0 avverrà la scarica della true bit line, viceversa se la cella memorizza il valore 1 avverrà la scarica della complement bit line. L’effetto di scarica è dovuto al carico capacitivo della linea stessa ed è legato all’effetto capacitivo parassita dovuto alla lunga metallizzazione. Va inoltre osservato che se dal punto di vista logico è possibile immaginare che l’operazione di lettura sposti uno 0 logico su una delle due bit line (a seconda del bit memorizzato nella cella), a livello fisico tale differenza risulta essere dell’ordine di circa 100 mV. Come si osserva nello schema riportato in figura 2.7 il circuito di precarica è composto da tre transistor mosfet a canale p pilotati sul terminale di gate dal segnale di controllo P RECHG (set precharge). I tre transistor sono utilizzati in configurazione di trasmission gate. I mosfet P 1 e P 2 hanno un lato comune che viene connesso direttamente alla linea VDD, mentre il transistor EQ è 14 2.4 – Address decoding connesso alle due bit line. I due transistor P 1 e P 2 hanno quindi lo scopo di forzare il valore di tensione di ciascuna delle bit line al valore di alimentazione. Il valore di tensione della precarica è fissato tipicamente a VDD perchè in questo modo si agevola la fase di amplificazione dei circuiti di lettura e quindi si minimizzano gli errori dovuti a riconoscimenti della tensione differenziale sbagliati, inoltre può essere conveniente data l’elevata capacità di carico introdotta dalla metallizzazione delle bit line. Il transistor EQ assume invece il ruolo di equalizzatore, portando la tensione di ciascuna delle due bit line allo stesso valore. In genere se una delle due bit line raggiunge prima il valore di alimentazione, il mosfet di equalizzazione permette lo scorrimento di una corrente verso l’altra linea, agevolandone quindi il processo di precarica (la corrente si annulla quando il differenziale tra le linee diventa nullo). 2.4 Address decoding La selezione delle celle all’interno della matrice di memorizzazione avviene attraverso l’emissione di un indirizzo, relativo alla cella interessata, da parte di un dispositivo esterno. Data l’organizzazione di tipo matriciale della struttura di memorizzazione, l’indirizzo è suddiviso in due campi che permettono di selezionare la riga e la colonna associate alla cella indirizzata (nel caso di memorie con parole di ampiezza N bit, l’indirizzo permette la selezione di N colonne relative agli N bit della parola). L’indirizzo esterno viene quindi bufferizzato internamente al circuito di memoria e ciascuno dei due campi di selezione viene portato in ingresso ad un circuito di decodifica. In genere si associano i bit più significativi dell’indirizzo al campo di selezione della riga, e i bit meno significativi al campo di selezione della colonna. Se nella matrice vi sono M righe ed N colonne allora ciascuno dei due campi dovrà essere formato rispettivamente da k1 = log2 (M ) e da k2 = log2 (N ) bit. In generale il numero di celle selezionabili all’interno della matrice di memorizzazione, e quindi lo spazio di indirizzamento, è pari ad una potenza di due. In particolare ciascuno dei due campi sarà in grado di selezionare rispettivamente un numero di righe e di colonne corrispondente ad una potenza di due. Comunque questa scelta non è obbligatoria, pertanto sarà compito della circuiteria esterna evitare la generazione di indirizzi non validi. 15 2 – Memorie 2.4.1 Struttura dell’address decoder Il circuito di decodifica (address decoder) è costituito da una rete combinatoria in grado di tradurre l’indirizzo relativo al campo di riga o di colonna dell’indirizzo base nel corrispondente indirizzo lineare rappresentato dal segnale di selezione della singola riga (word line) o della singola colonna (column selection). La struttura della rete combinatoria, che viene realizzata utilizzando porte logiche AND, OR (NAND, NOR) e NOT, presenta il segnale di controllo EN (enable) utilizzato per attivare la selezione di uscita durante l’intervallo di tempo in cui i dati relativi all’indirizzo sono stabili agli ingressi del circuito di decodifica. Si può inoltre osservare che per Figura 2.8. Decoder di indirizzo a due ingressi - quattro uscite e struttura del gate a 3 ingressi utilizzato nella rete combinatoria del decoder via dell’indipendenza della decodifica del campo di riga e di colonna, l’attivazione del singolo segnale WL (word line) abilita tutte le celle della riga selezionata alle rispettive bit line, ed è solo con la selezione della colonna che si connette la coppia di bit line associate alla cella selezionata con i circuiti dell’interfaccia di I/O. In sistemi più complessi l’indirizzo è scomposto in tre campi, di conseguenza un terzo circuito di decodifica permette di selezionare la sottomatrice interessata dall’operazione di lettura o scrittura, e solo successivamente la decodifica della riga e della colonna nella sottomatrice abiliteranno la cella indirizzata. Ciò richiede un attento studio delle temporizzazioni dei segnali di controllo dei decoder in fase di progettazione. In figura 2.8 è rappresentato lo schema di un decoder a due ingressi e quattro uscite basato su porte logiche AND. 16 2.5 – Sense amplifier 2.4.2 Selezione delle colonne Il circuito di selezione della colonna (column selection circuit) è costituito da due transistor a canale n utilizzati in configurazione di transmission gate. Lo scopo del circuito è di connettere le bit line relative alla cella selezionata ai circuiti di I/O. Il Figura 2.9. Circuito di selezione e isolamento della colonna della matrice di memoria circuito permette la connessione della cella con l’ingresso dei circuiti di lettura o le uscite dei circuiti di scrittura, rispettivamente durante le operazioni di lettura e scrittura. Durante i cicli di idle il circuito isola la colonna dalla sezione di I/O costituita dal sense amplifier e dal write driver. Come si può osservare nello schema riportato in figura 2.9, i due mosfet sono pilotati dal segnale di controllo comune COLSEL (column selection) corrispondente al segnale di uscita del decoder di colonna. 2.5 Sense amplifier L’amplificatore di uscita (sense amplifier) presente all’interno dell’interfaccia di I/O, permette di amplificare la differenza di tensione presente tra le bit line della cella selezionata, durante le operazioni di lettura. La progettazione del sense amplifier è molto delicata, in quanto permette di stabilire il valore del bit contenuto nella cella. Il sense amplifier è costituito da un circuito di amplificazione differenziale tale che, se si indicano con v+ e v− i nodi di ingresso, valgono le relazioni seguenti: H se (v = v − v ) > 0 d + − Vo = L se (vd = v+ − v− ) < 0 17 2 – Memorie dove vd rappresenta la differenza tra la tensione del nodo v+ e quella del nodo v− . In letteratura [3] sono presenti diverse soluzioni circuitali utilizzate per la realizzazione del circuito di amplificazione di uscita, e molte sono oggetto di studio per la loro ottimizzazione. Una delle soluzioni comunemente utilizzata è chiamata latch sense amplifier (figura 2.10), ed è basata sull’uso di un latch analogo a quello presente nelle celle di memoria per ottenere l’effetto di amplificazione (le bit line di ingresso sono direttamente connesse ai nodi a drain comune del latch). Il latch rimane isolato dalle celle della colonna per mezzo del circuito di selezione della colonna, e viene pilotato attraverso il segnale di controllo SSA (set sense amplifier) attivato dalla logica di controllo durante le operazioni di lettura. La connessione tra il Figura 2.10. Latch sense amplifier latch di amplificazione e le bit line della colonna crea un effetto di accoppiamento capacitivo (effetto capacitivo di Miller). Tuttavia tale effetto non influenza il comportamento del sense amplifier quando viene selezionato. L’attivazione del circuito di selezione della colonna permette la trasmissione del segnale differenziale agli ingressi del sense amplifier e attivando il segnale di controllo SSA lo si amplifica fino a che non raggiunge il livello di uscita prestabilito. Va osservato che le attuali celle di amplificazione presentano una sensibilità di circa 80 mV, questo significa che sono in grado di riconoscere correttamente segnali differenziali con un’ampiezza minima di circa 80 mV, mentre segnali differenziali inferiori al valore di sensibilità non sono 18 2.6 – Write driver correttamente riconosciuti. Ne consegue l’importanza della corretta progettazione dello stadio di precarica che agevola la fase di sensing dell’amplificatore. Una soluzione circuitale alternativa consiste nel connettere le bit line di ingresso direttamente ai terminali di gate dei mosfet a canale n. Le bit line di uscita sono prelevate sempre dal nodo a drain comune della cella di amplificazione, ottenendo una separazione fisica tra le linee di ingresso e di uscita dell’amplificatore. Un alternativa è data dai circuiti di amplificazione di corrente (current sense amplifier) in cui il segnale di uscita si ottiene misurando il flusso di corrente che scorre nelle bit line di ingresso durante l’operazione di lettura (SSA attivo). Tuttavia gli amplificatori di corrente risultano essere maggiormente sensibili ai difetti presenti nelle celle di memoria, in quanto il livello di uscita viene alterato se durante la fase di amplificazione (SSA attivo) il flusso di corrente in ingresso cambia. Ne consegue che, in genere, gli amplificatori di corrente presentano una fase di sensing di durata superiore rispetto agli amplificatori differenziali di tensione. La determinazione della corretta temporizzazione del segnale di controllo SSA rispetto al segnale di attivazione del circuito di selezione della colonna, rappresenta una fase delicata del progetto del circuito di memoria e in particolare di quello di amplificazione. Per ottenere questo risultato è possibile ricorrere a specifiche soluzioni circuitali che forniscono la corretta sincronizzazione dei segnali. A questo scopo è possibile ricorrere a soluzioni basate su una dummy word line, in cui un segnale di word line aggiuntivo è utilizzato per eseguire la sincronizzazione con il segnale SSA. Altre tecniche circuitali fanno invece uso di una dummy bit line, sempre con l’obiettivo di sincronizzare il segnale di attivazione dell’amplificatore di uscita. Inoltre, per ottenere il corretto livello del segnale di uscita, è possibile ricorrere a soluzioni di amplificazione a più stadi (in genere si usano soluzioni a due stadi che possono essere realizzati con soluzioni circuitali differenti), in cui gli stadi successivi al primo permettono di avere un completo adattamento del livello di tensione del segnale di uscita. 2.6 Write driver Il circuito utilizzato per eseguire la scrittura dei dati è chiamato write driver. Come esposto nei paragrafi precedenti le celle della matrice di memorizzazione immagazzinano l’informazione in forma differenziale, inoltre poichè le celle sono costituite da un latch connesso alle bit line tramite due trasmission gate, l’informazione differenziale 19 2 – Memorie viene in realtà trasferita da e verso le celle forzando il valore logico 0 su una delle due linee. Infatti i due trasmission gate della cella di memorizzazione sono in grado Figura 2.11. Schema del circuito di scrittura di trasferire efficacemente lo 0 logico ma non l’1 logico. Il circuito di scrittura dovrà quindi essere in grado di forzare il valore 0 su una delle due bit line (a seconda del dato binario che deve essere trasferito), indipendentemente dal valore precedente presente nella cella e quindi dallo 0 logico trasferito dalla cella alle bit line quando questa è selezionata. Per ottenere questo è necessario che il write driver sia in grado di trasferire un valore tensione, associato allo 0 logico, dominante rispetto a quello debole prodotto dalla cella, in modo da forzare la scrittura del valore corretto. Il circuito rappresentato in figura 2.11 mostra lo schema circuitale standard utilizzato per la realizzazione del write driver e fa uso di due inverter chiamati gated inverter associati alla coppia di bit line. I due mosfet interni (rispettivamente P 2−N 3 per la true bit line e P 6−N 7 per la complement bit line) realizzano due inverter CMOS, i restanti quattro mosfet svolgono la funzione di gating e sono pilotati dal segnale di controllo WE (write enable). Quando viene trasferito il bit di dato 0 il segnale WE forza il nodo della cella corrispondente alla true bit line, attraverso il ramo di sinistra del write driver, ad un valore di tensione corrispondente allo 0 logico. Analogamente la scrittura del bit di dato 1 forzerà la tensione associata allo 0 logico sul nodo della cella corrispondente alla complement bit line, tramite il ramo destro del write driver. 20 2.7 – Modello sperimentale di memoria Per garantire la corretta trasmissione del dato in forma differenziale i mosfet a canale n presentano dimensioni simili a quelle dei mosfet a canale p, rispetto al consueto rapporto di due a uno tra le dimensioni dei mosfet a canale p e quelli a canale n. Una soluzione alternativa poco utilizzata, impiega un circuito in grado di forzare lo 0 logico sulla bit line opportuna e di portare l’altra bit line in uno stato di alta impedenza mendiante un circuito tri-state. 2.7 Modello sperimentale di memoria Lo schema del circuito SRAM in tecnologia CMOS utilizzato per l’esecuzione delle simulazioni a livello elettrico è rappresentato in figura 2.12. Il sistema è composto da una matrice 3 × 3, la quale permette l’analisi di modelli di guasto che coinvolgono anche più celle, oltre all’esplorazione di differenti modi di indirizzamento 1 . Il numero di componenti associati ai circuiti di precarica delle bit line, di address decoding, d’interfaccia di I/O e di controllo è stato minimizzato. Questa scelta rappresenta un compromesso tra la velocità di esecuzione delle simulazioni da parte del simulatore e l’utilizzo di un modello di memoria descritto a livello elettrico coerente, inoltre questa scelta è legata alla volontà di concentrare l’attenzione sui soli difetti relativi alla matrice di memorizzazione, assumendo quindi che i circuiti di decodifica degli indirizzi, di precarica, di controllo e dell’interfaccia di I/O siano correttamente funzionanti. Nel modello sono quindi presenti i moduli di precarica delle bit line, un semplice circuito guida utilizzato durante le operazioni di scrittura, i circuiti di selezione e isolamento delle colonne e un gruppo di porte logiche. Sono invece assenti i circuiti di amplificazione utilizzati durante le operazioni di lettura. Per semplificare la gestione delle simulazioni e l’interfacciamento dello strumento per la generazione automatica con il simulatore, si è fissato un ciclo di durata pari a 10 ns sia per le operazioni di scrittura sia per quelle di lettura. Un segnale di clock (clock precharge) con frequenza di 100 MHz esegue ciclicamente la fase di precarica delle bit line alla tensione di alimentazione VDD (per semplicità la precarica delle bit line avviene durante i primi 5 ns di ogni ciclo operativo, compresi i cicli di idle). La matrice di memorizzazione è formata da 9 celle disposte in configurazione 3 × 3. Ogni cella è connessa alla propria coppia di bit line, ad ogni bit line è connessa una capacità 1 Il concetto di modo di indirizzamento è espresso nel capitolo 4 in riferimento all’analisi dello strumento automatico per la generazione di march test 21 2 – Memorie Figura 2.12. Modello sperimentale di memoria statica con matrice 3 × 3 di valore pari a 0.01 pF utilizzata per simulare l’effetto capacitivo dovuto alla metallizzazione. Una coppia di mosfet a canale n realizza il circuito di selezione delle colonne, che viene pilotato dal segnale di controllo emesso da un gruppo di porte logiche. L’interfaccia di I/O è costituita quindi da un solo inverter che permette di eseguire le scritture differenziali sulle celle della matrice. Nello schema non sono presenti i sense amplifier di uscita, quindi le operazioni di lettura sono gestite direttamente dallo strumento di generazione automatico che simulerà il comportamento del latch di amplificazione. Nel circuito è presente un gruppo di 6 porte logiche AND che consentono la gestione sia dell’indirizzamento sia delle operazioni di scrittura/lettura. In particolare le porte a due ingressi permetto la selezione della word line interessa dall’operazione corrente, mentre quelle a tre ingressi permettono la selezione della colonna interessata dall’operazione corrente, oltre all’attivazione del segnale di controllo W/R̄ che specifica il tipo di operazione da eseguire. La lettura dei dati viene eseguita direttamente dallo strumento per la generazione automatica di march test analizzando il valore dei nodi di connessione delle bit line con il circuito di selezione della colonna (probe nodes). Tutte le operazioni sono eseguite durante 22 il secondo semiciclo operativo, attraverso l’attivazione del segnale di controllo EN (enable). Questa struttura è stata scelta perchè permette di mantenere un’interfaccia composta dai vari gruppi di segnali che tipicamente costituiscono l’interfaccia di memoria, senza influire sul tempo complessivo di simulazione del circuito. In figura 2.13 è riportato l’andamento dei segnali di interfaccia relativo ad un ciclo di scrittura, seguito da un ciclo di lettura. Come si osserva dalla figura il ciclo di pre- Figura 2.13. Memoria statica semplificata con array da 9 celle carica dura fino all’istante t = t0 + 4.5 ns (t0 rappresenta l’istante iniziale del ciclo operativo), dove il segnale P RECHG, corrispondente al segnale periodico del generatore precharge clock, inizia una transizione di 0.5 ns al termine della quale risulta disattivato. Contemporaneamente al fronte di salita del segnale P RECHG si ha l’attivazione del segnale di EN (fronte di salita del segnale di enable), che permette l’esecuzione dell’operazione di lettura o di scrittura. Nello stesso intervallo di tempo viene opportunamente commutato il segnale di controllo W/R̄ per la selezione dell’operazione corrente. I segnali relativi al bus dati e indirizzi sono commutati all’interno del ciclo di precarica (t = t0 + 3.5 ns), in modo che si abbiano a disposizione dati e indirizzi validi nell’istante in cui si abilita l’esecuzione dell’operazione sulla cella selezionata. Nelle tabelle 2.1 e 2.2 sono riportati i parametri relativi al modello dei dispositivi mosfet impiegati nella definizione del modello sperimentale di memoria SRAM. 2 – Memorie Parameter Type Width Length Level L W Vto Kp Gamma Phi Lambda Is Js Pb Pbsw Cj Cjsw Cgso Cgdo Cgbo Tox Xj Ucrit Diomod Vfb Leta Weta U0 Temp Vdd Xpart Tabella 2.1. Cell latch nmos 4.000000E-06 2.000000E-06 2 100.000000E-06 100.000000E-06 0.7513 20.718860E-06 0 0.7 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 100.000000E-09 0 10.000000E+03 1 0 0 0 0 0 0 0 Cell latch pmos 10.000000E-06 2.000000E-06 2 100.000000E-06 100.000000E-06 -.9784 20.718860E-06 0 0.7 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 100.000000E-09 0 10.000000E+03 1 0 0 0 0 0 0 0 Cell pass transistor nmos 8.000000E-06 2.000000E-06 1 100.000000E-06 100.000000E-06 0 20.000000E-06 0 0.6 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 0 0 10.000000E+03 1 0 0 0 0 0 0 0 Parametri per il modello spice dei dispositivi mosfet della cella SRAM 24 2.7 – Modello sperimentale di memoria Parameter Type Width Length Level L W Vto Kp Gamma Phi Lambda Is Js Pb Pbsw Cj Cjsw Cgso Cgdo Cgbo Tox Xj Ucrit Diomod Vfb Leta Weta U0 Temp Vdd Xpart Precharge pmos 1.000000E-06 1.000000E-06 1 100.000000E-06 100.000000E-06 0 20.000000E-06 0 0.6 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 0 0 10.000000E+03 1 0 0 0 0 0 0 0 Column selection nmos 8.000000E-06 2.000000E-06 1 100.000000E-06 100.000000E-06 0 20.000000E-06 0 0.6 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 0 0 10.000000E+03 1 0 0 0 0 0 0 0 Logic nmos 1.000000E-06 1.000000E-06 1 100.000000E-06 100.000000E-06 0 20.000000E-06 0 0.6 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 0 0 10.000000E+03 1 0 0 0 0 0 0 0 Logic pmos 1.000000E-06 1.000000E-06 1 100.000000E-06 100.000000E-06 0 20.000000E-06 0 0.6 0 10.000000E-15 0 0.8 0.8 0 0 0 0 0 0 0 10.000000E+03 1 0 0 0 0 0 0 0 Tabella 2.2. Parametri per il modello spice dei dispositivi mosfet per i circuiti di controllo 25 Capitolo 3 Algoritmi genetici Gli algortimi genetici appartengono alla classe degli algoritmi evolutivi e sono stati introdotti dal Prof. John Holland nel 1975 presso l’università del Michigan e successivamente sono divenuti popolari grazie al contributo del Prof. Goldberg presso l’università dell’Illinois. L’idea del Prof. Holland è stata quella di incorporare all’interno di un algoritmo tradizionale i meccanismi propri dell’evoluzione degli organismi biologici. Questi meccanismi derivano da un insieme di osservazioni relative al modello di evoluzione naturale: • l’evoluzione opera a livello genetico agendo sui cromosomi degli individui (i cromosomi di fatto codificano l’informazione che definisce gli individui stessi ) piuttosto che sull’individuo nel suo complesso; • la pressione ambientale, chiamata selezione, favorisce la riproduzione dei cromosomi che definiscono gli individui con caratteristiche migliori, cioè quelli con un migliore adattamento alle condizioni dell’ambiente esterno; • il processo di riproduzione è il principale meccanismo di evoluzione degli individui. Tale processo agisce in modo da ricombinare il materiale genetico contenuto nei cromosomi di due individui (genitori), al fine di ottenere due nuovi individui (figli) che entreranno a far parte della popolazione. Questo meccanismo stabilisce inoltre il passaggio da una generazione a quella successiva; • un’altro meccanismo su cui si basa l’evoluzione è dovuto all’azione del processo di mutazione. Tale processo agisce sui nuovi individui generati dal processo 26 di riproduzione, alterandone in modo casuale il cromosoma, con lo scopo di introdurre nuovo materiale genetico. Questo materiale introduce nuove caratteristiche nella popolazione che diversamente non sarebbero ottenibili mediante il solo processo di riproduzione; • l’evoluzione è un meccanismo senza memoria, questo significa che la sua conoscenza è basata esclusivamente sull’informazione contenuta nei cromosomi degli individui appartenenti alla popolazione corrente. Sulla base di queste semplici osservazioni, Holland propose l’idea di introdurre processi di selezione, riproduzione e mutazione analoghi a quelli sopra esposti all’interno di una procedura algoritmica, al fine di utilizzare l’enorme potenziale insito nell’evoluzione per risolvere problemi complessi. Un algoritmo genetico (AG) presenta generalmente le seguenti caratteristiche: • ogni cromosoma è definito mediante una sequenza di caratteri, chiamati geni ed apparteneti ad un insieme che definisce l’alfabeto. L’alfabeto contiene un numero finito di simboli, ciascuno dei quali definisce il valore che un gene può assumere all’interno del cromosoma, cioè stabilisce il suo allele. Un tipico alfabeto utilizzato negli algoritmi genetici è quello binario, composto dai soli alleli 1 e 0. Il cromosoma rappresenta l’individuo all’interno della popolazione corrente ed esprime la soluzione al problema considerato; • una funzione f (x), chiamata funzione di valutazione o fitness, permette di esprimere un giudizio sull’efficacia di un individuo rispetto al problema affrontato. Soluzioni migliori saranno quindi associate a valori di fitness più alti; • l’insieme delle funzioni di selezione, riproduzione e mutazione permette all’algoritmo di evolvere da una generazione a quella successiva, attraverso l’incrocio dei geni relativi alle soluzioni con fitness più alta. La realizzazione di un algoritmo genetico si basa quindi sulla definizione della codifica dei cromosomi associata ad una generica soluzione e la definizione della funzione di valutazione specifica per il problema affrontato. In particolare la scelta della codifica influenza anche la successiva definizione degli operatori genetici che dovranno poi manipolare i cromosomi. In molti problemi di ottimizzazione combinatoria la 27 3 – Algoritmi genetici soluzione può essere facilmente espressa come sequenza di caratteri binari, in altri casi la scelta ricade su una sequenza rappresentata da valori non binari (ad esempio valori interi). 3.1 Struttura di un AG Un algoritmo genetico è strutturato in modo tale da potere realizzare il processo di evoluzione temporale, come visibile in figura 3.1. Una funzione di inizializzazione permette di creare la popolazione iniziale di individui attraverso la generazione casuale dei geni di ciascun cromosoma, successivamente si entra in un ciclo che permette all’algoritmo genetico di fare evolvere la popolazione di individui attraverso le varie generazioni. Per ciascun cromosoma l’algoritmo ricava un valore che rappresen- Figura 3.1. Struttura di un algoritmo genetico ta la qualità della soluzione rispetto al problema in esame, attraverso l’applicazione della funzione di fitness. Spesso nei problemi di ottimizzazione combinatoria la funzione di fitness coincide con la funzione obiettivo che si intende massimizzare, mentre 28 3.1 – Struttura di un AG nei problemi di minimizzazione coincide con l’inverso della funzione obiettivo. In base alla valutazione di ciascun individuo, l’algoritmo procede con la fase di riproduzione degli stessi. Per la riproduzione sono state proposte diverse tecniche, la più semplice è definita generational replacement e prevede la creazione di un insieme di nuovi individui in grado di sostituire l’intera popolazione ad ogni generazione, tale tecnica pur essendo semplice da implementare presenta un tasso di perdita delle caratteristiche degli individui più elevato. La tecnica nota come steady state risulta più efficiente poichè cerca di evitare la perdita di caratteri genetici utili dovuti alla sostituzione di tutti i cromosomi della popolazione. La tecnica steady state prevede che ad ogni nuova generazione venga sostituita solo una frazione degli individui corrispondente al valore del parametro generation gap. Solitamente gli individui peggiori all’interno della popolazione corrente sono sostituiti dai nuovi individui generati. Quando la frazione di cromosomi sostituita ad ogni generazione coincide con l’insieme di tutti gli individui della popolazione, allora la tecnica di steady state degenera in quella standard di total replacement. La tecnica steady state garantisce risultati migliori per un numero elevato di generazioni, garantendo che il valore medio di valutazione degli individui sia crescente durante il ciclo di evoluzione. Per ottenere questo risultato l’insieme dei cromosomi figli viene valutato prima del loro inserimento nella popolazione, e solo se la loro valutazione risulta superiore a quella del gruppo di cromosomi individuati per la sostituzione (generation gap) questi vengono inseriti nella popolazione, in caso contrario l’algoritmo li rifiuta e procede a una nuova selezione. In questo modo i vantaggi di questo approccio emergono su un ciclo di evoluzione grande in quanto bisogna prevedere il manifestarsi di periodi di stasi del valore di valutazione medio. Di conseguenza questo approccio risulta interessante qualora il tempo di CPU richiesto per la valutazione degli individui non sia dominante. In letteratura [6, 7] esiste una tecnica di riproduzione alternativa simile allo steady state chiamata elitismo, anche in questo caso si sostituisce solo una frazione dei cromosomi nella popolazione corrente (tipicamente gli individui con valutazione peggiore) pari a un valore di generation gap; tuttavia i nuovi cromosomi subentrano nella nuova popolazione immediatamente senza un test di valutazione e concorrono alla selezione nella generazione successiva, dopo essere stati valutati. Rispetto allo steady state questa tecnica non garantisce una crescita della valutazione media durante il ciclo evolutivo in quanto i nuovi individui possono risultare in realtà peggiori di quelli sostituiti. Tuttavia se il tempo di CPU richiesto per la 29 3 – Algoritmi genetici valutazione di un individuo è dominante questa tecnica garantisce risultati migliori del total replacement anche su un numero di generazioni relativamente basso. Ciascuna tecnica di riproduzione prevede che siano scelti due cromosomi definiti come genitori. La selezione è ottenuta mediante l’applicazione di una funzione specifica (selezione) che provvede a scegliere due individui a caso, favorendo tuttavia gli individui con fitness maggiore. I due cromosomi scelti vengono incrociati attraverso l’operatore genetico di crossover dando origine a due cromosomi figli. In base alla tecnica di riproduzione in uso, quando tutti i nuovi cromosomi sono stati generati si procede alla sostituzione di parte della popolazione corrente, dando origine alla generazione successiva. Ogni nuovo individuo nella generazione successiva è soggetto all’azione dell’operatore di mutazione che provvede a introdurre variazioni casuali dei valori dei geni del cromosoma, inoltre i nuovi individui sono sottoposti all’azione dell’operatore di inversione che provvede a generare una diversa rappresentazione della soluzione espressa dal cromosoma, senza alterarne il valore di fitness (si noti che l’operatore di inversione non è considerato essenziale nella struttura di un algoritmo genetico e che la sua adozione è legata al problema specifico in esame). Infine ciascuno dei nuovi cromosomi può essere soggetto all’azione di uno o più operatori genetici, sviluppati sulla base delle specifiche conoscenze del problema affrontato. A questo punto il ciclo si chiude e le funzioni di fitness e di riproduzione sono riapplicate alla nuova popolazione. Il processo termina quando è verificata la condizione di terminazione, che viene espressa sia come limite massimo nel numero di generazioni sia come condizione specifica di terminazione del problema. L’applicazione di ciascuno degli operatori genetici, sia classici sia specifici per il dominio applicativo considerato, sono legati ad una probabilità di esecuzione degli stessi. Questo significa che l’applicazione dell’operatore di crossover, dati due cromosomi genitori, avviene con probabilità Pc specificata come parametro dell’algoritmo, mentre con probabilità 1 − Pc i due cromosomi figli saranno identici ai genitori. Analogamente per gli altri operatori si avrà la loro esecuzione con probabilità Pop , mentre con probabilità 1 − Pop l’operatore non verrà applicato. 3.2 Selezione Il processo di selezione sceglie due individui all’interno della popolazione corrente, con lo scopo di accoppiarli e di generare due nuovi individui (figli) che entreranno a 30 3.2 – Selezione far parte della popolazione nella generazione successiva. La selezione degli individui Figura 3.2. Roulette wheel extraction avviene attraverso un processo casuale, in cui vengono tuttavia favoriti gli individui con valore della funzione di fitness più alta. Per ottenere questo risultato Holland ha sviluppato una tecnica di selezione chiamata roulette wheel extraction. Questa tecnica dispone idealmente gli individui della popolazione su una circonferenza, come visibile in figura 3.2, ed assegna a ciascun cromosoma un arco la cui ampiezza è direttamente proporzionale al valore della fitness dell’individuo. Dal punto di vista algoritmico la tecnica prevede l’estrazione di un valore casuale r compreso nell’intervallo: 0 ≤ r ≤ PX op−1 f (x) x=0 dove f (x) rappresenta la fitness associata al cromosoma x della popolazione composta da P op individui. Questo corrisponde ad estrarre a caso una posizione all’interno della circonferenza di cui sopra. L’individuo su cui viene a cadere la posizione estratta rappresenta l’individuo scelto. Dal punto di vista algoritmico viene calcolato il valore cumulativo della fitness per ciascun individuo: fcum (x) = x X f (i) i=0 Il valore cumulativo per cui vale la relazione fcum (x) ≥ r rispetto alla variabile casuale estratta, permette di selezionare il cromosoma genitore. La selezione risulta essere indipendente dall’ordine con cui gli individui sono posizionati sulla circonferenza, cioè è indipendente dall’ordine con cui si calcolano i valori cumulativi delle 31 3 – Algoritmi genetici fitness degli individui. Infatti se la variabile casuale r ha una distribuzione di proP op−1 babilità uniforme nell’intervallo [ 0 , F ], dove F = Px=0 f (x) , allora l’ordine con cui sono presi in considerazione gli individui, cioè l’ordine con cui sono disposti sulla circonferenza, è irrilevante. In letteratura [7] sono state proposte tecniche alternative di selezione degli individui, quali la stochastic universal selection o il binary tournament. La prima tecnica risulta simile alla roulette wheel extraction, in cui però vengono selezionati N individui contemporaneamente anzichè uno solo. Ad ogni estrazione sono utilizzati N marker equidistanti, posizionati sulla circonferenza che rappresenta la fitness complessiva della popolazione e durante l’estrazione ciascuno degli individui riceve un numero variabile di marker proporzionalmente alla propria fitness. Gli individui con fitness maggiori ricevendo più marker hanno diritto a riprodursi un numero di volte pari al numero di marker a loro assegnati, favorendone quindi la riproduzione. La tecnica di binary tournament prevede invece l’estrazione casuale di una coppia di individui, e la selezione dell’individuo migliore nella coppia come genitore; inoltre la tecnica può prevedere la reintroduzione degli individui o meno all’interno del pool di selezione (l’insieme degli individui selezionabili per la riproduzione, inizialmente coincidente con la popolazione associata alla generazione corrente). Nel secondo caso, poichè la dimensione della popolazione rimane costante tra una generazione e la successiva, il pool verrà ricreato completemente reinserendovi tutti gli individui dopo che la nuova generazione sarà stata completata a metà. Questo implica quindi che l’individuo con fitness maggiore si riprodurrà due volte mentre quello con fitness più bassa sarà scartato due volte. 3.3 Crossover Il processo di crossover è alla base del meccanismo di riproduzione implementato da un algoritmo genetico. Analogamente a quanto avviene nel mondo naturale durante la riproduzione, il crossover permette la creazione di nuovi individui mescolando il patrimonio genetico dei genitori. Il processo di combinazione permette infatti la creazione di individui figli aventi caratteristiche di entrambe i genitori, tuttavia poichè l’azione di combinazione dei geni è casuale il patrimonio genetico complessivo degli individui creati può risultare peggiore o migliore di quello dei genitori. La funzione di selezione avrà quindi il compito di scegliere ad ogni generazione l’insieme 32 3.3 – Crossover degli individui con le caratteristiche migliori per la riproduzione, con l’obiettivo di originare dei figli con caratteristiche migliori di quelle dei genitori. In quest’ottica il processo di crossover è ritenuto essenziale negli algoritmi genetici ed è considerato il processo principale nell’ambito della riproduzione. Infatti è stato osservato che l’introduzione di questo processo all’interno di altre tecniche di ottimizzazione, come la programmazione dinamica, permette di ottenere prestazioni dell’algoritmo migliori; analogamente l’eliminazione dello stesso da un algoritmo genetico ne determina un netto peggioramento delle prestazioni. Nell’ambito della progettazione di algoritmi genetici, sono stati proposti differenti Figura 3.3. One-point crossover meccanismi di crossover, molti dei quali pensati per domini applicativi specifici. La tecnica base, proposta inizialmente da Holland, è nota come one-point crossover, e consiste nel selezionare casualmente una posizione all’interno del cromosoma, chiamata punto di taglio. Il taglio permette di individuare su ciascuno dei cromosomi genitori due regioni: la regione precedente e quella successiva il punto di taglio. La tecnica di crossover genera quindi i due nuovi individui nel seguente modo: siano P 1 e P 2 rispettivamente il cromosoma genitore 1 e 2, siano rispettivamente L e R la regione a sinistra (precedente) e a destra (successiva) del punto di taglio e siano infine C1 e C2 rispettivamente il nuovo individuo 1 e 2, come rappresentato in figura 3.3. Allora per C1 valgono le seguenti relazioni: C1 = P 1 L L Child 1 C1R = P 2R 33 3 – Algoritmi genetici mentre per C2 valgono le relazioni: C2 = P 2 L L Child 2 C2R = P 1R 3.4 Mutazione L’operatore di mutazione è il secondo operatore classico utilizzato negli algoritmi genetici ed ha lo scopo di introdurre all’interno della popolazione nuove caratteristiche, attraverso la modificazione dei singoli geni del cromosoma. L’operatore di mutazione seleziona attraverso un processo casuale il valore da attribuire a ciascun gene della sequenza che codifica il cromosoma, qualora venga passato un test di esecuzione. Il test fissa, come nel caso degli altri operatori genetici, una probabilità (o frequenza) di esecuzione dell’operatore. Se viene estratto un valore casuale inferiore o uguale a quello espresso dalla probabilità di esecuzione dell’operatore, quest’ultimo viene applicato. Il processo di mutazione dal punto di vista dell’ottimizzazione Old chromosome 21 35 59 27 34 31 56 39 15 47 47 21 Mutation rate .150 .150 .150 .301 .239 .034 Random numbers .405 .778 .123 .347 .473 .894 .865 .840 .169 New gene 31 29 New chromosome 21 35 59 27 34 31 56 39 29 47 47 21 Tabella 3.1. Esempio di mutazione dei cromosomi applicata a ciascun gene di ciascun cromosoma combinatoria, rappresenta il meccanismo attraverso il quale l’algoritmo genetico è in grado di esplorare efficacemente lo spazio delle soluzioni. Infatti poichè la funzione obiettivo del problema può presentare dei massimi locali (o dei minimi locali se si considera un problema di minimizzazione), allora al pari di altri meccanismi presenti in altre tecniche quali il tabu search o il simulated annealing, la mutazione permette all’algoritmo genetico di portarsi all’esterno di queste regioni e di proseguire con l’esplorazione dello spazio delle soluzioni. La mutazione rende quindi possibile l’esplorazione dello spazio risolutivo, nonostante sia utilizzata una popolazione di dimensione finita. Sono disponibili molte varianti dell’operatore di mutazione, molte di queste rientrano nell’insieme di operatori specifici per particolari domini applicativi. La versione più semplice prevede l’esecuzione del test per ciascun individuo 34 3.5 – Inversione della popolazione corrente, e la conseguente alterazione del valore di un singolo gene, anch’esso selezionato attraverso un processo casuale. Una variante utilizzata frequentemente in letteratura prevede l’applicazione dell’operatore di mutazione su ciascun gene componente la sequenza del cromosoma. L’utilizzo di questo secondo metodo può risultare molto efficace in diversi contesti applicativi, dato che tende ad alterare i cromosomi in modo più radicale, consentendo un’esplorazione dello spazio risolutivo più efficiente. Tuttavia richiede una maggior attenzione nella scelta del valore di accettazione del test di esecuzione, al fine di evitare che l’evoluzione dell’algoritmo risulti dominata da un processo di ricerca casuale. Ad esempio in tabella 3.1 è riportata l’azione dell’operatore avendo fissato un tasso di mutazione pari a .150. Nell’esempio l’operatore è applicato a tre cromosomi distinti con tre risultati differenti: nel primo caso per nessuno dei quattro geni viene selezionato l’operatore, quindi il cromosoma risultante non è alterato; nel secondo caso il secondo gene della sequenza viene selezionato per la mutazione, essendo il valore casuale estratto interno all’intervallo di applicazione selezionato per la muatzione (.123 < .150), ma l’estrazione casuale del nuovo valore fornisce lo stesso allele, quindi anche in questo secondo caso il cromosoma risultatnte è identico all’originale. Il terzo caso da origine alla selezione del primo gene, che viene mutato estraendo un allele differente, e perciò il cromosoma risultante è differente dal cromosoma originale. In alcuni casi, per evitare un comportamento dell’operatore di mutazione analogo a quello del secondo caso, si implementa la selezione casuale in modo tale da selezionare un allele differente da quello precedente. Questo metodo risulta utile soprattutto se si usano codifiche non binarie. In caso di codifica binaria va però osservato che la frequenza di mutazione viene in realtà raddoppiata, se si implementa l’operatore di selezione in modo da eseguire l’inversione del bit originale del cromosoma. 3.5 Inversione L’operatore di inversione è stato introdotto inizialmente da Holland ed è anch’esso ispirato al comportamento che si osserva nel mondo biologico. Come tutti gli operatori prevede l’accettazione di un test di esecuzione, dipendente da un parametro che ne esprime la probabilità di esecuzione. L’inversione opera su un singolo cromosoma e prevede l’estrazione casuale di due punti all’interno della sequenza genetica, 35 3 – Algoritmi genetici definiti punti di inversione. La regione del cromosoma compresa tra i due punti selezionati, viene invertita in modo che il valore del primo gene compreso nella regione venga scambiato con il valore dell’ultimo, il valore del secondo gene venga scambiato con quello del penultimo, e cosı̀ via fino alla completa inversione della regione. Nella tabella 3.2 è mostrato un esempio di inversione di un cromosoma applicata tra i due punti IP1 e IP2 . La particolarità dell’operatore è quella di non modificare il Before inversion After inversion IP1 G2 IP2 G6 G2 G6 Tabella 3.2. G9 12 G9 12 G8 34 G8 34 G7 5 G7 5 G6 37 G2 3 Chromosome G5 G4 G3 43 29 51 G3 G4 G5 51 29 43 G2 3 G6 37 G1 7 G1 7 G0 10 G0 10 Esempio di inversione del cromosoma valore della funzione di valutazione associato al cromosoma, e quindi quello della fitness, a fronte dello scambio dei geni all’interno della regione di inversione. Questo comportamento richiede che le soluzioni siano codificate in modo che la valutazione associata ad una data sequenza non dipenda dalla posizione relativa dei geni al suo interno. Questo significa che il valore ottenuto dalla funzione di valutazione deve dipendere solo dal valore assunto dai singoli geni e non dallo specifico ordine con cui questi compaiono nella sequenza. Un metodo per ottenere questo è quello di associare a ciascun gene un identificatore e di valutare il cromosoma in funzione dell’ordine dato dagli identificatori associati ai geni. Nonostante sia stato introdotto inizialmente dallo stesso Holland, nella maggior parte dei contesti applicativi l’operatore di inversione non risulta essere particolarmente utile e quindi non è molto utilizzato nello sviluppo di algoritmi e strumenti automatici per il settore dei circuiti VLSI. 3.6 Elementi teorici Uno schema rappresenta l’insieme dei valori assegnati ad un sottoinsieme di geni all’interno del cromosoma, di conseguenza uno schema codifica una soluzione parziale per il problema affrontato e rappresenta quindi un sottoinsieme completamente specificato di possibili soluzioni. Il concetto di schema è stato introdotto dallo stesso 36 3.6 – Elementi teorici Holland, e svolge un ruolo molto importante negli algoritmi genetici in quanto all’interno di un cromosoma, analogamente a quanto avviene nel mondo biologico, vari geni possono essere considerati legati tra loro poichè l’alterazione del valore in un solo gene, mantenendo gli altri invariati, può causare un degrado nel valore della funzione di valutazione. Questo indica che alcune sottosequenze all’interno del cromosoma possono risultare particolarmente efficaci rispetto ad altre. La tecnica di crossover utilizzata per la riproduzione degli individui, si lega al concetto di schema in quanto il crossover piuttosto che combinare geni ha lo scopo di combinare schemi. Ci si aspetta quindi che nel corso delle generazioni schemi piccoli e distribuiti lungo tutto il cromosoma vengano combinati in schemi sempre più lunghi fino ad ottenere la soluzione ottimale. Se si considera una generica soluzione per un problema assegnato, espressa da un cromosoma di lunghezza L, in cui sia stato specificato il valore di m geni e sia stato assegnato un don’t care ai restanti ( L − m ), allora tale soluzione rappresenta uno schema del problema. In particolare la soluzione cosı̀ espressa rappresenta un ( L − m ) iperpiano all’interno dell’iperspazio delle soluzioni, dove ogni punto specificato da un insieme di ( L − m ) valori, è una istanza dello schema. Per uno specifico problema quindi uno schema rappresenta il valore che gruppi di geni devo avere affinchè il cromosoma rappresenti una soluzione con elevato valore della funzione di valutazione. Da questo punto di vista gli algoritmi genetici, nel corso delle diverse generazioni manipolano in parallelo gli schemi e ciò costituisce il vantaggio principale di tali algoritmi rispetto ad altre tecniche di risoluzione di problemi complessi. In particolare l’azione della funzione di selezione permetterà di scegliere in ogni generazione gli individui che presentano gli schemi migliori, permettendo al processo di crossover di combinarli all’interno degli individui figli. Ad ogni generazione quindi ci si aspetta che il numero di individui che presentano schemi favorevoli nel loro patrimonio genetico cresca, e che dimunuisca quello di individui con schemi non utili. Alla luce di quanto esposto si può osservare che un cromosoma, per cui sia specificato un sottoinsieme di geni, rappresenti una regione all’interno dello spazio di ricerca delle soluzioni. La probabilità che i figli generati dal processo di riproduzione si allontanino dalla regione dei genitori dipende dalla distanza relativa dei geni per cui sono specificati i valori, ad esempio se si considera la regione 12 ∗ ∗ 34, la probabilità che vi sia un allontanamento da questa regione per i figli (rottura dello schema) è molto alta indipendentemente dalla scelta del punto di taglio utilizzato dal processo di crossover. Diversamente la regione rappresentata 37 3 – Algoritmi genetici da 12 34 ∗ ∗ è meno soggetta al fenomeno di allontanamento dei figli. L’insieme di geni vicini per cui è specificato un valore è definito blocco costitutivo compatto e la sua importanza è legata al fatto che il processo di crossover precedentemente esposto ha meno probabilità di rompere uno schema e causare l’allontanamento dei figli dalla regione dei genitori, se lo schema presenta dei blocchi costitutivi compatti, inoltre tali blocchi saranno con probabilità proporzionale alla loro fitness presenti nei cromosomi figli. 3.6.1 Teoria degli schemi La teoria degli schemi è stata introdotta inizialmente dallo stesso prof. Holland ed è basata su tre elementi • definizione di schema • lunghezza di uno schema • ordine di uno schema Per comodità di esposizione si fa riferimento ad una codifica binaria dei geni del cromosoma, tuttavia è possibile estendere la trattazione anche al caso di cromosomi codificati su un alfabeto non binario. Uno schema S è definito come una successione di simboli appartenenti all’insieme { 1, 0, ∗ } di lunghezza pari alla lunghezza del cromosoma, dove il simbolo ∗ identifica il valore don’t care. Uno schema rappresenta quindi l’insieme di tutte le sequenze che presentano un valore identico per i simboli differenti da ∗. Sono esempi di sequenze appartenenti allo stesso schema: 101110 101011 dove S è definito come: S = (10 ∗ ∗1∗) Ogni schema con r simboli ∗ rappresenta 2r sequenze binarie differenti, inoltre uno stesso cromosoma può appartenere a più schemi diversi, ad esempio la sequenza binaria 1 0 1 1 1 0 può appartenere contemporaneamente agli schemi: S1 = ( 1 0 ∗ ∗ ∗ 0 ) S2 = ( ∗ 0 ∗ ∗ ∗ 0 ) 38 3.6 – Elementi teorici in questo senso gli algoritmi genetici esplorano in parallelo regioni dello spazio delle soluzioni che si riferiscono agli schemi interni a ciascun individuo, e questo definisce quindi un parallelismo interno anche a ciascun cromosoma. L’ordine R(S) di uno schema S rappresenta il numero di simboli 1 e 0 all’interno dello schema S, mentre la lunghezza ∆(S) di uno schema S rappresenta la massima distanza tra il primo e l’ultimo simbolo 1 o 0 della sequenza S. Lo schema S2 presentato negli esempi precedenti possiede ad esempio ordine R(S2 ) = 2 e lunghezza ∆(S2 ) = 5. Tali notazioni permettono di analizzare in via analitica l’effetto degli operatori di crossover e di mutazione che tendono a rompere gli schemi nella popolazione alterando la struttura delle sequenze genetiche. Inoltre permette di studiare quantitativamente il processo di riproduzione e soppravvivenza degli individui durante l’evoluzione temporale dell’algoritmo genetico. Indichiamo con la notazione m(S, t) l’insieme di m cromosomi nella popolazione aventi lo schema S alla generazione t del processo di evoluzione dell’algoritmo genetico. Se consideriamo l’individuo i-esimo con un valore della funzione fitness pari a fi , allora la probabilità di essere selezionato dal processo di riproduzione è espressa come: fi Pi = PP op−1 fi 0 Se la popolazione è composta da P op individui allora si può determinare il numero di cromosomi che presenteranno lo schema S nella generazione successiva t + 1, sapendo che il processo di selezione sceglie, per la riproduzione, gli individui proporzionalmente al valore della loro fitness. Quindi si ha che: f ∗ (S) m(S, t + 1) = m(S, t) · P op · PP op−1 fi 0 dove f ∗ (S) rappresenta la fitness media relativa agli individui contenenti lo schema S alla generazione t. Se indichiamo con PP op−1 α= 0 fi P op l’adattamento medio della popolazione alla generazione t, allora la precedente relazione si può riscrivere come m(S, t + 1) = m(S, t) · 39 f ∗ (S) α 3 – Algoritmi genetici Questo significa che è possibile esprimere la velocità di sviluppo della popolazione come rapporto tra il valore di adattamento medio degli individui aventi lo schema S e il valore di adattamento medio dell’intera popolazione. Questo implica che gli schemi S che presentano un valore di adattamento medio superiore a quello dell’intera popolazione (cioè gli schemi per cui vale f ∗ (S) ≥ α) si presenteranno in un numero crescente di cromosomi nel corso dell’evoluzione dell’algoritmo, viceversa gli schemi per cui si ha un adattamento medio inferiore (cioè per cui vale f ∗ (S) < α) si presenteranno con una frequenza decrescente nel corso dell’evoluzione. Tuttavia va considerato che nel processo di riproduzione sono coinvolti sia l’operatore di crossover sia quello di mutazione, che pertanto influiscono sul valore m(S, t + 1) atteso. Se prendiamo in considerazione l’operatore di crossover, la probabilità che uno schema S sia distrutto durante la riproduzione è uguale alla probabilità che il punto di taglio Cp scelto casualmente cada all’interno dello schema. Tale probabilità si esprime con la relazione: ∆(S) Pd (S) = l−1 dove l è la lunghezza del cromosoma, mentre la probabilità di sopravvivenza dello schema è data da: Pa (S) = 1 − Pd (S) Ricordando che l’operatore di crossover viene applicato con una probabilità uguale a Pc si ottiene la seguente relazione per ciò che riguarda la probabilità di sopravvivenza dello schema S: 0 Pa (S) = 1 − Pc · Pd (S) A questo punto è possibile prendere in considerazione l’azione dovuta all’operatore di mutazione. Definendo la probabilità di mutazione di un singolo gene come Pm ed essendo l’evento di mutazione di un gene indipendente dalla mutazione degli altri geni, la probabilità che uno schema non venga perso a causa dell’esecuzione dell’operatore (uno schema viene perso se viene mutato un gene avente allele pari a 1 o 0) è espressa dalla relazione esponenziale: Pam (S) = (1 − Pm )R(S) che per basse frequenze di mutazione può essere approssimata come 1 − Pm · R(S). A questo punto è possibile combinare gli effetti degli operatori di crossover e di mutazione al calcolo del numero atteso di cromosomi aventi schema S nella generazione 40 3.6 – Elementi teorici successiva, ottenendo la relazione finale m(S, t + 1) = m(S, t) · f ∗ (S) · [1 − (Pc · Pd (S) + Pm · R(S))] α che esprime il teorema degli schemi. Teorema degli schemi: schemi di piccola lunghezza, basso ordine e adattamento sopra la media vengono verificati 1 con una frequenza esponenzialmente crescente nelle generazioni successive dell’algoritmo genetico. Ipotesi dei blocchi costitutivi: un algoritmo genetico ricerca la soluzione ottima di un problema mediante il processo di composizione di schemi di piccola lunghezza, basso ordine e adattamento sopra la media chiamati blocchi costitutivi. 3.6.2 N-point crossover Sebbene la tecnica base per il crossover descritta nel paragrafo 3.3 sia stata ispirata dalla controparte biologica, il processo di crossover con un solo punto di taglio soffre di alcune limitazioni legate alla manipolazione di schemi. Poichè nel corso Chromosome1 Chromosome2 G11 1 * G10 * * G9 0 * G8 * * G7 * 0 G6 * * G5 * 1 G4 * * G3 * * G2 * * G1 * * G0 1 * Tabella 3.3. Cromomosomi contenenti due schemi efficaci che la tecnica 1-point crossover non è in grado di combinare dell’evoluzione ci si aspetta che la popolazione presenti via via un numero sempre maggiore di individui i cui schemi migliori vengano aggregati fino a formare la soluzione completa, allora si osserva come la tecnica basata su un solo punto di taglio abbia potenzialmente un limite. Infatti mano a mano che aumenta negli individui la dimensione degli schemi efficaci, il crossover con un solo punto di taglio risulta inefficace nel combinarli senza subire perdite. Ad esempio in tabella 3.3 è mostrata una coppia di cromosomi con codifica binaria, ciascuno dei quali possiede 1 Si dice che uno schema viene verificato quando vengono aggiunte nuove soluzioni a quelle già rappresentate dallo schema stesso 41 3 – Algoritmi genetici uno schema efficace, che si desidera poter combinare nei figli. Tuttavia qualsiasi sia la scelta del punto di taglio, la tecnica base di crossover non sarà in grado di combinare tali schemi, che andranno perciò in parte persi nella generazione successiva. In letteratura sono state proposte tecniche alternative [6, 7, 9] che si sono dimostrate più efficaci nella manipolazione degli schemi. In generale tali tecniche suddividono il cromosoma in N + 1 regioni individuate da N punti di taglio. La versione più utilizzata è quella con indice N = 2 denominata two-point crossover, la quale fornisce buoni risultati in diversi contesti applicativi. Ad esempio è possibile applicare la tecnica di crossover a due punti di taglio ed ottenere la combinazione degli schemi efficaci presenti nell’esempio di tabella 3.3, selezionando come punti di taglio rispettivamente CP1 = 4 e CP2 = 7. Il cromosoma viene diviso in tre regioni Figura 3.4. Two-point crossover dai punti di taglio CP1 e CP2 . Tali regioni, indicate come L, C ed R, rappresentano rispettivamente l’area precedente il punto di taglio CP1 , quella compresa tra i due punti di taglio e quella successiva al punto di taglio CP2 . Indicando con P 1 e P 2 i due cromosomi genitori e con C1 e C2 i due rispettivi cromosomi figli, allora valgono rispettivamente per C1 e per C2 le relazioni seguenti: Child 1 C1L = P 1L C1C = P 2C C1R = P 1R 42 3.7 – Adattamento dei parametri Child 2 C2L = P 2L C2C = P 1C C2R = P 2R inoltre vale la seguente relazione per i due punti di taglio: CP1 ≤ CP2 Come caso estremo è stata proposta una versione del crossover denominata uniform crossover in cui ciascun gene del cromosoma rappresenta una regione. In questo caso una sequenza binaria casuale, definita template, e la sua complementare permettono di scegliere per ciascuno dei due figli il materiale genetico proveniente dai genitori. La scelta del numero di punti di taglio e della relativa tecnica di crossover dipende comunque dalla lunghezza dei cromosomi. Un elevato valore dell’indice N risulta sicuramente più vantaggioso se i cromosomi hanno una lunghezza elevata (ad esempio se sono codificati da sequenze binarie sufficientemente lunghe), mentre per cromosomi che mantengono una lunghezza relativamente corta tale scelta non comporta miglioramenti. 3.7 Adattamento dei parametri Gli algoritmi genetici utilizzano un insieme di operatori per manipolare le sequenze genetiche che codificano la soluzione per il problema considerato. L’applicazione di questi operatori è determinata da un insieme di parametri di ingresso, che definiscono la probabilità (o frequenza) di esecuzione degli operatori stessi (execution rate). La determinazione dell’insieme ottimale dei parametri (parameters tuning) è molto importante, perchè in base all’insieme di parametri che si utilizzano il comportamento dell’algoritmo può variare di molto. Tuttavia tale scelta richiede la risoluzione di un problema di ottimizzazione complessa. La tecnica più semplice per selezionare l’insieme ottimale consiste nell’eseguire l’ottimizzazione manuale dei parametri di ingresso, conducendo una serie di esperimenti in cui questi vengono variati e rispetto ai quali si registra l’efficacia dell’algoritmo genetico nell’individuare la soluzione ottimale del problema. Per poter eseguire i test è necessario utilizzare un insieme iniziale di valori ragionevoli per il contesto applicativo e poi proseguire i test applicando le variazioni. In linea generale se si considerano i due operatori principali, il crossover e la mutazione, si eseguirà una scelta iniziale 43 3 – Algoritmi genetici tale per cui la probabilità di esecuzione del crossover sia sufficientemente elevata per garantire l’incrocio degli individui e quindi massimizzare il processo di evoluzione (cercando quindi di minimizzare l’effetto di stagnazione e omogeneizzazione della popolazione), mentre la probabilità di esecuzione dell’operatore di mutazione sarà al contrario sufficientemente piccola da evitare che l’algoritmo venga guidato da un processo casuale. Essendo un problema di ottimizzazione complessa, Ken DeJong ha dedicato una larga parte del suo lavoro di dottarato nel ricercare manualmente l’insieme ottimale di parametri per un algoritmo genetico classico, che fossero applicabili ad un insieme di funzioni numeriche da ottimizzare. Un secondo metodo consiste nell’adozione di tecniche automatiche di selezione dinamica dei parametri ottimali di ingresso. Tra le tecniche disponibili vi è l’impiego di un algoritmo genetico esterno a quello per cui si devono ottimizzare i parametri. I parametri dell’algoritmo genetico esterno sono selezionati manualmente sulla base di valori ragionevoli, tenendo conto del fatto che quest’ultimo è molto meno sensibile alle variazioni dei parametri di ingresso rispetto all’algoritmo interno. Questo approccio è stato utilizzato ad esempio da John Grefenstette per selezionare i valori ottimi di un algoritmo genetico classico per lo stesso insieme di funzioni numeriche utilizzate da DeJong. Più recentemente si è diffuso l’uso di tecniche di adattamento dinamiche alternative definite adapting techniques. Queste sono basate sull’attribuzione di un costo a ciascuno degli operatori genetici utilizzati nell’algoritmo. Durante l’esecuzione viene calcolato il costo da attribuire a ciascun operatore in base all’efficacia dell’applicazione di quest’ultimo. L’efficacia viene determinata dal valore della funzione di fitness associata a ciascun cromosoma. Maggiore è l’efficacia di una soluzione e minore sarà il costo associato agli operatori da cui quella soluzione deriva, diversamente il costo degli operatori associati ad una soluzione verrà incrementato. Il costo di un operatore è quindi dinamicamente collegato con il valore dei parametri di ingresso e viene modificato dinamicamente nel corso dell’esecuzione dell’algoritmo. 44 Capitolo 4 Modelli di guasto e algoritmi di collaudo Un modello di guasto permette di descrivere il comportamento di un circuito in cui sia presente un difetto e tale descrizione può essere eseguita a diversi livelli di astrazione. Dato un circuito in cui sia presente un difetto fisico, è possibile descriverne il comportamento utilizzando una descrizione comportamentale di alto livello basata in generale sull’uso del linguaggio VHDL o Verilog. Con un livello di astrazione minore si descrive il circuito difettoso mediante diagrammi di stato (catene di Markov), che permettono di rappresentare la FSM propria del circuito (descrizione funzionale). In entrambe i casi il circuito è visto come una black box di cui si è in grado di descrivere il funzionamento ma per la quale non sono disponibili informazioni strutturali. Riducendo il livello di astrazione il circuito viene rappresentato, a livello strutturale, attraverso la rete di porte logiche e flip-flop che ne implementano il funzionamento. In questo caso un insieme di pattern binari di ingresso permettono di evidenziare il diverso comportamento del circuito rispetto a quello privo di difetti (descrizione logica). Ulteriori riduzioni del livello di astrazione consentono di rappresentare il circuito difettoso a livello elettrico e a livello geometrico. Nel primo caso il circuito è rappresentato da una rete elettrica di dispositivi elementari (transistor, resistori, condensatori) e il difetto è modellato come componente elettrico inserito nella rete (modello elettrico), mentre nel secondo caso sia il circuito sia il difetto vengono descritti a livello fisico tenendo conto delle proprietà geometriche e fisiche dei componenti (modello geometrico). Tenendo conto di caratteristiche quali la densità 45 4 – Modelli di guasto e algoritmi di collaudo Figura 4.1. Livelli di astrazione per la descrizione dei guasti di componenti e la regolarità strutturale, i difetti presenti nei circuiti di memoria sono solitamente analizzati a livello elettrico e in alcuni casi a livello geometrico. Tuttavia l’analisi condotta a questo livello non è utilizzabile in alcuni contesti industriali. Inoltre non permette la realizzazione di strutture di MBIST integrate per l’esecuzione del test, per le quali si utilizzano descrizioni di tipo funzionale. Poichè le memorie a semiconduttore sono i dispositivi con la più alta densità di transistor presenti su un circuito digitale e sono formate da molte componenti con funzionamento analogico e caratterizzate da un struttura estremamente regolare, per assicurare una elevata copertura dei guasti e ottenere test efficienti sono necessari modelli di guasto accurati. 4.1 Modelli di guasto In letteratura sono stati proposti modelli di guasto specifici per i dispositivi di memoria, tenendo conto delle particolari caratteristiche di questo tipo di sistemi. Sono stati inoltre proposti strumenti utili alla modellazione dei difetti, come per esempio l’introduzione del concetto di guasto accoppiato (linked fault) che permette di rappresentare difetti difficili da testare. Data la crescente introduzione di nuovi 46 4.1 – Modelli di guasto modelli derivanti da esperimenti di fault injection o da simulazioni, si è resa necessaria la definizione di una descrizione formale dei modelli di guasto e di una loro classificazione. In generale i guasti in una memoria possono interessare tre blocchi funzionali di alto livello: • guasti localizzati nella matrice di memoria; • guasti localizzati nella logica di indirizzamento; • guasti localizzati nella logica R/W; In generale la classificazione fa riferimento ai guasti localizzabili nella matrice di memorizzazione, in quanto i guasti localizzati nelle altre aree sono riconducibili come effetto ai primi. Tale scelta è inoltre stata dettata dalla maggiore frequenza con cui i guasti si presentano nella matrice di memorizzazione piuttosto che in altre zone del dispositivo di memoria. Si consideri il modello di un disposistivo di memoria descritto ad alto livello, eseguendo un determinato numero di operazioni e osservando il comportamento delle diverse unità funzionali, si definisce guasto la differenza tra il comportamento osservato nel dispositivo in esame e il comportamento previsto per il sistema in assenza di difetti. In questo senso una sequenza di operazioni, che applicate al dispositivo in esame produce una differenza di comportamento rispetto al circuito privo di difetti, è detta sensitizing operation sequence (sequenza di eccitazione) S, mentre la differenza di comportamento del circuito difettoso rispetto a quello atteso è definita fault behaviour (comportamento del guasto) F . Un modello formale di guasto è quindi esprimibile attraverso la sequenza di eccitazione S e il comportamento del guasto F , a cui si aggiunge il valore R letto dal dispositivo, qualora la sequenza S contenga un’operazione di lettura sulla cella guasta. In letteratura [10] la definizione cosı̀ data di modello di guasto formale è chiamata fault primitive (primitive di guasto) FP ed è rappresentata dalla notazione: hS/F/Ri L’insieme non vuoto di più primitive di guasto, utilizzate per descrivere la stessa classe di guasto, è chiamato functional fault model (modello di guasto funzionale) 47 4 – Modelli di guasto e algoritmi di collaudo FFM. Per esempio la classe di guasto dei transition fault TF è rappresentata dall’insieme delle due primitive di guasto: TF : {h1W 0/1/−i} 0 TF TF1 : {h0W 1/0/−i} 4.2 Classificazione delle primitive di guasto I modelli di guasto formali indicati come fault primitive possono essere classificati in base a tre diversi elementi: • numero di porte del dispositivo di memoria in esame (#P ), il quale determina il numero di operazioni simultanee richieste per ciascuna porta dalla sequenza di eccitazione S. In base a questo parametro vengono distinte le fault primitive che operano su dispositivi a porta singola rispetto ai dispositivi multiporta; • numero di operazioni richieste dalla sequenza S affinchè il guasto venga eccitato (#O) e si abbia un comportamento diverso rispetto a quello atteso. In base a questo parametro si definiscono modelli statici quelli caratterizzati da una sequenza S a lunghezza unitaria, mentre si definiscono modelli dinamici quelli caratterizzati da una lunghezza della sequenza S strettamente superiore a uno; • meccanismo attraverso il quale si manifestano i guasti. In questo caso si distingue tra guasti semplici e guasti linked, dove i primi si manifestano in modo indipendente dalla presenza di altri, i secondi sono invece caratterizzati dal fatto che si manifestano in modo dipendente da altri guasti e per tale motivo sussiste un accoppiamento tra questi. In figura 4.2 è riportato l’albero di classificazione dei modelli di guasto, definiti attraverso le primitive di guasto. Se si analizza in maggior dettaglio l’insieme dei parametri di classificazione, si parla di guasti a porta singola se l’eccitazione avviene con una sequenza applicata al più ad una singola porta per cui vale #P ≤ 1, mentre si ha un guasto multiporta per #P > 1 . In genere i guasti caratterizzati da #P > 1 sono più complessi da testare e richiedono pattern di collaudo specifici. Il secondo parametro esprime il numero di operazioni che devono essere contenute nella sequenza S affinchè si verifichi l’eccitazione del guasto. Se si ha una sequenza di eccitazione 48 4.2 – Classificazione delle primitive di guasto Figura 4.2. Classificazione dei modelli di guasto per cui vale #O ≤ 1 allora si classifica il guasto come statico, altrimenti per #O > 1 il guasto è definito dinamico. Con l’avanzamento delle tecnologie di integrazione e con l’aumento a bordo dei circuiti digitali sia del numero di dispositivi di memoria sia della loro densità, i guasti dinamici sono aumentati in termini di frequenza con cui si manifestano. Nuovamente la loro individuazione richiede la costruzione di pattern di collaudo oppurtuni, essendo molto difficili da testare. L’ultimo parametro permette di distinguere tra guasti il cui comportamento è indipendente o meno da quello di altri. Se l’eccitazione di un guasto dipende dall’eccitazione di altri guasti, allora lo si definisce di tipo linked (accoppiato). Anche per questa categoria sono richiesti opportuni pattern di test e la loro individuazione è considerata, anche in questo caso, complessa dal punto di vista del test. Poichè il comportamento di un guasto influenza quello di altri, rispetto ai quali esiste un accoppiamento, è possibile che alcuni guasti mascherino la presenza di altri, per questo motivo le sequenze di collaudo devono essere strutturate in modo appropriato. Va invece osservato che per quanto riguarda i guasti semplici (non accoppiati) questi possono essere ulteriormente suddivisi in guasti relativi ad una singola cella di memoria (single-cell fault) o guasti che coinvolgono più celle della matrice di memoria (multi-cell fault). Per lo svolgimento di questo lavoro si è fatto riferimento, rispetto alla classificazione qui introdotta, all’analisi di difetti fisici che danno luogo a guasti classificabili come single-port. 49 4 – Modelli di guasto e algoritmi di collaudo 4.2.1 Guasti di natura statica Considerando i modelli formali riferiti ad una singola cella, la notazione hS/F/Riv permette di specificare la primitiva di guasto relativa alla cella vittima difettosa. In particolare la sequenza S di eccitazione e il comportamento F del guasto saranno riferiti alla stessa cella della matrice di memoria. La sequenza di eccitazione per Tabella 4.1. # 1 FFM SF 2 TF 3 WDF 4 RDF 5 DRDF 6 IRF FP SF0 SF1 TF0 TF1 WDF0 WDF1 RDF0 RDF1 DRDF0 DRDF1 IRF0 IRF1 description h1/0/−i h0/1/−i h1W 0/1/−i h0W 1/0/−i h0W 0/1/−i h1W 1/0/−i h0R0/1/1i h1R1/0/0i h0R0/1/0i h1R1/0/1i h0R0/0/1i h1R1/1/0i Modelli di guasto funzionale a singola cella semplici i guasti statici, viene specificata attraverso la sequenza iOd, dove i rappresenta il valore iniziale presente nella cella, O l’operazione che deve essere applicata alla cella e d il dato che viene utilizzato nell’operazione. In particolare l’inizializzazione della cella può essere ottentuta a livello pratico attraverso un ciclo preventivo di scrittura in cui il dato scritto coincida con il pattern specificato da i, mentre per quanto riguarda il valore d questo deve essere interpretato differentemente a seconda dell’operazione applicata: • O = write : il pattern specifica il valore che verrà scritto all’interno della cella; • O = read : il pattern specifica il valore atteso dall’operazione di lettura, e non il valore letto dalla cella che viene specificato dall’elemento R che definisce la primitiva di guasto. Questo significa che il valore R appartiene all’insieme {0, 1} solo in presenza di una operazione di lettura all’interno della sequenza di eccitazione S, mentre negli altri 50 4.2 – Classificazione delle primitive di guasto casi vale −. Essendo le sequenze di eccitazione della forma iOd è facile verificare che sono possibili 12 modelli di guasto formali identificati dalle 12 primitive rappresentate nella tabella 4.1, le quali formano 6 modelli funzionali (FFM). A questi possono essere aggiunti due ulteriori modelli funzionali definiti stuck-at fault (SAF) e stuck-open fault (SOF), caratterizzati rispettivamente dalle primitive: SAF : {h1/0/−i, h0W 1/0/−i, h0/1/−i, h1W 0/1/−i} SOF : {h0W 1/0/−i, h1W 0/1/−i, h0R0/0/1i, h1R1/1/0i} I singoli modelli funzionali di guasto esposti in precedenza, ai quali si aggiunge la definizione del guasto DRF, possono essere descritti come segue: • state fault (SF): una cella cv è soggetta ad un guasto SF se il suo stato cambia in assenza di operazioni di eccitazione, in tal senso il guasto viene a dipendere dal valore con cui è inizializzata la memoria e quindi la cella; • transition fault (TF): una cella cv si dice soggetta ad un guasto TF se fallisce la transizione di stato (1 → 0 oppure 0 → 1) durante un’operazione di scrittura; • read destructive fault (RDF): una cella cv si dice soggetta ad un guasto RDF se l’esecuzione di un’operazione di lettura sulla cella ne comporta il cambiamento di stato e la restituzione di un valore non corretto in uscita; • deceptive read destructive fault (DRDF): una cella cv è soggetta ad un guasto di tipo DRDF se un’operazione di lettura cambia lo stato della cella ma restituisce un valore corretto in uscita; • incorrect read fault (IRF): la cella cv è soggetta ad un guasto di tipo IRF se l’esecuzione di un’operazione di lettura riporta in uscita un valore errato, anche se la cella mantiene l’informazione di stato corretta; • data retention fault (DRF): la cella cv è soggetta ad un guasto DRF se perde l’informazione di stato in essa immagazzinata dopo un determinato intervallo di tempo dall’ultima scrittura del valore in essa contenuto; • write destructive fault (WDF): si dice che la cella cv è soggetta ad un guasto WDF se la scrittura del valore corrispondente allo stato corrente ne cambia il contenuto; 51 4 – Modelli di guasto e algoritmi di collaudo • stuck-at fault (SAF): si dice che la cella cv è soggetta ad un guasto SAF se lo stato della cella non può essere cambiato da nessuna operazione eseguita sulla cella stessa, e non è influenzabile da altre celle della matrice di memoria; • stuck-open fault (SOF): la cella cv si dice soggetta ad un guasto di tipo SOF se è impossibile accedere alla cella stessa. 4.2.2 Guasti di natura dinamica I modelli formali per guasti di natura dinamica sono caratterizzati da una sequenza di operazioni, appartenenti alla sequenza S di eccitazione, esprimibile come iO1 d1 ...On dn , con n ≥ 2. Se si considerano sempre guasti relativi alla singola cella, allora si possono descrivere i seguenti modelli di guasto funzionali: • dynamic transition fault (dTF): una cella cv è soggetta ad un guasto di tipo dTF se un’operazione di scrittura che segue immediatamente un’operazione di lettura o di scrittura fallisce; • dynamic read destructive fault (dRDF): una cella cv si dice soggetta ad un guasto dRDF se un’operazione di lettura sulla cella, che segue una precedente operazione di scrittura, ne cambia lo stato e restituisce in uscita un valore errato; • dynamic deceptive read destructive fault (dDRDF): una cella cv si dice soggetta ad un guasto dDRDF se un’operazione di lettura sulla cella, che segue una precedente operazione di scrittura, cambia lo stato della cella ma restituisce un valore corretto in uscita; • dynamic incorrect read fault (dIRF): si dice che una cella cv è soggetta ad un guasto di tipo dIRF se un’operazione di lettura, immediatamente successiva ad un’operazione di scrittura sulla cella, causa la restituzione di un valore errato in uscita anche se la cella rimane nello stato corretto; • dynamic write destructive fault (dWDF): si dice che la cella cv è soggetta ad un guasto dWDF se l’esecuzione di un’operazione di scrittura non transitiva (0 → 0 oppure 1 → 1), immediatamente successiva ad un’operazione di lettura o scrittura, causa il cambiamento di stato della cella. 52 4.3 – Pattern di collaudo 4.3 Pattern di collaudo Una pattern di collaudo è rappresentato da una sequenza di operazioni applicate al dispositivo di memoria, con lo scopo di individuare comportamenti anomali nelle sue varie componenti. Dato un dispositivo composto da N celle, la soluzione risiede apparentemente nell’esecuzione di tutte le possibili combinazioni di operazioni applicate alle N celle della memoria (test esaustivo). Tuttavia quando il numero delle celle è molto elevato, come accade nei dispositivi di memoria reali, tale approccio risulta non praticabile. Per esempio, l’esecuzione di un test esaustivo su di una memoria cache da 32 KB alla frequenza di 100 MHz, richiederebbe 1078,903 anni per essere completato. Un semplice pattern di collaudo composto dalla sequenza di operazioni: { m W 0, m R0, m W 1, m R1 } risulta inefficace rispetto all’elevato numero di guasti che possono verificarsi. Il suo utilizzo darebbe origine a test di bassa qualità caratterizzati da bassa percentuale di copertura dei guasti. Risulta quindi evidente la necessità di test che assicurino elevate percentuali di copertura per il maggior numero possibile di guasti, mantenendo allo stesso tempo accettabile la loro complessità. La complesità del test, misurata come numero di operazioni richieste dallo stesso, è un parametro importante nella valutazione del pattern di collaudo. Un test che assicuri un’elevata percentuale di copertura dei guasti ma che sia molto complesso, richiederebbe comunque una quantità di tempo elevata per essere portato a termine, rendendolo di fatto inutilizzabile. In letteratura [3] sono state definite tre principali classi di pattern di collaudo: walking, marching e galloping. Un walking pattern prevede che la memoria sia inizializzata con lo stesso valore in tutte le celle e che sempre solo una cella (o il gruppo di celle che forma la parola nelle memorie word oriented) sia in uno stato differente dalle altre. Questo richiede che prima di analizzare la cella successiva della matrice di memoria lo stato iniziale della cella corrente deve essere ripristinato. Un marching pattern (march test) ammette invece la possibilità che nel passaggio da una cella a quella successiva, la cella precedente rimanga in uno stato differente da quello di inizializzazione. Quindi durante il test la memoria perde il valore di inizializzazione a favore dei nuovi stati introdotti nelle celle dal test stesso. Un galloping pattern, diversamente dalle due precedenti classi di test, usa una descrizione più orientata agli indirizzi, in particolare per ogni cella base considerata, il test accede a tutte le altre 53 4 – Modelli di guasto e algoritmi di collaudo celle della memoria. Questo rende i test basati sui galloping pattern molto efficaci ma estremamente onerosi dal punto di vista del tempo di esecuzione e pertanto non utilizzabili, soprattutto in ambienti industriali. La scelta a livello industriale ricade invece sui march test perchè più flessibili ed efficaci rispeto ai test basati su walking pattern. Pertanto per lo svolgimento di questo lavoro si è orientato lo strumento automatico di generazione verso sequenze di collaudo basate sui marching pattern. 4.4 March test Un march test è una sequenza di operazioni elementari eseguite sul dispositivo di memoria (modellato come una black box), rispetto al quale rimangono accessibili solo i segnali d’interfaccia con il mondo esterno. Pertanto l’informazione disponibile per la definizione del test riguardo al dispositivo di memoria è limitata al modo con cui le singole operazioni sono applicate attraverso il bus d’interfaccia e alla sua struttura. Un march test è formalmente definito come una sequenza finita di elementi chiamati march element. Un march element M è costituito da una sequenza finita di operazioni applicate a ciascuna cella o parola della matrice di memorizzazione, prima di generare l’indirizzo successivo e riapplicare la stessa sequenza. L’indirizzo di memoria viene generato in accordo ad uno specifico address order e gli address order ammessi in un march element sono: m (irrilevante), ⇑ (ascendente) e ⇓ (discendente). Le operazioni ammesse in un march test sono quattro: • Wp : scrive il pattern p nella parola di memoria; • Wp̄ : scrive il pattern inverso p̄ nella parola di memoria; • Rp : legge il contenuto della parola di memoria e verifica che corrisponda al pattern p; • Rp̄ : legge il contenuto della parola di memoria e verifica che corrisponda al pattern p̄; Nel caso di memorie con parole di memoria a singolo bit i pattern p e p̄ corrispondono rispettivamente ai valori logici 0 e 1. Un march element M è delimitato da una coppia di parentesi tonde ’( ... )’, mentre un march test completo è delimitato da una coppia di parentesi graffe ’{ ... }’. I singoli march element M0 ... Mn all’interno 54 4.4 – March test di un march test sono separati dal simbolo ’;’ mentre le singole operazioni all’interno di un march element sono separate dal simbolo ’,’. Questa notazione permette di esprimere formalmente il concetto di march test: Mk M0 z }| { z }| Mn { z }| { { ⇑ (O0 , · · · ,Or ); · · · ; ⇓ (O0 , · · · ,Os ); · · · ; m (O0 , · · · ,Ot ) } I modelli di guasto funzionali descritti rappresentano difetti fisici che si manifestano nel circuito di memoria durante il processo di fabbricazione e che con maggiore frequenza coinvolgono la matrice di memoria. Molti di questi difetti (modellati spesso a livello geometrico come difetti di tipo spot) sono dovuti a difetti del processo di fabbricazione che si manifestano fisicamente come connessioni sul chip interrotte, cortocircuiti tra le connessioni, mancanza di contatti, contatti extra, diodi o transistor parassiti. Molti dei difetti fisici che si presentano all’interno della matrice di memoria possono essere modellati, a livello elettrico, come guasti di natura resistiva ed è questa classe di difetti che è stata presa in considerazione nello svolgimento di questo lavoro. Bisogna infine osservare che le primitive di guasto presentate nel capitolo, possono essere facilmente tradotte in sequenze di collaudo secondo la sintassi dei march test esposta in precedenza. In particolare la sequenza di sensibilizzazione S può essere tradotta in un insieme di operazioni, eventualmente codificate come march element separati, contenente una fase di inizializzazione eseguita con un’operazione di scrittura seguita dalle operazioni proprie della fase di eccitazione del guasto. Il comportamento del guasto F può essere invece osservato con una operazione di lettura posta alla fine della sequenza di eccitazione. 55 Capitolo 5 Generazione automatica di march test Tra gli algoritmi di collaudo per dispositivi di memoria, i march test sono quelli maggiormente utilizzati in campo industriale per via della loro complessità, che risulta essere lineare nel numero di operazioni eseguite. Gli algoritmi genetici descritti nel capitolo 3 sono stati impiegati con successo sia nella risoluzione di problemi di ottimizzazione combinatoria, sia nel design di circuiti digitali a larghissima scala di integrazione. Questo capitolo analizza l’architettura dello strumento per la generazione automatica di march test, basato su un algoritmo genetico, a partire dalle informazioni sulla struttura a livello elettrico della memoria SRAM. 5.1 Architettura dello strumento per la generazione di march test Lo strumento per la generazione automatica delle sequenze di collaudo, la cui architettura è rappresentata in figura 5.1, è stato realizzato in linguaggio C all’interno dell’ambiente di sviluppo Microsoft Visual Studio 2003. Inizialmente l’algoritmo acquisisce le informazioni relative ai file contenenti la descrizione del circuito di memoria (netlist) non difettoso e di quello difettoso. Poichè la netlist del circuito può essere suddivisa, per maggiore flessibilità, in più file ciascuno contenente la descrizione di un modulo della memoria (e.g un file contiene la descrizione della cella, un secondo la descrizione del circuito di precarica, ecc), in questa prima fase si procede a generare 56 5.1 – Architettura dello strumento per la generazione di march test Figura 5.1. Architettura generale dello strumento per la generazione automatica di march test il file contenente il modello completo della memoria. Contestualmente a questa fase, vengono acquisiti i vari parametri utilizzati dall’algoritmo genetico durante la fase di ricerca. In base alla dimensione della popolazione, mantenuta costante durante tutta l’esecuzione, viene generato un file specifico per ciascun individuo della popolazione, per ciascuno dei due modelli di memoria. Ogni file conterrà la descrizione temporale dei diversi segnali applicati all’interfaccia. Successivamente si entra nel ciclo di evoluzione delle sequenze di collaudo, in cui viene fatta evolvere la popolazione iniziale attraverso il meccanismo di selezione e l’applicazione degli operatori genetici. Ogni iterazione del ciclo corrisponde al passaggio da una generazione a quella successiva. Durante l’intero ciclo la popolazione acquisisce i caratteri genetici che forniscono una migliore soluzione del problema. Il ciclo di evoluzione viene interrotto quando viene verificata la condizione di copertura del guasto da parte della soluzione corrente, oppure quando si raggiunge il limite massimo di iterazioni previsto. In questo caso viene generato il file di uscita (report file) con la soluzione individuata e il file contenente la sequenza temporale 57 5 – Generazione automatica di march test dei segnali d’interfaccia, associata alla soluzione. Al suo interno il ciclo prevede la validazione della popolazione corrente e la sua scrittura su file, sotto forma di sequenza temporale relativa ai segnali d’interfaccia. Un simulatore esterno permette l’esecuzione delle simulazioni a livello elettrico dei cromosomi. Ogni sequenza temporale associata ad un individuo della popolazione è applicata sia al modello della memoria difettoso, sia a quello non difettoso. Terminata questa fase il ciclo prevede la lettura dei risultati delle simulazioni; in base alla valutazione di questi si determina l’esistenza di una nuova soluzione (ed eventualmente la terminazione del ciclo, qualora la funzione di controllo della copertura del guasto restituisca un responso positivo) e si procede all’applicazione degli operatori genetici (selezione, crossover, mutazione e alterazione della lunghezza del march test), ottenendo la popolazione associata alla generazione successiva. 5.2 Codifica della soluzione La prima fase della definizione dell’algoritmo genetico consiste nello stabilire un’opportuna codifica per una generica soluzione del problema. Poichè nel nostro caso una generica soluzione è data da una sequenza di operazioni strutturate secondo un march test, è stato necessario codificare a livello di cromosoma, la struttura di un generico march test, come è possibile osservare in figura 5.2. Le singole operazioni che costituiscono ciascun march element devono poter rappresentare il pattern di segnali digitali applicati all’interfaccia di memoria. Inoltre la codifica utilizzata deve poter indicare l’inizio e la fine di ciascun march element e l’address order utilizzato. Nella definizione della codifica, si può scegliere di lavorare con un alfabeto binario oppure con un alfabeto non binario. Ciascuna di queste due scelte pone dei vincoli sulla successiva definizione degli operatoti genetici sia classici, sia specifici del problema trattato. Entrambe le codifiche sono state utilizzate nella realizzazione di strumenti di sintesi automatica di sequenze di collaudo per circuiti combinatori e sequenziali [6]. L’utilizzo della codifica binaria permette di esplicitare direttamente il valore dei segnali digitali applicati all’interfaccia di memoria (l’insieme dei segnali specifica l’operazione da eseguire), l’inizio e la fine di ciascun march element e l’address order. La scelta di utilizzare questo tipo di codifica porta alla definizione di operatori genetici classici, quali il crossover e la mutazione di tipo 58 5.2 – Codifica della soluzione Figura 5.2. Codifica a livello genetico della singola operazione binario, in grado di operare sul singolo segnale binario (gene). Poichè non sempre tutte le configurazioni dei segnali sono ammissibili a livello di interfaccia, si ha l’esigenza di definire un operatore di validazione degli individui della popolazione. L’azione di tale operatore risulta più complessa con una codifica binaria dei geni. Inoltre ciascun gene sarà rappresentato internamente alla macchina con variabili intere (tipicamente su 32 bit o su 64 bit) con un conseguente spreco di memoria, soprattutto se si considerano modelli di memoria realistici in cui l’interfaccia può essere costituita da diverse decine di bit. Nello sviluppo dello strumento per la generazione automatica di march test la scelta è ricaduta sul metodo di codifica non binario. Ciascun gene è rappresentato da una variabile intera, definita su 32 bit o 64 bit a seconda dell’architettura in uso. Il valore di ciascun gene in questo caso specifica l’insieme dei segnali d’interfaccia (operazione eseguita sulla memoria), piuttosto che il singolo segnale. L’eventuale adozione di modelli di memoria dotati di interfacce molto grandi richiede di estendere la rappresentazione di ciascun gene ad un gruppo di variabili intere e una parziale ridefinizione degli operatori in uso, continuando a mantenere alcuni vantaggi. Infatti con una codifica di tipo intero ciascun cromosoma ha un’occupazione in memoria più limitata, quindi risulta più 59 5 – Generazione automatica di march test veloce da manipolare attraverso gli operatori genetici, sia classici sia specifici per il problema. Poichè l’algoritmo utilizza un simulatore a livello elettrico esterno, la traduzione del valore intero dei geni nella corrispondente forma binaria estesa è eseguito soltanto durante la fase di generazione delle sequenze temporali relative ai segnali d’interfaccia. Inoltre ciascun gene contiene l’informazione relativa sia all’inizio e alla fine di un march element, sia al tipo di address order scelto. Questa informazione è memorizzata nei primi 3 bit meno significativi di ciascun gene. 5.3 Indirizzamento delle celle di memoria Nella definizione dello schema di codifica della soluzione si è dovuto individuare l’insieme dei segnali d’interfaccia gestiti direttamente dall’algoritmo genetico. Da questo punto di vista l’insieme dei segnali d’interfaccia verso la memoria (gestiti dall’algoritmo), può essere suddiviso in tre gruppi: segnali che codificano l’indirizzo di una generica cella all’interno della matrice di memoria, segnali che codificano la parola di dato che deve essere scritta su una generica cella durante le operazioni di scrittura e segnali di controllo che codificano le diverse operazioni applicabili sulle celle della matrice di memoria. Ciascuno di questi gruppi rappresenta un possibile grado di libertà a disposizione dell’algoritmo per generare una sequenza di collaudo in grado di coprire il guasto. La disponibilità di informazioni di basso livello sulla struttura della memoria aggiunge un ulteriore grado di libertà, legato al modo con cui si sceglie di effettuare la scansione della matrice di memoria durante il test. Infatti, a livello di sequenza di collaudo è possibile scegliere di spostarsi lungo le righe, piuttosto che lungo le colonne. Quindi l’address mode specifica la direzione di scansione della matrice di memoria, mentre l’address order ne stabilisce il verso. Ciascuno di questi gradi di libertà comporta un significativo aumento della dimensione dello spazio di ricerca su cui l’algoritmo genetico si muove. Dato che l’insieme di questi gradi di libertà comporta la ricerca della soluzione all’interno di un iperspazio molto grande, si è deciso di lasciare all’algoritmo la capacità di generare le sequenze di operazioni (gruppo dei segnali di controllo) e le parole di dato associate alle operazioni di scrittura (segnali che compongono l’interfaccia dati). Inoltre si è lasciata la capacità di generare i singoli march element, indicando all’interno 60 5.3 – Indirizzamento delle celle di memoria del cromosoma l’inzio e la fine degli stessi (marker di inizio e di fine), oltre alla capacità di selezionare l’address order per ogni singolo march element. L’indicazione dell’address mode viene fornita come parametro dall’utente. Una funzione interna all’algoritmo genetico provvede a generare le diverse sequenze di operazioni che codificano un march element, generando per ciascuno l’intera sequenza di accessi alla memoria in base all’address mode e all’address order indicati. 5.3.1 Address mode e address order Come introdotto nel paragrafo precedente, la modalità di scansione (address mode) stabilisce l’ordine di accesso alle celle; l’address order invece, tipico dei march test, individua due sequenze tra loro opposte, senza che per queste sia specificato un preciso ordine di scansione. Per lo svolgimento di questo lavoro sono stati individuati tre principali modi di indirizzamento, scelti in quanto hanno dimostrato di fornire buoni risultati (ad esempio [14, 15, 17]), permettendo di migliorare in alcuni casi versioni precedenti di march test. I tre modi individuati sono: • column mode: definisce una scansione per colonne, ovvero dato l’indice x di riga e y di colonna per ogni cella della matrice di memoria prevede la scansione mediante i due cicli annidati: for(x:=0 TO N-1) for(y:=0 TO M-1) dove N è il numero di righe che compongono la matrice di memoria ed M quello delle colonne; • row mode: definisce una scansione per righe mediante i due cicli annidati: for(y:=0 TO M-1) for(x:=0 TO N-1) • neighbourhood mode: la scansione avviene rispetto al vicinato della cella base corrente. Al momento della stesura di questo documento sono stati implementati i primi due modi di indirizzamento. Per quanto riguarda l’address order, sono stati implementati i due versi ⇑ e ⇓ di scansione, ignorando l’indicazione m relativa all’address order irrilevante. 61 5 – Generazione automatica di march test 5.4 Algoritmo di generazione dei march test Lo sviluppo dell’algoritmo genetico ha richiesto l’implementazione degli operatori genetici classici di selezione, crossover e mutazione, oltre ad una serie di funzioni specifiche per il dominio di applicazione dell’algoritmo. Per ciò che riguarda l’insieme degli operatori genetici classici, si è scelto di implementare il meccanismo di selezione basato sulla tecnica della roulette wheel extraction. La riproduzione degli individui Figura 5.3. Algoritmo genetico per la generazione di march test è stata affidata ad una funzione che implementa la tecnica two-point crossover, mentre la mutazione applica l’alterazione casuale dei geni per tutti i nuovi individui nella popolazione. L’operatore di inversione tuttavia non è stato utilizzato nello sviluppo dello strumento di generazione automatico, in quanto la lunghezza dei cromosomi che codificano una sequenza di collaudo è molto piccola e questo rende inefficiente l’adozione dell’operatore. Anche in letteratura l’uso dell’operatore di inversione in problemi relativi al design di circuiti VLSI è poco diffuso. Per esempio nello sviluppo di strumenti di generazione di vettori di test per circuiti combinatori 62 5.5 – Funzione di fitness e sequenziali l’operatore di inversione non è utilizzato. L’algoritmo prevede che per ogni generazione siano selezionati per la riproduzione un numero di cromosomi pari al parametro generation gap, costante durante l’esecuzione dell’algoritmo. Gli individui vengono selezionati a coppie, che corrispondono alle coppie di cromosomi genitori e per ogni coppia si applica l’operazione di crossover con probabilità Pc . La funzione di crossover è realizzata in modo che i punti di taglio generati non coincidano mai ai due geni esterni contemporaneamente, in modo da evitare di applicare l’operatore genetico e ottenere figli identici ai genitori. Questa scelta aiuta nuovamente l’algoritmo nell’esplorazione ottimale dello spazio di ricerca. La frazione di popolazione nuova introdotta dall’azione del crossover (eventualmente costituita da individui identici ai genitori qualora con probabilità 1 − Pc non si esegua il crossover) viene sottoposta all’azione della funzione di mutazione, la quale con probabilità Pm cambia il valore di ciascun gene del cromosoma. Un gruppo di funzioni specificatamente sviluppate per il contesto applicativo, consentono la validazione della popolazione, la sua traduzione in sequenze temporali per il simulatore esterno, l’incremento della lunghezza delle sequenze di collaudo e la verifica della copertura del guasto. 5.5 5.5.1 Funzione di fitness La funzione di valutazione La funzione di fitness ha un ruolo fondamentale in tutti gli algoritmi genetici, in quanto fornisce l’informazione relativa la qualità degli individui e quindi il loro grado di adattamento all’ambiente. Da un punto di vista più formale la funzione di fitness associa a ciascuna sequenza di geni un valore che esprime la valutazione dell’individuo visto come soluzione del problema considerato. In particolare la funzione di fitness assegna valutazioni migliori, cioè valori più alti, alle sequenze che codificano soluzioni migliori. Spesso nei problemi di ottimizzazione combinatoria queste ultime coincidono con le soluzioni che massimizzano la funzione obiettivo del problema. Questo discorso è valido anche per gli strumenti CAD utilizzati nella progettazione di circuiti digitali complessi, dove spesso l’algoritmo genetico è chiamato a risolvere problemi di ottimizzazione. Il problema della generazione di sequenze di collaudo per dispositivi di memoria richiede di trovare una sequenza capace di 63 5 – Generazione automatica di march test coprire il guasto; pertanto la funzione di fitness associata al problema non è legata ad una ricerca in termini di ottimizzazione (è sufficiente trovare una sequenza di collaudo, anche se questa non è a lunghezza minima). La funzione di fitness che Figura 5.4. Tabella di simulazione è stata definita, ha l’obiettivo di assegnare una valutazione maggiore alle sequenze di collaudo che danno origine ad una più alta divergenza dei segnali monitorati dall’algoritmo genetico. La funzione di valutazione è definita come: f (x) = TX max Nprobe X−1 ( wi Di,t ) t=0 i=0 Il termine espresso dalla seconda sommatoria permette di identificare il valore di divergenza per ciascuno dei campioni temporali t secondo la relazione: Nprobe −1 ft (x) = X wi Di,t i=0 dove wi è un peso associato a ciascuna coppia differenziale di segnali Di tra modello di memoria non difettoso e modello di memoria difettoso. L’indice i scandisce l’insieme dei nodi {0, ..., Nprobe − 1} della rete elettrica che descrive il modello di memoria (nodi di uscita - probe nodes), coincidenti con l’insieme dei nodi di ingresso dei circuiti di selezione delle colonne della matrice di memoria. Quindi la funzione 64 5.5 – Funzione di fitness ft (x) determina il valore differenziale complessivo a livello elettrico tra i due modelli di memoria, relativo al campione di tempo t-esimo della simulazione. L’algoritmo determina lo stato differenziale associato alla sequenza x di collaudo, eseguendo una somma dei valori ft (x) su tutti i campioni di tempo {0, ..., Tmax }: f (x) = TX max ft (x) t=0 dove Tmax rappresenta il tempo complessivo della simulazione. Il termine differenziale Di nell’espressione di ft (x) viene calcolato come differenza in valore assoluto tra il nodo i-esimo del modello non difettoso e il nodo i-esimo del modello difettoso: Di = | Ngi − Nfi | Il valore della funzione f (x) viene calcolato accedendo ad una tabella, contenuta in un file prodotto dal simulatore analogico: per ogni campione temporale (riga della tabella) viene indicato il valore assunto da ciascuno dei nodi di uscita monitorati dall’algoritmo genetico. Il valore del quanto di tempo è indicato nel file che contiene la descrizione delle forme d’onda dei segnali di interfaccia, ed è imposto come parametro di ingresso nel file di configurazione. 5.5.2 Calcolo della fitness La funzione f (x), precedentemente descritta, soffre di un problema comune a molte funzioni di valutazione che si incontrano nella definizione di algoritmi genetici per la risoluzione di problemi di ottimizzazione combinatoria o legati al design di circuiti digitali. Il problema emerge quando si considerano i risultati forniti da tale funzione per l’intera popolazione. In base alla definizione della funzione f (x), è possibile che si verifichi la situazione in cui gli individui della popolazione presentano una differenza molto piccola nel valore di fitness ad essi associato. In queste condizioni la selezione degli individui che dovranno riprodursi avviene su base fortemente casuale, quindi l’algoritmo viene guidato maggiormente dal caso piuttosto che dal valore della loro fitness. In altre condizioni è possibile che un singolo individuo presenti un valore della funzione di fitness nettamente superiore a quello della restante parte della popolazione. La sequenza genetica in questione viene indicata come super cromosoma in quanto sarà selezionata per la fase di riproduzione con una frequenza 65 5 – Generazione automatica di march test molto più elevata di quella delle altre sequenze genetiche (cromosomi), perciò tenderà a dominare sul resto della popolazione. Questo fenomeno porta velocemente la popolazione ad assumere caratteristiche genetiche molto simili per lunghi periodi di tempo (omogeneizzazione e stasi), limitando quindi l’azione di esplorazione dello spazio di ricerca. Per porre rimedio a questo problema sono state proposte diverse Original evaluation Windowing with min = 0 Windowing with min = 10 Linear norm. with step = 20 Tabella 5.1. 200 199 199 100 9 8 6 1 8 7 5 0 10 10 10 10 80 60 40 20 Tecniche di fitness scaling tecniche di adattamento della funzione di valutazione, chiamate tecniche di fitness scaling. Ciascuna di queste tecniche ha lo scopo di ridistribuire i valori generati dalla funzione di valutazione f (x) per ciascun cromosoma, in un intervallo ben definito. Tra le tecniche di scaling proposte in letteratura, le due più comunemente usate sono: • windowing: prevede di individuare il cromosoma con il valore di fitness più basso tra tutta la popolazione. Successivamente si esegue lo scaling assegnando a ciascun cromosoma la differenza tra la sua fitness e il valore minimo individuato. In alcuni contesti è utile scegliere un valore minimo di soglia, da attribuire a ciascun cromosoma qualora la differenza risulti troppo piccola. Questo consente di assicurare una probabilità di riproduzione maggiore anche agli individui con adattamento ambientale più basso. Ad esempio nella tabella 5.1 la seconda riga assegna, come parametro dell’algoritmo, una soglia minima uguale a 10, determinando l’assegnazione di tale valore a tutti i cromosomi la cui differenza tra la valutazione generata inizialmente da f (x) e quella minima risulti inferiore al valore di soglia. • linear normalization: prevede che la popolazione venga ordinata rispetto ai valori generati dalla funzione di valutazione f (x), in ordine decrescente. La tecnica utilizza un parametro che definice il passo di normalizzazione lineare della fitness. A partire da una costante iniziale, indicata come parametro dell’algoritmo, la tecnica assegna a ciascun cromosoma un valore di fitness intero decrescente. 66 5.6 – Operatori genetici e funzioni specifiche La tecnica di windowing nonostante mitighi gli effetti indesidereti legati alla funzione di valutazione, può continuare a dare origine al fenomeno del super cromosoma. La tecnica di linear normalization risulta invece maggiormente efficace in quanto ridistribuisce i valori lineramente all’interno di un intervallo noto, evitando l’insorgere dei fenomeni sopra citati. Pertanto nello sviluppo dell’algoritmo genetico si è utilizzata questa seconda tecnica. In particolare viene impiegato un unico parametro s che definisce il passo di normalizzazione (o decremento) lineare. Successivamente si assegna a ciascun cromosoma un valore intero, che decresce della quantità s a partire dal valore iniziale P op · s (dove P op rappresenta il numero di individui contenuti nella popolazione). 5.6 5.6.1 Operatori genetici e funzioni specifiche Validazione della popolazione L’insieme dei cromosomi all’interno della popolazione rappresenta un insieme di sequenze di collaudo che codificano ciascuna un march test. Come indicato nel paragrafo 5.2 la variabile intera, rappresentata da un gene del cromosoma, esprime il valore binario assunto dai segnali applicati agli ingressi primari della memoria, i quali definiscono il tipo di operazione da eseguire. Inoltre ciascun gene permette di descrivere l’inizio e la fine di un march element e l’address order utilizzato da quest’ultimo. Gli operatori genetici operano sulle sequenze genetiche dei cromosomi, direttamente a livello di operazioni eseguite sulla memoria, quindi al termine di un ciclo di riproduzione ciascun cromosoma può presentare una struttura inconsistente dal punto di vista della codifica dei march test. Ogni sequenza di collaudo prevede una fase iniziale di scrittura atta a inizializzare la matrice di memoria, quindi è necessario garantire che la prima operazione di ciascuna sequenza sia un’operazione di scrittura, mentre l’ultima operazione deve essere una operazione di lettura (fase di osservazione del guasto). Va inoltre osservato che ogni cromosoma dovrà sempre presentare il marker di inizio march element attivo nel primo gene, in quanto rappresenta l’operazione iniziale del march test, e dovrà avere il marker di fine attivo nell’ultimo gene per poter chiudere correttamente il march test. Quindi per garantire la correttezza della struttura dei march test codificati dalla popolazione, l’algoritmo genetico impiega una funzione di validazione chiamata check population che ha il 67 5 – Generazione automatica di march test Figura 5.5. Validazione della popolazione compito di operare una serie di trasformazioni sui geni dei cromosomi. In particolare vengono operate trasformazioni di due tipi: • impostazione dell’operazione di inizializzazione della memoria e osservazione del guasto; • trasformazioni sui marker di inizio e fine march test. Il primo tipo di trasformazione agisce sul primo e sull’ultimo gene di ogni cromosoma, alterando i segnali di controllo che permettono di definire un’operazione di scrittura o di lettura. In particolare è forzata un’operazione di scrittura sul primo gene e un’operazione di lettura sull’ultimo, agendo soltanto sui bit del pattern di controllo (quello che codifica i segnali di controllo della memoria) e non sui bit del pattern dati, che pertanto rimane immutato. Il secondo tipo di trasformazione agisce invece sui tre bit iniziali di ciascun gene, con l’obiettivo di garantire la correttezza nella rappresentazione dell’inizio e della fine di un march element (non vi è alterazione del bit che codifica l’address order). La funzione check population di validazione si 68 5.6 – Operatori genetici e funzioni specifiche basa sull’osservazione seguente: affinchè la rappresentazione dei march element sia corretta, ad ogni marker di fine attivo deve seguire un marker di inizio attivo. Quindi la funzione esegue una doppia scansione di ciascun cromosoma della popolazione, ed imposta il marker di fine attivo per il gene precedente se trova il marker di inizio attivo nel gene corrente, analogamente procede ad impostare il marker di inizio attivo nel gene successivo se riscontra il marker di fine attivo nel gene corrente. Al termine della scansione la popolazione sarà quindi traducibile nelle sequenze temporali dei segnali applicati agli ingressi primari della memoria. 5.6.2 Interfacciamento con il simulatore Per calcolare la fitness dei cromosomi della popolazione corrente, l’algoritmo genetico deve chiamare il simulatore spice esterno, chiedere l’esecuzione della simulazione di ciascuna sequenza di collaudo sia per il modello difettoso, sia per quello non difettoso e utilizzare la tabella di simulazione prodotta dal simulatore spice per calcolare il valore della fitness. Si rende quindi necessario, da parte dello strumento per la generazione automatica di march test, l’interfacciamento con il simulatore esterno e a questo proposito sono utilizzate due funzioni: la funzione back end disk che provvede a tradurre ciascuna sequenza di collaudo nelle corrispondenti sequenze temporali dei segnali d’interfaccia e la funzione run spice engine che provvede a richiamare il simulatore spice (il simulatore viene invocato per la simulazione di ciascuna sequenza di test, per ciascuno dei due modelli di memoria). L’interfaccia del modello di memoria è composta dai segnali di ingresso e uscita che permettono di spostare i dati da e verso l’esterno e che permettono di guidare le operazioni di scrittura e lettura sulle celle della matrice interna. Osservando il circuito di memoria ad alto livello si osserva che l’interfaccia di comunicazione è composta da quattro categorie di segnali: • segnali di indirizzo; • segnali di controllo; • segnali di dato; • segnali di temporizzazione; 69 5 – Generazione automatica di march test Sulla base di questa classificazione si può analizzare il funzionamento della funzione back end disk, che ha il compito di tradurre le sequenze di test rappresentate dai geni dei cromosomi in sequenze temporali per ciascun segnale appartenente alle categorie precedenti. In figura 5.6 viene riportato lo pseudocodice relativo all’algoritmo implementato Figura 5.6. Pseudocodice della funzione back end disk d’interfacciamento con il simulatore nella funzione back end disk di interfacciamento. Come si può osservare l’algoritmo calcola inizialmente la dimensione del vettore che dovrà contenere la rappresentazione binaria di ciascuno dei geni del cromosoma. Infatti soltanto in questa fase 70 5.6 – Operatori genetici e funzioni specifiche l’algoritmo utilizza una rappresentazione di basso livello dei geni che permette di esplicitare il valore logico assunto da ciascuno dei segnali d’interfaccia. Si ricorda che ognuno dei geni contiene l’informazione relativa al pattern dei segnali di controllo, al pattern dei segnali di dato e l’insieme dei bit di gestione dei march element, mentre l’informazione relativa agli indirizzi delle celle viene determinata dinamicamente dall’algoritmo in base all’address order e all’address mode selezionati (attraverso una chiamata alla funzione address generator). La dimensione del vettore viene scelta come valore massimo tra il numero di bit necessari a rappresentare un singolo gene e quello necessario a rappresentare un indirizzo secondo la relazione: Binary array size = max{A, (D + C + 3)} dove A, D e C rappresentano rispettivamente l’ampiezza del bus di indirizzamento, l’ampiezza del bus dati e l’ampiezza del bus di controllo della memoria (sono escluse le sorgenti di temporizzazione che vengono sintetizzate separatamente dall’algoritmo). A questo punto l’algoritmo inizia la sintesi dei segnali per ciascuna delle sequenze di test (ciclo for sull’insieme dei vettori di collaudo). Un secondo ciclo for scandisce l’insieme dei segnali che dovranno essere sintetizzati (l’insieme è formato dai segnali A, D, C), per ciascuno viene memorizzato il tipo di segnale (signal type) e la posizione relativa all’interno del vettore binario (signal selected). Successivamente viene selezionato l’elemento nella lista dei generatori di segnali interna, la quale memorizza le informazioni per la sintesi a livello elettrico del segnale corrente, in base all’informazione contenuta nella variabile signal selected. Una coppia di variabili interne permette all’algoritmo di analizzare la sequenza di caratteri del cromosoma e di memorizzare l’informazione relativa all’inizio e alla fine del march element corrente (march element start e march element stop). Il flag encode march element permette di attivare la fase di sintesi delle operazioni eseguite sulla memoria ed interne al march element identificato. Per l’individuazione del march element corrente l’algoritmo scandisce progressivamente la sequenza di test e salva la posizione di inizio nella variabile march element start quando è attivo il marker di start e la posizione di fine nella variabile march element stop quando è attivo il marker di stop (in questo secondo caso viene attivato anche il flag encode march element). La fase di sintesi dei segnali prevede che su ciascuna cella della matrice di memoria venga applicato l’insieme di operazioni interne al march element, di conseguenza due 71 5 – Generazione automatica di march test Figura 5.7. Numerazione delle celle dell’array di memoria cicli for annidati controllano tale processo. Il ciclo più esterno utilizza la variabile contatore cell id per individuare la cella su cui applicare la sequenza di operazioni. Per ottenere ciò le celle vengono etichettate, come visibile in figura 5.7, con un numero identificativo progressivo da 0 (cella in alto a sinistra nella matrice) a N (cella in basso a destra nella matrice). La chiamata alla funzione address generator consente di estrarre l’indirizzo effettivo della cella in base al valore assunto dalla variabile contatore relativa alle celle esaminate, all’address mode selezionato e all’address order previsto dal march element. Il ciclo più interno sintetizza, per ciascuna cella, l’insieme delle operazioni contenute nel march element, utilizzando l’informazione memorizzata nelle variabili march element start e march element stop. La chiamata alla funzione binary conversion restituisce il valore binario associato al gene corrente (il valore è memorizzato su un vettore temporaneo di ampiezza uguale a binary array size). L’informazione memorizzata in signal selected selezionerà la posizione del segnale da sintetizzare all’interno del vettore binario, ottendo il valore logico del segnale. L’informazione sul tipo di segnale permette di accedere ad una lista interna contenente le caratteristiche elettriche del segnale, che ne descrivono la forma d’onda. Tali caratteristiche sono strutturate secondo la sintassi spice relativa ai segnali periodici (figura 5.8). A questo punto l’algoritmo utilizza la conoscenza relativa alle forme d’onda dei segnali di dato, indirizzo e controllo (signal type) per 72 5.6 – Operatori genetici e funzioni specifiche procedere alla sintesi dell’operazione corrente per il segnale corrente. L’interfaccia della memoria utilizza un protocollo di comunicazione standard in cui i segnali di controllo, a differenza dei segnali di dato e di indirizzo, eseguono una transizione di stato per la sola durata del ciclo di operazione (riposo → attivo → riposo). Data la Figura 5.8. Descrizione della sintassi spice per i segnali periodici natura dei segnali di controllo per la loro sintesi è sufficiente la conoscenza del valore logico del segnale nell’operazione corrente. Invece per poter sintetizzare i segnali di indirizzo e di dato è necessario memorizzare il valore logico assunto nel precedente ciclo operativo, in modo da poter sintetizzare opportunamente le transizioni nel ciclo corrente. Terminata la sintesi dei segnali appartenenti al bus indirizzi, dati e controllo, l’algoritmo avvia la fase terminale di sintesi degli eventuali segnali di temporizzazione dell’interfaccia. Come nel caso precedente, viene memorizzata internamente la lista delle caratteristiche elettriche di ciascuno dei segnali di temporizzazione secondo la sintassi spice precedentemente indicata. L’algoritmo termina aggiungendo l’informazione relativa ai nodi di output (probe nodes) e i comandi per il simulatore (passo e tempo complessivo di simulazione). Il passo di simulazione è determinato dai parametri globali di configurazione dell’algoritmo genetico, mentre il tempo complessivo di simulazione e calcolato dinamicamente durante la fase di sintesi dei segnali. 73 5 – Generazione automatica di march test 5.6.3 Incremento della lunghezza delle sequenze di test Per assicurare un’esplorazione ottimale dello spazio di ricerca, è stato sviluppato un operatore genetico specifico per questa applicazione. L’operatore mutate rlg (repeate last gene), che agisce sull’intera popolazione di cromosomi, provvede ad incrementare Figura 5.9. Esecuzione della funzione di mutazione RLG la lunghezza di ciascuna sequenza di collaudo della popolazione. L’operatore introduce un ulteriore gene nella sequenza di caratteri che codifica il cromosoma, il cui valore coincide con quello del gene che lo precede nella sequenza. Il nuovo carattere viene introdotto all’interno del cromosoma, come ultimo gene appartenente alla fase di eccitazione del test in quanto, come si vede in figura 5.9, il primo e l’ultimo gene codificano rispettivamente la fase di inizializzazione e di osservazione del guasto. L’operazione quindi ha lo scopo di accumulare caratteri identici (operazioni uguali eseguite sulla memoria) all’interno di un march element. Questa scelta emerge dal fatto che l’identificazione di modelli di guasto di natura dinamica comporta l’applicazione di sequenze di operazioni identiche sulla stessa cella. Di conseguenza il test presenta march element costituiti da sequenze di operazioni identiche. Per ottenere questo risultato, la funzione clona l’ultimo gene che codifica la fase di eccitazione del test ed applica una serie di controlli relativi ai marker di inizio e fine march element. Tali controlli garantiscono l’accumulo del carattere (operazione) all’interno dell’ultimo march element disponibile nella fase di eccitazione. Come si vede in figura 5.10 l’ultimo march element può contenere anche la fase di osservazione, che pertanto non 74 5.6 – Operatori genetici e funzioni specifiche viene sempre codificata come march element separato. La probabilità di attivazione Figura 5.10. Check sui marker relativi alla coppia di geni clonati di questo operatore è stata resa variabile nel tempo, per consentire all’algoritmo di esplorare con efficacia lo spazio di ricerca. Infatti ogni nuova operazione incrementa la dimensione dello spazio di ricerca, anche se ciò permette all’algoritmo di trovare con maggiore facilità una sequenza ottimale di test in grado di coprire il guasto. Per ottenere questo comportamento si è applicata la tecnica di adattamento mediante interpolazione che provvede a diminuire di una quantità fissata la probabilità di esecuzione dell’operatore. La quantità con cui avviene il decremento è comunque un parametro dell’algoritmo imposto dall’utente. 5.6.4 Condizione terminale L’evoluzione della popolazione in un algoritmo genetico è governata da un ciclo principale. Durante il processo di esplorazione dello spazio di ricerca, la popolazione iniziale (di norma generata casualmente) viene fatta evolvere verso un insieme di soluzioni migliori per il problema considerato. Nella maggior parte dei casi l’algoritmo genetico è utilizzato per l’ottimizzazione di una funzione obiettivo, quindi il fattore temporale definisce la condizione di interruzione del ciclo di evoluzione (condizione terminale). In genere questa si esprime imponendo un numero massimo prefissato di iterazioni dell’algoritmo (numero di generazioni della popolazione). 75 5 – Generazione automatica di march test In problemi specifici è possibile definire una seconda condizione terminale oltre a quella dipendente dal fattore temporale. Ad esempio è possibile stabilire un criterio di ottimalità, oppure definire una procedura che verifichi la disponibilità di una soluzione anche se non ottimale. Nel problema relativo la generazione di sequenze di collaudo per memorie il ciclo può essere interrotto sia perchè è stato raggiunto il numero massimo di generazioni previste, sia perchè è stata individuata una soluzione in grado di coprire il guasto considerato. Nello sviluppo dell’algoritmo genetico è stata definita la funzione check fault coverage, che permette di interrompere il ciclo principale di evoluzione se la nuova soluzione, individuata all’interno della popolazione corrente, è in grado di coprire il guasto. In figura 5.11 è riportato lo pseudocodice della funzione di controllo check fault coverage. Come si osserva la funzione opera sulla soluzione corrente individuata dalla funzione di aggiornamento (update solution). Tale soluzione è rappresentata dall’insieme dei geni che esprimono la sequenza di collaudo e dall’indice del vettore associato. L’indice del vettore di test è utilizzato dalla funzione per eseguire un’analisi a livello elettrico della soluzione e determinare in base a quest’ultima lo stato logico relativo ai due modelli di memoria. In tal modo la funzione di copertura è in grado di individuare variazioni nel comportamento del circuito di memoria difettoso a livello logico, come previsto per la sequenza di collaudo a livello funzionale. Nel caso in cui viene rilevata la copertura del guasto, la funzione restituisce un valore booleano positivo (negativo in caso contrario) che permette all’algoritmo genetico di arrestare la ricerca e di fornire il risultato individuato all’interno di un report terminale. Come si osserva nella figura 5.11 la funzione di verifica check fault coverage, procede inizialmente a impostare il valore di sensibilità dei sense amplifier (non presenti fisicamente nel circuito della memoria), e a determinare il numero di campioni temporali che formano una singola operazione. Questo valore è calcolato sulla base della durata di ciascuna operazione (ovvero della durata del ciclo di clock utilizzato dall’interfaccia di memoria) e del passo simulazione. Successivamente la funzione provvede ad analizzare il cromosoma che codifica la soluzione, al fine di individuare l’ultimo march element del test il quale contiene l’operazione di osservazione del guasto. Le due variabili march start e march length contengono rispettivamente l’indice di partenza dell’ultimo march element all’interno del cromosoma, e la lunghezza individuata per quest’ultimo come numero di operazioni da eseguire sulla matrice di memoria. Il loro valore si ottiene analizzando con un ciclo for il cromosoma soluzione e impostando march start con 76 5.6 – Operatori genetici e funzioni specifiche Figura 5.11. Pseudocodice della funzione check fault coverage di verifica della copertura del guasto l’indice del gene corrente ogni volta che quest’ultimo contiene il marker di start attivo; march length è progressivamente incrementato durante la scansione del cromosoma e resettato quando si individua un marker di start attivo. Queste due variabili sono utilizzate per determinare il numero di righe (campioni temporali) all’interno della tabella di simulazione, che devono essere ignorate in quanto facenti riferimento alla fase di inizializzazione della memoria ed eccitazione del guasto. A questo punto la funzione è posizionata all’inizio (primo campione) del march element terminale ed in base al valore di march length determina il numero di operazioni che fanno ancora riferimento alla fase di eccitazione. Calcola di conseguenza il relativo numero di righe (campioni temporali da ignorare). Questo valore è utilizzato all’interno di un ciclo for con lunghezza pari al numero di celle che costituiscono la 77 5 – Generazione automatica di march test matrice di memoria, secondo la relazione: #Rows = (( Tclk Tclk ) · march length) + (( · 0.5) + tw ) Tstep Tstep dove #rows indica il numero di righe della tabella di simulazione da saltare, Tclk il periodo di clock utilizzato nelle simulazioni, Tstep il passo di simulazione prescelto. Infatti la funzione di verifica deve analizzare solo la porzione di simulazione relativa all’esecuzione delle operazioni di osservazione applicate a tutte le celle della matrice di memoria. Ad esempio, supponendo di utilizzare un passo di simulazione Tstep = clk = 10 1 ns e un ciclo di clock dell’interfaccia pari a Tclk = 10 ns si ottengono TTstep campioni di tempo per ogni operazione, corrispondenti a 10 righe nella tabella di simulazione. Si supponga inoltre che la funzione di verifica abbia stabilito il valore march length = 2, per esempio avendo come march element terminale ⇑ ( W 0, R0 ). Quindi ad ogni cella della matrice sono associate 20 righe nella tabella di simulazione, e la funzione check fault coverage dovrà saltare le prime 10 di ogni gruppo di 20, per concentrarsi su quelle relative all’operazione di osservazione (R0 nell’esempio). Dei 10 campioni a cui la funzione deve fare riferimento solo una parte è effettivamente utile, poichè la prima metà di ogni ciclo è utilizzata per l’esecuzione della precarica delle bit line al valore di alimentazione VDD. Dall’analisi sulla forma d’onda dei Figura 5.12. Finestra di analisi dei campioni di simulazione relativi all’operazione di osservazione del difetto segnali associati al bus di controllo, emerge che la finestra temporale in cui eseguire il controllo della copertura del guasto, deve essere posizionata come riportato in 78 5.6 – Operatori genetici e funzioni specifiche figura 5.12. Nella formula per il calcolo del numero #rows di righe nella tabella di simulazione da ignorare, il fattore di correzione temporale tw permette di centrare la finestra di analisi esattamente sul primo campione utile. Il valore di tw dipende dal rapporto relativo tra il passo di simulazione prescelto e il tempo di transizione dei segnali. Ad esempio se si considera il segnale di figura 5.12, la fase di esecuzione dell’operazione è compresa tra il campione t1 = 6.0 ns e il campione t2 = 10.0 ns (seconda metà del ciclo di durata pari a 10 campioni). Tuttavia si osserva che il primo e l’ultimo campione utile sono rispettivamente il campione t1 = 5.0 ns e t2 = 9.0 ns. Da ciò deriva l’introduzione del fattore di correzione tw che permette di centrare la finestra di analisi composta dai campioni A,B,C,D ed E tra il campione t1 e il campione t2 sopra indicati. In base all’informazione relativa all’address order utilizzato all’interno dell’ultimo march element, la funzione check fault coverage di verifica stabilisce la colonna della matrice di memoria interessata dall’operazione di osservazione e la registra nella variabile col. L’indice di colonna col permette di identificare la coppia di campioni relativi alle bit line riferiti al campione temporale corrente (riga della tabella di simulazione correntemente analizzata). Per determinare lo stato logico dei due modelli di memoria, viene calcolato (per ciascuno dei due modelli) il valore differenziale tra le due bit line analizzate (coppia di colonne individuata dall’indice col sulla clk tabella di simulazione) mediato sull’intervallo temporale TTstep · 0.5. Questo valore viene confrontato con il parametro di sensibilità dei sense amplifier per determinare lo stato logico di uscita che avrebbero all’interno del circuito di memoria. Due variabili memorizzano lo stato logico interno della cella indirizzata per il modello difettoso e per quello non difettoso: rispettivamente logic f e logic g. Ciascuna di queste due variabili può assumere tre stati in relazione al valore differenziale medio calcolato per la cella: • stato 1: indica che il valore differenziale medio Vdif f ≥ Sp , dove Sp è la sensibilità positiva stabilita per i sense amplifier del circuito. Pertanto la cella si trova nello stato logico H; • stato 0: indica che il valore differenziale medio Vdif f ≤ Sn , dove Sn è la sensibilità negativa stabilita per i sense amplifier del circuito. Pertanto la cella si trova nello stato logico L; • stato 2: indica che il valore differenziale medio Sn < Vdif f < Sp . Il sense 79 5 – Generazione automatica di march test amplifier non sarebbe in grado di determinare correttamente lo stato di uscita della cella. La funzione di verifica stabilisce quindi che il difetto è stato coperto dalla sequenza di collaudo attuale, se la cella relativa al modello di memoria difettoso e quella del modello non difettoso sono in due stati logici differenti, cioè se è verificata la condizione logica: (state_g = 1 AND state_f = 0) OR (state_g = 0 AND state_f = 1) 5.7 Interfaccia utente Lo strumento automatico di generazione delle sequenze di collaudo presenta un’interfaccia utente di tipo testuale, basata su un file di configurazione (configure.in) per l’inserimento dei parametri di ingresso. Per comodità di utilizzo, il file di configurazione è suddiviso in tre sezioni principali: • main tool parameters: questa sezione permette di specificare il percorso relativo ai file contenenti i modelli dei circuiti di memoria non difettoso e difettoso. Permette inoltre l’attivazione del flag statistic flag per la scrittura delle statistiche relative all’algoritmo genetico usato dallo strumento per la generazione automatica di march test; • genetic parameters: questa sezione permette di specificare l’insieme dei parametri di ingresso per l’algoritmo genetico, quali le frequenze di attivazione degli operatori genetici, il numero di iterazioni massime consentite (per limitare il tempo di CPU utilizzato), la dimensione della popolazione, e il passo di normalizzazione lineare della funzione di valutazione; • interface parameters: questa sezione specifica le informazioni relative all’interfaccia della memoria. Per ogni tipologia di segnale disponibile nell’interfaccia è definita l’ampiezza del bus associato e le caratteristiche elettriche di ciascun elemento del bus, secondo la sintassi spice definita per i segnali periodici (la scelta dell’utilizzo di questa sintassi rispetto ad altre, è dovuta al fatto che permette di descrivere le caratteristiche elettriche utilizzate per la sintesi delle sequenze temporali associate ai segnali d’interfaccia). Sono inoltre definiti i 80 5.7 – Interfaccia utente Figura 5.13. File di configurazione dello strumento di generazione automatico parametri relativi alla sensibilità dei sense amplifier, i pattern di controllo non validi e i pattern di controllo che specificano le operazioni di lettura e di scrittura. All’interno del file, ciascun elemento è definito tramite un nome identificativo seguito dalla lista dei parametri che lo caratterizzano, tuttavia per semplificarne la gestione l’ordine con cui i parametri sono definiti è fisso. L’output generato dallo strumento automatico di generazione è costituito da un file testuale contenente un report (report.log) e dal vettore di test (fault stimulation.cir) contenente la sequenza temporale dei segnali di interfaccia che rappresentano il march test (sequenza di collaudo) generato. Nel file del report è contenuta la tabella con i dati statistici (nel caso in cui il flag associato sia stato attivato) relativi all’esecuzione dell’algoritmo genetico quali l’indicazione dell’iterazione, la valutazione media della popolazione, la valutazione massima nella popolazione e la valutazione associata alla soluzione corrente. Viene riportata una tabella riassuntiva contenente l’indicazione dei parametri di ingresso utilizzati dallo strumento automatico (principali, genetici e di interfaccia) e la soluzione di collaudo rappresentante il march test identificato . La soluzione 81 5 – Generazione automatica di march test Figura 5.14. File di report dello strumento di generazione automatico identificata è strutturata in tre campi: un flag iniziale (go/nogo) permette di identificare la copertura o meno del difetto inserito nel circuito di memoria, la valutazione associata alla sequenza di test e la sequenza di test espressa a livello funzionale sotto forma di march test. Al termine del file di report è indicato il tempo impiegato per l’esecuzione del job. Uno script (run.bat) controlla l’esecuzione di sessioni di test multiple per le quali vengono automaticamente salvati i file di output. 82 Capitolo 6 Caso di studio Le memorie SRAM sono i dispositivi con la più alta densità di transistor presenti sui circuiti digitali moderni, pertanto è necessario lo sviluppo di algoritmi di test efficienti e di modelli di guasto adeguati alle tecnologie in uso. Le moderne tecnologie VSDM (Very Deep Sub-Micron) sono soggette sempre più frequentemente a guasti dovuti alla presenza di difetti fisici di tipo resistive-open e con sempre maggior frequenza tali difetti sono associati a modelli di guasto sempre più complessi. Lo scopo dell’algoritmo è di generare in modo automatico sequenze di operazioni che permettano di descrivere il guasto a livello funzionale, eseguendo un’analisi del comportamento del circuito difettoso a livello elettrico. Il capitolo seguente è quindi dedicato all’analisi delle sequenze di collaudo generate dall’algoritmo genetico presentato nel capitolo precedente. 6.1 Difetti nella matrice di memoria Il modello sperimentale di memoria descritto alla fine del capitolo 2, è stato utilizzato come base per gli esperimenti di verifica del funzionamento dello strumento per la generazione automatica. Tale modello è stato sviluppato con l’obiettivo di focalizzare l’analisi del comportamento dello strumento, rispetto alla generazione di march test in grado di coprire difetti presenti a livello della cella di memoria (corecell defect). La figura 6.1 mostra lo schema interno della cella SRAM contenente l’insieme delle locazioni dei difetti resistivi iniettati nel modello di memoria durante la fase di verifica. Nello schema sono rappresentate 6 differenti locazioni di difetti 83 6 – Caso di studio Figura 6.1. Difetti resistivi iniettati nella cella SRAM fisici rappresentati a livello elettrico come difetti a carattere resistivo. Tale scelta è legata all’osservazione della simmetria interna alla cella stessa, che consente di trascurare molte possibili locazioni di guasto. 6.1.1 Analisi dei difetti In letteratura [14, 15, 17, 18] sono stati effettuati esperimenti di simulazione di celle di memoria SRAM in cui erano presenti difetti di tipo resistivo nelle 6 locazioni indicate in figura 6.1. La loro analisi ha permesso di identificare un’insieme di modelli di guasto funzionali a cui i difetti erano sensibili. Il difetto DF 1 , modellabile come guasto TF, induce in genere un ritardo nella fase di carica/scarica del nodo interno al latch della cella, associato alla complement bit line (nodo SB a drain comune formato da P 3−N 4−PASS 2 ). Il difetto esibisce in generale un comportamento di natura statica, ed è quindi facilmente rilevabile dagli algoritmi di march test. Il difetto resistivo DF 2 induce tipicamente un ritardo sull’uscita dell’inverter formato dai mosfet P 1 e N 2, durante la fase di scarica del nodo interno SB. Se si esegue un operazione di lettura sulla cella difettosa in cui il valore atteso sia 0, la complement bit line e la true bit line saranno inizialmente precaricate al valore VDD. Durante la precarica, la complement bit line (per via della maggiore capacità 84 6.1 – Difetti nella matrice di memoria parassita rispetto a quella equivalente del latch, vista dal nodo SB) può cercare di forzare temporaneamente il valore del nodo interno SB a VDD. A causa del difetto l’inverter formato da P 1−N 2 non è in grado di controbilanciare correttamente questo effetto e si ha quindi che il nodo SB viene forzato al valore VDD, inducendo la commutazione dell’inverter formato da P 3−N 4 e quindi alla perdita del dato. Tale comportamento può essere rappresentato in genere come guasto RDF e in casi meno frequenti come guasto DRDF. Il difetto DF 3 mostra un comportamento analogo a quello del difetto precedente ed è in genere modellato come guasto RDF. Quando si esegue un’operazione di lettura in cui sia atteso il valore 1, viene trasferita la carica dalla complement bit line verso l’interno della cella (la complement bit line viene scaricata). La complement bit line viene guidata verso il valore 0 attraverso l’azione di pull-down dei mosfet N 4 e PASS 2 . A causa del difetto resistivo sul percorso di pull-down di N 4, il terminale di source non si trova al potenziale di massa, di conseguenza durante la fase di lettura l’inverter formato da P 3−N 4 commuta, portando alla perdita dei dati (la cella statica si comporta analogamente ad una cella DRAM). Se il difetto resistivo non è sufficientemente grande, l’operazione di lettura può concludersi in modo corretto nonostante subisca un forte disturbo. In questi casi il difetto può dare origine a guasti anche di natura dinamica. Il difetto DF 4 induce in generale un comportamento della cella modellabile come guasto dinamico di tipo dRDF (per elevati valori di resistenza) che risulta particolarmente difficile da osservare. Il difetto DF 5 introduce un ritardo nella fase di switching On/Off relativa ai due trasmission gate (PASS 1 e PASS 2 ) durante le operazioni di lettura e scrittura sulla cella. Le operazioni di lettura e di scrittura necessitano di una determinata quantità di tempo per essere eseguite correttamente, tuttavia a causa della resistenza presente all’ingresso del terminale di selezione della cella (word line) tale quantità di tempo viene ridotta, portando ad una non corretta esecuzione delle operazioni. Il comportamento del difetto è in generale modellabile come guasto statico di tipo TF e per alcuni valori di resistenza del difetto come guasto IRF. Infine il difetto DF 6 induce in genere il fallimento dell’operazione di scrittura. Poichè il difetto resistivo è posto all’ingresso dell’inverter formato dai mosfet P 1 e N 2, elevati valori di resistenza impediscono alla corrente di bias dei mosfet di entrare, e questo causa un effetto di ritardo sulle operazioni di scrittura. L’effetto di ritardo si manifesta principalmente durante le fasi di scrittura dello 0 logico, in quanto durante queste operazioni commuta prima il nodo che deve essere portato al valore logico 0 85 6 – Caso di studio dall’azione di pull-down dei mosfet interni alla cella. 6.1.2 Parametri di ingresso Dato che lo strumento per la generazione automatica è basato su un algoritmo genetico, è stata condotta una serie di test aventi lo scopo di determinare l’insieme ottimale dei parametri di ingresso (parameters tuning). I test sono stati condotti facendo generare la sequenza di collaudo (march test) relativa a tre difetti precedentemente selezionati dall’insieme delle 6 locazioni di guasto di figura 6.1 e valutando l’efficacia dei parametri selezionati. L’insieme dei parametri di ingresso, per il quale si ha un comportamento efficiente dell’algoritmo genetico, è riportato nella tabella 6.1. Diminuendo la probabilità di esecuzione dell’operatore di crossover ed aumentanPametro iter Ps Pc Pm ialp als Lin Descrizione Numero massimo di iterazioni Dimensione della popolazione Probabilità di esesecuzione per l’operatore di crossover Probabilità di esecuzione per l’operatore di mutazione Probabilità di esecuzione per l’operatore di mutazione rlg Decremento della probabilità di esecuzione dell’operatore di mutazione rlg Passo di linearizzazione della funzione di fitness Tabella 6.1. Valore 200 4 .900 .180 .060 .015 25 Parametri di ingresso per l’algoritmo genetico do la frequenza di attivazione dell’operatore di mutazione, l’algoritmo viene guidato prevalentemente in maniera casuale durante la fase di esplorazione dello spazio risolutivo. Infatti l’elevata frequenza di esecuzione dell’operatore di mutazione introduce frequenti cambiamenti nelle sequenze genetiche ricombinate dall’azione del crossover, portando alla perdita di gruppi efficaci di geni. L’innalzamento della frequenza di attivazione del crossover e la diminuzione di quella relativa all’operatore di mutazione inducono miglioramenti nel comportamento dell’algoritmo genetico. Tuttavia dagli esperimenti si osserva che una eccessiva riduzione della probabilità di esecuzione dell’operatore di mutazione porta nuovamente ad una perdita di efficacia da parte dell’algoritmo genetico. Questo comportamento è dovuto al fatto che valori molto bassi della mutazione non garantiscono una buona esplorazione dello spazio risolutivo. Bisogna infatti osservare che le sequenze di test espresse sotto forma di 86 6.2 – Generazione di march test march test costituiscono un sottoinsieme delle sequenze di collaudo esprimibili a livello binario. L’algoritmo genetico genera, durante la fase ricerca, il pattern binario che deve essere applicato agli ingressi primari della memoria durante la simulazione. Di conseguenza è possibile che più pattern binari relativi ai segnali d’interfaccia rappresentino la stessa operazione a livello di march test. Per esempio, con riferimento al modello di memoria riportato nel capitolo 2 (modello sperimentale), i valori genetici 45 e 37 codificano entrambe l’operazione di alto livello Rx , dove x rappresenta il valore atteso dall’operazione di lettura e non il valore logico della linea dati di ingresso. Valori troppo bassi di mutazione non permetto di esplorare adeguatamente configurazioni binarie dei segnali d’interfaccia relative ad operazioni differenti. La probabilità di esecuzione dell’operatore specifico di mutazione rlg è stata fissata ad un valore pari a .060 in modo da non indurre frequenti incrementi della lunghezza della sequenza di collaudo. Questa scelta è legata al fatto che i difetti inseriti nella cella di memoria fanno principalmente riferimento a modelli di guasto di natura statica, per i quali la lunghezza del vettore di test risulta essere pari a 3 operazioni (inizializzazione della matrice di memoria, eccitazione e osservazione del guasto). Una probabilità di esecuzione più alta induce infatti incrementi del numero di operazioni associate al test con frequenza maggiore di quella utile. Considerando sempre che i modelli di guasto principali hanno natura statica, si è deciso di limitare il numero di possibili incrementi a 4, impostando il parametro di controllo als al valore di .015. Il numero di iterazioni utilizzate negli esperimenti è stato fissato a 200 in quanto garantisce una buona esplorazione dello spazio risolutivo con tempi di esecuzione accettabili, mentre il numero di sequenze di collaudo (cromosomi) presenti in ogni generazione è stato fissato a 4 (questo valore costituisce un buon compromesso tra tempo impiegato per la simulazione della popolazione e capacità di esplorazione dello spazio delle soluzioni da parte dell’algoritmo genetico). 6.2 Generazione di march test Le tabelle 6.2 e 6.3 riportano i risultati sperimentali ottenuti dall’esecuzione dello strumento per la generazione automatica di march test, per i difetti resistivi descritti nel paragrafo 6.1. Gli esperimenti sono stati eseguiti utilizzando un sistema basato su architettura Turion 64T M con frequenza operativa di 1.8 GHz e dotato di 1 GB di 87 6 – Caso di studio memoria RAM. Inoltre tutti gli esperimenti sono stati condotti utilizzando i seguenti parametri, legati all’ambiente di simulazione a livello elettrico: • tensione di alimentazione costante al valore nominale VDD = 5.0 V; • temperatura di lavoro mantenuta al valore di default del simulatore elettrico, pari a T = 27.0 ◦ C. Gli esperimenti sono stati caratterizzati dall’inserimento nella cella di difetti resistivi con dimensioni variabili all’interno dell’insieme: Rdf ∈ {100 KΩ, 500 KΩ, 1.0 MΩ} Per ciascuno dei difetti sono state eseguite 10 sessioni di test, atte a misurare su un campione significativo di test, l’efficacia dell’approccio computazionale di generazione delle sequenze di collaudo adottato. Va infatti osservato che l’utilizzo di un algoritmo genetico impone l’analisi dei risultati su un campione di prove di esecuzione, data la natura non ripetibile dei singoli esperimenti. L’insieme di march test Figura 6.2. Matrice di memoria difettosa generati dallo strumento automatico sviluppato, è stato confrontato con i risultati noti in letteratura [14, 15, 17, 18] per lo stesso insieme di difetti inseriti a livello di cella. Per comodità i difetti sono stati sempre posizionati nella cella della matrice di memoria con identificatore cell id = 0, come indicato in figura 6.2. Ciò nonstante tale scelta non ha influenzato i risultati ottenuti. La tabella 6.2 riporta i dati relativi 88 6.2 – Generazione di march test alla fault coverage (FC), espressa come rapporto tra il numero di sequenze di collaudo in grado di rilevare correttamente il difetto presente nella cella e il numero totale di sequenze di collaudo generate, oltre a mostrare il tempo medio di esecuzione dello strumento automatico nell’arco delle 10 sessioni sperimentali (va osservato che ciascuna delle 10 sessioni, genera una singola sequenza di collaudo). Analizzando #DF 1 2 3 4 5 6 Size [M Ω] 0.1 0.5 1.0 0.1 0.5 1.0 0.1 0.5 1.0 0.1 0.5 1.0 0.1 0.5 1.0 0.1 0.5 1.0 Tabella 6.2. Fault Coverage 100 % 90 % 20 % 90 % 100 % 80 % 0% 0% 0% 0% 0% 0% 0% 0% 0% 20 % 90 % 80 % Average time [s] 260.6 207.4 98.8 1328.1 102.4 380.1 9345.3 8763.5 8650.6 8047.2 7232.8 7290.0 9237.8 13091.0 13804.4 11731.4 89.1 3208.3 Fault coverage e tempo medio di esecuzione i dati riportati, emerge come lo strumento non sia stato capace di generare una sequenza di collaudo utile al rilevamento del difetto della cella, per le tipologie di difetti indicati come DF 3 , DF 4 e DF 5 . I difetti DF 3 e DF 4 , come già indicato nel paragrafo 6.1, rappresentano una classe di difetti particolarmente difficile da rilevare, in quanto spesso il guasto associato presenta una natura dinamica. Nel caso specifico bisogna tenere presente che la definizione del circuito di memoria a livello elettrico è stata basata su una tecnologia CMOS non specifica, e questo può avere influenzato il comportamento del difetto rendendolo di fatto non rilevabile. Per quanto riguarda i difetti indicati come DF 1 e DF 2 , sono stati ottenuti march test in grado di coprire il guasto nella maggior parte dei casi. Inoltre va osservato che, per questa categoria 89 6 – Caso di studio di difetti sono stati generati march test equivalenti alla definizione del modello di guasto funzionale TF, come evidenziato anche da esperimenti di simulazione presenti in letteratura [14, 15, 18]. Analogamente per la classe di difetti DF 6 sono stati ottenuti march test equivalenti alla definizione funzionale del guasto RDF e, in numero basso, march test per la copertura di guasti TF (come già osservato in letteratura). I tempi medi di esecuzione confermano che, per il modello di memoria usato, i difetti appartenenti alle classi DF 1 e DF 2 sono facilmente rilevabili mentre i difetti (e quindi i guasti associati) appartenenti alle altre categorie richiedono uno sforzo computazionale maggiore. Ad esempio, se si considera la sequenza di test ottenuta dallo strumento per il difetto DF 2 con valore di resistenza Rdf = 1.0 MΩ: hcoli{⇓(W1,W0);⇑(R0)} si ottiene il comportamento del difetto mostrato in figura 6.3. Figura 6.3. Nella parte alta è Andamento dei segnali sulle bit line della memoria difettosa mostrato l’andamento temporale del segnale di selezione della colonna associata alla cella difettosa, il grafico sottostante rappresenta invece l’andamento del segnale di controllo EN (enable). Gli ultimi due grafici mostrano l’andamento temporale della 90 6.2 – Generazione di march test #DF 1 Size [M Ω] 0.1 0.5 1.0 2 0.1 0.5 1.0 3 0.1 0.5 1.0 4 0.1 0.5 1.0 5 0.1 0.5 1.0 6 0.1 0.5 1.0 Tipical sequence found hcoli{⇓(W0);⇑(R0);⇑(R0)} hcoli{⇑(W1);⇑(W0);⇓(R0)} hcoli{⇓(W0);⇑(W0,R0)} hcoli{⇑(W1,W0);⇑(R0)} hcoli{⇑(W1);⇑(W0);⇑(R0)} hcoli{⇓(W0,R0);⇓(R0)} hcoli{⇑(W0,R0,W1);⇓(R1)} hcoli{⇓(W1);⇑(W0,R0);⇑(R0)} hcoli{⇑(W1);⇑(W0);⇑(R0)} hcoli{⇑(W0);⇑(R0);⇓(R0)} hcoli{⇑(W0,R0);⇓(R0)} hcoli{⇓(W1,W0);⇑(R0)} hcoli{⇑(W1,W1);⇓(R1,R1);⇓(W0,R0);⇑(R0)} hcoli{⇓(W0,Idl,Idl,R0,R0);⇑(R0)} hcoli{⇓(W0,W1);⇓(W1,W1);⇓(R1)} hcoli{⇑(W0);⇓(R0,R0,R0)} hcoli{⇑(W0);⇑(R0);⇑(Idl,R0,R0)} hcoli{⇓(W0,Idl);⇑(W0,R0,R0);⇓(R0)} hcoli{⇑(W0,Idl,W0,W1);⇓(R1,R1,R1)} hcoli{⇑(W1,Idl,R1,R1);⇓(R1)} hcoli{⇓(W0);⇓(R0,W1);⇓(R1)} hcoli{⇓(W0,R0,R0,R0,R0);⇑(R0)} hcoli{⇑(W0,W1,R1);⇓(W0);⇓(W1);⇑(R1)} hcoli{⇓(W0,Idl,R0,R0);⇑(R0);⇓(W1);⇑(R1)} hcoli{⇓(W1,W1,W0,R0,W1);⇓(R1)} hcoli{⇑(W1,R1,W1,W0,W0,W1,R1)} hcoli{⇓(W1);⇓(Idl);⇑(Idl);⇓(W1,R1,R1);⇑(R1)} hcoli{⇑(W0);⇓(R0);⇓(R0);⇑(R0);⇑(W1);⇑(R1)} hcoli{⇑(W0);⇓(R0,R0,Idl);⇓(R0,R0)} hcoli{⇓(W1,W1,W1,R1);⇑(R1)} hcoli{⇓(W1,R1);⇑(W0,R0,R0,R0);⇓(R0)} hcoli{⇓(W1,R1);⇑(R1);⇓(R1);⇓(R1);⇓(Idl);⇓(R1)} hcoli{⇑(W0);⇓(R0,R0)} hcoli{⇑(W0,Idl);⇑(R0)} hcoli{⇓(W0);⇓(W0);⇓(R0)} hcoli{⇑(W1,W0);⇓(R0)} Tabella 6.3. Risulati sperimentali 91 6 – Caso di studio tensione, rispettivamente sulla true bit line e sulla complement bit line. Come si osserva nella figura, in corrispondenza dell’operazione di lettura la tensione sulla complement bit line non raggiunge la soglia di commutazione, mantenendo la cella nello stato associato all’1 logico. La tabella 6.3 riporta per le diverse classi di difetto le due sequenze di collaudo che sono state generate con maggior frequenza. Le sequenze prodotte utilizzano tutte un address mode di tipo column mode. Questa scelta è legata al fatto che, per le classi di difetto analizzate, si è dimostrata essere efficace una fase di indirizzamento caratterizzata da una direzione principale di scansione lungo la stessa word line. Operazioni eseguite su celle adiacenti a quella difettosa e poste sulla stessa word line hanno un effetto di eccitazione del guasto equivalente a quello di sequenze di operazioni eseguite sulla cella difettosa [14, 15], permettendo di minimizzare il numero di operazioni richieste da un march test. Si noti che molte Figura 6.4. Andamento della fitness media e della fitness massima per il difetto DF 2 con dimensione di 0.1 MΩ delle sequenze generate dallo strumento automatico risultano tra loro equivalenti dato che cambia in genere l’aggregazione delle operazioni e l’address order utilizzato nei vari march element. Tuttavia, per molti difetti, una variazione dell’ordine di 92 6.2 – Generazione di march test esecuzione delle operazioni risulta ininfluente, e questo origina sequenze di collaudo tra loro equivalenti. Va osservato che per le categorie di difetti DF 1 , DF 2 e DF 6 alcune sequenze mostrano una lunghezza associata alla fase di eccitazione superiore a 1, nonostante la natura statica del difetto. Questo comportatmento è legato all’azione dell’operatore rlg che può introdurre precocemente nuove operazioni nella sequenza di collaudo. La figura 6.4 mostra l’andamento medio della fitness e il valore della fitness massima all’interno della popolazione nel corso delle varie iterazioni, con riferimento alla generazione della sequenza di collaudo per il difetto DF 2 con dimensione di 0.1 MΩ. Come si può osservare la fitness massima calcolata ad ogni Figura 6.5. Andamento della fitness media e della fitness massima per il difetto DF 1 con dimensione di 1.0 MΩ generazione tende ad aumentare progressivamente. Ciò mostra come l’algoritmo genetico procede nell’esplorazione dello spazio delle soluzioni, spostandosi da regioni rappresentate da cromosomi con un basso grado di eccitazione del difetto a livello elettrico (regioni caratterizzate da bassi valori di fitness) verso regioni rappresentate da cromosomi in grado di eccitare adeguatamente il difetto e di portare i due modelli di memoria in due stati logici differenti (regioni con valori di fitness più alti). Questo 93 6 – Caso di studio comportamento è messo in luce anche dall’andamento medio della fitness, che tende ad oscillare in una fascia di valori vicina a quella relativa alla fitness massima. La figura 6.5 mostra l’andamento della fitness media e massima durante la generazione della sequenza di test per il difetto DF 1 con dimensione di 1.0 MΩ. In questo caso è visibile l’effetto sulla fitness indotto dall’azione dell’operatore di mutazione rlg. L’introduzione di una nuova operazione nella sequenza di test, impone una fase di validazione di tutta la popolazione, compresi gli individui migliori salvati nell’iterazione precedente. L’azione di validazione modifica la struttura della popolazione che quindi si sposta da una regione dello spazio delle soluzioni caratterizzata da una fitness più alta ad una regione caratterizzata da una fitness più bassa. L’operatore può quindi indurre peggioramenti locali a fronte di un’incremento dello spazio di ricerca. Dall’analisi dei dati relativi agli esperimenti svolti, emerge come l’approccio utilizzato per la generazione di march test, basato su un algoritmo genetico, si sia dimostrato in grado di fornire risultati interessanti, seppur riferiti ad un modello di memoria basato su una tecnologia CMOS non specifica. 6.2.1 Sviluppi futuri Lo strumento sviluppato per questo lavoro rappresenta un valido prototipo, utilizzabile come base di partenza per ulteriori futuri sviluppi. Tra i filoni individuati per ulteriori miglioramenti si possono citare i seguenti: • parallelizzazione: l’idea è quella di sviluppare attorno all’attuale prototipo di strumento per la generazione di sequenze di collaudo, un’infrastruttura capace di utilizzare il parallelismo delle macchine multiprocessore. In quest’ottica l’adozione di un modello computazionale basato su un algoritmo genetico, potrebbe trarre beneficio dal parallelismo della macchina, in quanto questa classe di algoritmi lavora su insiemi di soluzioni piuttosto che con singole soluzioni. In particolare si può beneficiare del fatto di poter eseguire contemporaneamente le simulazioni legate alle sequenze di collaudo rappresentate dagli individui della popolazione (il processo di simulazione è l’elemento che maggiormente limita la velocità di analisi delle sequenze da parte dell’algoritmo genetico e quindi limita il numero di individui della popolazione utilizzabili e il numero massimo di iterazioni). 94 6.2 – Generazione di march test • adapting techniques: l’utilizzo di tecniche automatiche di determinazione dell’insieme ottimale dei parametri dell’algoritmo, permette un utilizzo più efficace dello strumento, evitando l’esecuzione della fase di tuning e permettendo di concentrarsi maggiormente sull’analisi delle sequenze di test; • miglioramento del modello di memoria: l’uso di un modello di memoria basato su una specifica tecnologia CMOS, consentirebbe l’analisi di difetti associati a guasti complessi caratterizzati da un comportamento di tipo dinamico. Inoltre il modello permetterebbe l’analisi di difetti localizzati in altre aree del circuito di memoria, quali ad esempio i circuiti di decodifica e i circuiti di precarica delle bit line. 95 Appendice A Modello sperimentale di memoria A.1 * * * * * * * * * * Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Node 8 Node 9 Node 10 Modulo circuitale SRAM con matrice 3x3 := := := := := := := := := := address 0 address 1 address 2 address 3 address 4 address 5 data input write / read enable operation precharge clock (row 0) (row 1) (row 2) (column 0) (column 1) (column 2) (write=1 / read=0) (enable=1) .options reltol=0.1 .options itl4=50 .width out=132 .include .include .include .include .include xprec1 xprec2 xprec3 ./and2.cir ./and3.cir ./cell_g.cir ./prech.cir ./inverter.cir 10 17 18 10 19 20 10 21 22 prech prech prech 96 A.2 – Cella statica xcell1 xcell2 xcell3 xcell4 xcell5 xcell6 xcell7 xcell8 xcell9 mn1 mn2 mn3 mn4 mn5 mn6 xand1 xand2 xand3 xand4 xand5 xand6 xnot c1 c2 c3 c4 c5 c6 17 18 19 20 21 22 4 5 6 11 11 11 12 12 12 13 13 13 14 14 15 15 16 16 1 2 3 8 8 8 17 19 21 17 19 21 17 19 21 7 23 7 23 7 23 9 9 9 9 9 9 7 17 18 19 20 21 22 18 20 22 18 20 22 18 20 22 0 0 0 0 0 0 11 12 13 14 15 16 23 0 0 0 0 0 0 cellg cellg cellg cellg cellg cellg cellg cellg cellg nmosfet nmosfet nmosfet nmosfet nmosfet nmosfet and2 and2 and2 and3 and3 and3 not 0.01p 0.01p 0.01p 0.01p 0.01p 0.01p w=8u w=8u w=8u w=8u w=8u w=8u .model nmosfet nmos .end A.2 Cella statica * Node 1 := word line * Node 2 := true bit line * Node 3 := complement bit line 97 l=2u l=2u l=2u l=2u l=2u l=2u A – Modello sperimentale di memoria .subckt vdd mp1 mp2 mn1 mn2 mn3 mn4 cellg 4 0 5 6 4 6 5 4 5 6 0 6 5 0 2 1 5 3 1 6 4 4 0 0 0 0 1 2 3 5v pmosfet pmosfet nmosfet1 nmosfet1 nmosfet2 nmosfet2 .model nmosfet1 nmos + + + (level=2 tpg=1 phi=0.70 vto=0.7513) .model pmosfet + + + (level=2 tpg=1 phi=0.70 vto=-0.9784) pmos w=10u w=10u w=4u w=4u w=8u w=8u .model nmosfet2 nmos .ends A.3 Circuito di precarica * Node 1 := precharge enable * Node 2 := true bit line * Node 3 := complement bit line .subckt vdd mp1 mp2 mp3 prech 4 0 2 1 3 4 2 1 4 4 3 1 4 4 1 2 3 5v pmosfet pmosfet pmosfet .model pmosfet pmos .ends 98 l=2u l=2u l=2u l=2u l=2u l=2u A.4 – Porte logiche A.4 Porte logiche * Inverter * Node 1 := input * Node 2 := output .subckt vdd mp1 mn1 not 3 0 2 1 3 3 2 1 0 0 1 2 5v pmosfet nmosfet .model pmosfet pmos .model nmosfet nmos .ends * * * * Gate Node Node Node .subckt vdd xnot mtp1 mtp2 mtn1 mtn2 and 2 inputs 1 := input 2 := input 3 := output and2 6 0 4 3 4 1 6 4 2 6 4 1 5 5 2 0 6 6 0 0 1 2 3 5v not pmosfet pmosfet nmosfet nmosfet .model pmosfet pmos .model nmosfet nmos .ends * * * * * Gate Node Node Node Node and 3 inputs 1 := input 2 := input 3 := input 4 := output 99 A – Modello sperimentale di memoria .subckt vdd xnot mtp1 mtp2 mtp3 mtn4 mtn5 mtn6 and3 5 0 6 4 6 1 5 6 2 5 6 3 5 6 1 7 7 2 8 8 3 0 5 5 5 0 0 0 1 2 3 4 5v not pmosfet pmosfet pmosfet nmosfet nmosfet nmosfet .model pmosfet pmos .model nmosfet nmos .ends 100 Bibliografia [1] Semiconductor Industry Association (SIA) http://www.sia-online.org/home.cfm [2] International Technology Roadmap for Semiconductors (ITRS), 2006 edition, http://www.itrs.net [3] R. D. Adams, High performance testing. Design priciples, fault modeling and self-test, Kluwer academic publisher, 2003. [4] J. Millman, C. C. Halkias, Microelettronica, Boringhieri, 1972. [5] E. Taub, D. Schilling, Elettronica integrata digitale, Gruppo Editoriale Jackson, 1981. [6] P. Mazumdern, E. M. Rudnik, Genetic Algorithms for VLSI design, layout and test automation, Prentice Hall, 1999. [7] L. Davis, Handbook of genetic algorithms, Van Nostrand Reinhold, 1991. [8] M. Bucci, D. Circelli, Algoritmi genetici e simulated annealing per la soluzione parallela di problemi di ottimizzazione combinatoriale, Tesi di laurea, Università degli studi di Pisa, 1996. [9] D. Whitley, A genetic algorithm tutorial, Computer science department, Colorado state university. [10] S. Hamdioui, Z. Al-Ars, A. J. van de Goor, M. Rodgers, Linked faults in random access memories: concepts, fault models, test algorithms and industrial results, Trans. on Computer-aided design of integrated circuits and systems, IEEE, vol. 23, no. 5, May 2004. [11] R. Dekker, F. Beenker, L. Thijssen, Fault modeling and test algorithm development for static random access memories, International Test Conference, IEEE, 1988. [12] L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, S. Borri, Comparison of 101 Bibliografia [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] open and resistive-open defect test conditions in SRAM address decoders, Proc. of the 12th Asian Test Symposium, IEEE, 2003. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, S. Borri, March iC-: an improved version of March C- for ADOFs detection, Proc. of the 22nd VLSI Test Symposium, IEEE, 2004. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, S. Borri, M. B. HageHassan, Dynamic read destructive fault in embedded-SRAMs: analysis and march test solution, Proc. of the 9th European Test Symposium, IEEE, 2004. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, S. Borri, M. B. HageHassan, Resistive-open defects in embedded-SRAM core cells: analysis and march test solution, IEEE pp. 266-271, 2004. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, M. B. Hage-Hassan, Resistive-open defects influence in SRAM Pre-charge circuits: analysis and characterization, Proc. of the European Test Symposium, IEEE, 2005. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, M. B. Hage-Hassan, Data retention fault in SRAM memories: analysis and detection procedures, Proc. of the 23rd VLSI Test Symposium, IEEE, 2005. L. Dilillo, P. Girard, S. Pravossoudovitch, A. Virazel, M. B. Hage-Hassan, Resistive-open defects injection in SRAM core-cell: analysis and comparison between 0.13µm and 90nm technologies, DAC’05, June 13-17, 2005, Anaheim, California, USA, ACM, 2005. A. Benso, S. Di Carlo, G. Di Natale, P. Prinetto, An optimal algorithm for the automatic generation of march tests, Proc. of the 2002 Design, Automation and Test in Europe Conference and Exhibition, IEEE, 2002. F. Corno, P. Prinetto, M. Rebaudengo, M. Sonza Reorda, Gatto: a genetic algorithm for automatic test pattern generation for large synchronous sequential circuits, Trans. on Computer-aided design of integrated circuits and system, IEEE, vol. 15, no. 8, August 1996. P. Prinetto, M. Rebaudengo, M. Sonza Reorda, E. Veiluva, Gatto an intelligent tool for automatic test pattern generation for digital circuits, IEEE pp. 411-417, 1994. A. J. van de Goor, J. E. Simonse, Defining SRAM resistive defects and their simulation stimuli. 102