Soluções de Auto-teste para Sistemas Electrónicos
Transcrição
Soluções de Auto-teste para Sistemas Electrónicos
UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO Soluções de Auto-teste para Sistemas Electrónicos Ruben Tagarroso Janeiro Correia nº46687 LICENCIATURA EM ENGENHARIA ELECTROTÉCNICA E DE COMPUTADORES Relatório de Trabalho Final de Curso Prof. Orientador: João Paulo Cacho Teixeira Prof. Co-Orientador: Isabel Maria Silva Nobre Parreira Cacho Teixeira Lisboa Outubro de 2006 Agradecimentos Queria agradecer aos Professores João Paulo Cacho Teixeira e Isabel Maria Silva Nobre Parreira Cacho Teixeira, que com toda a sua dedicação, orientação e disponibilidade, ajudaram ao longo deste projecto. Queria agradecer ainda ao Professor Marcelino Bicho dos Santos e ao Abílio Parreira por toda a ajuda que me dispensaram e pelos meios técnicos que me disponibilizaram, um obrigado muito especial ao Marcial Irago pelas ajudas a nível do software, ao Pedro Bento, ao Professor Fernando Gonçalves e ao Jorge Semião um muito obrigado pela ajuda na compreensão do autoteste integrado (BIST, Built In Self Test) . Finalmente queria agradecer aos meus amigos pelo apoio, ajuda e motivação e a minha família por me ter disponibilizado os meios para conseguir fazer o curso e este relatório. ii Resumo O projecto de sistemas digitais complexos torna necessário o desenvolvimento de soluções de teste economicamente viáveis, para aferição da qualidade do produto, após a produção e durante a sua vida útil. O auto-teste integrado (BIST, Built-In-Self-Test) pode ser uma solução atraente, já que permite conter os custos de equipamento automático de teste (ATE, Automatic Test Equipment) e viabilizar o auto-teste durante a vida útil, mesmo que os circuitos integrados são embebidos em sistemas mais complexos. A verificação da integridade física de cada componente, para assegurar a qualidade do produto, requer uma solução BIST estrutural. Usualmente, durante a vida útil do produto, o que o utilizador pretende é verificar se o componente ainda é capaz de assegurar a funcionalidade correcta. Tal objectivo requer uma solução BIST funcional. Uma vez que os objectivos de teste nestas duas aplicações diferem, torna-se necessário analisar e concluir se uma solução de BIST funcional poderá ser reutilizada para BIST estrutural. As técnicas de projecto tendo em vista a testabilidade (DfT, Design for Testability) devem ser integradas no fluxo de projecto do produto, quer seja implementado em tecnologia reconfigurável (FPGA) quer em circuito integrado de aplicação específica (ASIC). A síntese lógica pode ser efectuada com recurso a muitas opções (por exemplo, com optimização da área de silício ou da rapidez de resposta). Assim, torna-se útil avaliar o impacto que as diferentes estruturas lógicas têm sobre a testabilidade do circuito. Adicionalmente, é necessário avaliar a qualidade da solução BIST, em função da eficiência do teste (medida pela cobertura de faltas) e da sobrecarga do teste, especialmente para módulos sequenciais. O objectivo deste Trabalho Final de Curso é duplo. Primeiro, recorrendo-se a sistemas de projecto automático comerciais (EDA, Electronic Design Automation), nomeadamente Cadence e Synopsys, definir o fluxo de projecto para uma inserção eficiente de BIST, tendo em consideração as vantagens e limitações de cada solução BIST. Segundo, discutir a possibilidade de desenvolver uma solução unificada de BIST para implementar o auto-teste funcional e estrutural. O trabalho é realizado utilizando um caso de estudo do mundo real, um controlador de leitura de um sistema electrónico de aquisição de dados para imagiologia médica (mamografia, com recurso a tecnologia PET (Positron Emission Tomography). Nesta aplicação, existia previamente uma solução de BIST funcional numa implementação em FPGA. Neste TFC, desenvolveu-se uma solução BIST estrutural com varrimento (test-per-scan) baseada em implementação ASIC e comparam-se as duas soluções. Demonstra-se que a utilização dos estímulos de auto-teste funcional conduzem a valores reduzidos da cobertura de faltas (62,5%). Contudo, se esses estímulos forem utilizados para verificar que a funcionalidade é correcta, então as faltas associadas à estrutura que realiza a funcionalidade-alvo da aplicação são detectadas por este padrão de teste funcional. Assim, para este objectivo, o teste funcional pode ser reutilizado como teste estrutural parcial. A sobrecarga do teste da solução proposta para o caso de estudo é elevada; contudo, isso deve-se ao facto da complexidade do controlador ser limitada. Para módulos de complexidade compatível com a utilização de BIST estrutural clássico, a sobrecarga de teste será reduzida. Palavras Chave Sistema auto teste integrado, Teste Funcional e Estrutural, Cadeia de varrimento (Scan), Cobertura de faltas iii Abstract Complex system digital design drives the need to develop cost-effective test solutions, for product and lifetime quality assessment (production and lifetime test). BIST (Built-In-Self-Test) is an attractive solution, as it allows constraining ATE (Automatic Test Equipment) costs and enabling lifetime self-test, even when chips are embedded in a more complex system. Checking for physical integrity of the component, to guarantee product quality, requires structural BIST. Often, during product lifetime, users mainly want to make sure the component is still able to perform the correct functionality. This requires functional BIST. As test objectives differ for these two applications, work needs to be carried out to understand if functional BIST can be reused for structural BIST. Design for Testability (DfT) techniques need to be smoothly integrated in the product design flow, either for reconfigurable (FPGA) or for ASIC (Application-Specific) implementations. As logic synthesis can be performed using many options (e.g., for silicon area or speed optimization), it is worthwhile to evaluate the testability of these different logic structures. Moreover, BIST quality, in terms of test effectiveness (measured by the fault coverage metrics) and test overhead, especially for sequential modules, needs to be ascertained. The purpose of this Final Work Program is twofold. First, using commercial EDA (Electronic Design Automation) systems, namely Cadence and Synopsys, to define a design flow for costeffective BIST insertion, taking into account the advantages and limitations of each BIST solution. Second, to discuss the possibility of having a unified BIST solution to accommodate both structural and functional self-test. The work is performed using a real-world case study, the readout controller of a data acquisition electronic system for medical imaging (mammography, using PET (Positron Emission Tomography) technology). In this application, so far functional BIST has been inserted with an FPGA-based implementation. In this Final Work, a test-per-scan BIST solution is developed for structural BIST (ASIC-based implementation), and the two solutions are compared. It is shown that using functional BIST test stimuli leads to limited fault coverage (62.5%). However, if these stimuli are used to verify the correctness of the functionality, then we show that faults associated with the parts of the structure used to implement the target functionality of the device are, in fact, detected by the functional test. Hence, for this purpose, the functional BIST can be reused as a partial structural BIST. Due to the limited complexity of the controller, test overhead is high. However, more complex modules for which usually BIST solutions are devised will lead to low overhead. Keywords Built-in Self test Functional and Structural test Scan chain Fault coverage iv Índice Agradecimentos............................................................................................................................... ii Resumo........................................................................................................................................... iii Palavras Chave ............................................................................................................................... iii Abstract ...........................................................................................................................................iv Keywords ........................................................................................................................................iv Lista de Figuras ............................................................................................................................. vii Lista de Tabelas...............................................................................................................................ix Lista de Programa............................................................................................................................ix Acrónimos ........................................................................................................................................1 1. Introdução.................................................................................................................................1 1.1. Motivação.........................................................................................................................1 1.2. Objectivo ..........................................................................................................................2 1.3. Roteiro..............................................................................................................................2 2. Projecto de CI Testáveis...........................................................................................................3 2.1. Necessidade do Teste .......................................................................................................3 2.2. Técnicas de DfT (Design for Testability) ........................................................................4 2.3. A Metodologia BIST (Built-In Self Test) ........................................................................6 2.4. Indicadores de Qualidade .................................................................................................8 3. Fluxo de Projecto ...................................................................................................................10 3.1. FPGA e ASIC.................................................................................................................10 3.2. Sistemas e Ferramentas de Projecto Automático (EDA) ...............................................11 3.3. Casos de Estudo Elementares (XTRAN & B01) ...........................................................13 3.3.1. XTRAN ..................................................................................................................13 3.3.2. B01 .........................................................................................................................15 4. Fluxo de Projecto com BIST e Análise das Soluções ............................................................18 4.1. Caso de Estudo: Controlador RD_ROC.........................................................................18 4.1.1. Síntese e Optimização ............................................................................................20 4.1.2. Criação da Test-bench e Teste do Circuito.............................................................21 4.1.3. Geração de Vectores de Teste ................................................................................23 4.2. Implementação FPGA. BIST Funcional ........................................................................26 4.3. Implementação ASIC. Fluxo de projecto com BIST Estrutural.....................................30 4.3.1. Gerador de Vectores de Teste Pseudo-aleatório (PR)............................................31 4.3.2. Multiplexer .............................................................................................................32 4.3.3. Circuito Sob Teste (CUT) ......................................................................................33 4.3.4. Compactador ..........................................................................................................33 4.3.5. Comparador............................................................................................................34 4.3.6. Registo de Assinatura.............................................................................................34 4.3.7. Desenvolvimento e Implementação do BIST.........................................................34 4.4. Análise de Resultados ....................................................................................................44 4.4.1. Cobertura de Faltas do Circuito RD_ROC sem BIST............................................44 4.4.2. Cobertura de Faltas do Circuito RD_ROC com BIST ...........................................46 5. Conclusões .............................................................................................................................50 6. Referências .............................................................................................................................53 Anexos............................................................................................................................................54 v RD_ROC Test Bench .................................................................................................................55 PLI..........................................................................................................................................58 Código VHDL dos Diferentes Blocos........................................................................................60 Control....................................................................................................................................60 LFSR ......................................................................................................................................64 MISR ......................................................................................................................................70 MUX.......................................................................................................................................73 Top Level ...............................................................................................................................74 BIST Test Bench ........................................................................................................................77 vi Lista de Figuras Figura 2. 1 - Exemplo de aplicação da metodologia BIST ..............................................................6 Figura 2. 2 - MISR ...........................................................................................................................7 Figura 3. 1 - Circuito xtran.............................................................................................................14 Figura 3. 2 - Clock mínimo para xtran (ns)....................................................................................15 Figura 3. 3 – Circuito B01 não optimizado (descrição RTL).........................................................16 Figura 3. 4 – Esquema do B01 optimizado frequência de relógio (nível lógico) ..........................17 Figura 3. 5 – Esquema B01 optimizado área (nível lógico)...........................................................17 Figura 4. 3 – RD_ROC, package....................................................................................................18 Figura 4. 4 – Máquina de Estados do circuito de RD_ROC ..........................................................19 Figura 4. 1 – Contador rd_counter_EvT.vhd .................................................................................20 Figura 4. 2 - Contador rd_counter_EvN.vhd..................................................................................20 Figura 4. 5 – Relatórios de síntese para optimização a) desempenho b) área..... Error! Bookmark not defined. Figura 4. 6– Ilustração da sincronização entre os clocks ...............................................................22 Figura 4. 7 – Relatórios de síntese com eliminação de latches para optimização a) desempenho b) área .................................................................................................Error! Bookmark not defined. Figura 4. 8 – Relatórios de síntese com eliminação de latches e warnings para optimização a) desempenho b) área........................................................................................................................21 Figura 4. 9 – Explicação de funcionamento dos três primeiros estados do circuito (ModelSim™) ........................................................................................................................................................24 Figura 4. 10 – Máquina de Estados criada a partir do ficheiro RD_ROC original ........................25 Figura 4. 11 – Agrupamento de módulos do DAE nas FPGA's.....................................................26 Figura 4. 12 – Descrição esquemática da estratégia de teste. ........................................................28 Figura 4. 13 – Arquitectura genérica do controlador local de teste. ..............................................29 Figura 4. 14 - Arquitectura BIST utilizada ....................................................................................30 Figura 4. 15 – Fluxo de projecto BIST estrutural ..........................................................................31 Figura 4. 16 - Gerador de vectores pseudo-aleatórios....................................................................32 Figura 4. 17 - Exemplo de LFSR com N=4 ...................................................................................32 Figura 4. 18 - MUX........................................................................................................................33 Figura 4. 19 - Compactador............................................................................................................33 Figura 4. 20 - Comparador .............................................................................................................34 Figura 4. 21 - Registo de assinatura ...............................................................................................34 Figura 4. 22 - top level, package....................................................................................................35 Figura 4. 23 – Circuito BIST..........................................................................................................36 Figura 4. 24 – LFSR, package........................................................................................................37 Figura 4. 25 – mux, package ..........................................................................................................37 Figura 4. 26 – RD_ROC com scan, package..................................................................................38 Figura 4. 28 – compactador, package ............................................................................................40 Figura 4. 29 – controlador, package...............................................................................................42 Figura 4. 30 – Maquina de estados do controlador ........................................................................43 vii Figura 4. 31 - Cobertura de faltas de RD_ROC com 10 mil vectores aleatórios ...........................44 Figura 4. 32 – Cobertura de faltas de RD_ROC com vectores usados em FPGA .........................45 Figura 4. 33 – Cobertura de faltas de RD_ROC com vectores usados em FPGA, 10.000 vectores ........................................................................................................................................................46 Figura 4. 34 – Área do circuito com BIST.....................................................................................47 Figura 4. 35 – Área dos diferentes blocos do circuito com BIST ..................................................48 Figura 4. 36 – Cobertura de Faltas com BIST................................................................................49 viii Lista de Tabelas Tabela 4. 1:resultados simulação PLI.(caso 1)...............................................................................22 Tabela 4. 2:resultados simulação PLI.(caso 2)...............................Error! Bookmark not defined. Tabela 4. 3:resultados simulação PLI.(caso 3)...............................Error! Bookmark not defined. Tabela 4. 4:estados activados por vectores ....................................................................................23 Tabela 4. 5:resumo dos resultados de simulação com PLI ............................................................26 Tabela 4. 6: Resultados de simulação com PLI para diferente número de vectores de entrada ....26 Tabela 4. 7:portos de Top_level.....................................................................................................35 Tabela 4. 8:Portos de lfsr................................................................................................................37 Tabela 4. 9:Portos de Mux .............................................................................................................38 Tabela 4. 10:Portos de RD_ROC com scan ...................................................................................39 Tabela 4. 11: Portos de compactador .............................................................................................40 Tabela 4. 12: Portos de control.......................................................................................................41 Lista de Programas EDA Verilog™, simulador da Cadence; PLI™, interface a usar com Verilog; Design_Vision™, Ferramenta de síntese da Synopsys para ambiente Linux; ModelSim™, simulador lógico da Mentor Graphics; ISE Webpack™, utilizado para realização dos ficheiros VHDL, ferramenta da Xilinx para descrever e programar FPGA’s; ix Acrónimos ASIC – Application-Specific Integrated Circuit ATE – Automated Test Equipment BGA – Ball Grid Array BIST – Built In Self Test CI – Circuito Integrado CUT – Circuit Under Test DAE - Data Acquisition Electronics EDA – Electronic Design Automation FPGA – Field Programmable Gate Array HDL - Hardware Description Language JTAG – Joint Test Action Group LFSR – Linear Feadback Shift Register LSA - Line Stuck-At LUT – Look Up Table MISR – Multiple Input Signature Register MUX – Multiplexer PCB - Printed Circuit Board PET - Positron Emission Tomography PRPG – Pseudo Random Pattern Generator RTL – Register Transfer Level SoC - Systems on a Chip TE - Test Effectiveness TL - Test Length TO - Test Overhead TP - Test Power TPG – Test Pattern Generator TPI – Test Point Insertion VHDL – Very High-level Hardware Description Language VLSI – Very Large Scale Integration 1 1. Introdução Com o aumento da complexidade dos circuitos integrados (CI), aumenta também a possibilidade de ocorrerem falhas nos mesmos, falhas essas que muitas vezes são difíceis de detectar num teste de produção. Torna-se ainda mais complicado detectar uma falha numa placa de circuito impresso, isto é, detectar qual o circuito integrado que está a causar o mau funcionamento da placa. Uma solução simples seria o próprio circuito integrado indicar se está com mau funcionamento. Para que tal situação fosse possível, o integrado teria de estar munido de um teste interno, ou auto teste integrado (BIST, Built In Self Test) [2]. Hoje em dia já se usam essas soluções, em especial em aplicações críticas de segurança, tais como nos ramos da aviação e ferroviário. Os componentes aqui aplicados têm um sistema de auto-teste que indica se estão a funcionar correctamente, o que é muito útil, por exemplo, no caso dos aviões em que os circuitos indicam o seu mau funcionamento antes que estes efeitos provoquem uma catástrofe. 1.1. Motivação A complexidade e a qualidade dos produtos tornam necessário projectar CI digitais testáveis [1]. Muitos produtos são desenvolvidos e prototipados em tecnologia de hardware reconfigurável (FPGA, Field Programmable Gate Array). Posteriormente, se a aplicação o tornar rentável, migram para implementação em ASIC (Application-Specific Integrated Circuit). Para uma design house, é necessário desenvolver um fluxo de projecto automático, com base em sistemas de projecto automático EDA (Electronic Design Automation) comerciais, para produzir soluções testáveis e, muitas vezes, auto-testáveis. Seria muito interessante poder aplicar auto-teste a todos os sistemas electrónicos, conseguindo-se assim saber se estão a funcionar correctamente e, deste modo, facilitando eventuais reparações. Claro que projectar um circuito com auto-teste é mais dispendioso, mas existem vários tipos de auto-teste com diferentes custos de implementação [3] Entre eles, como se descreve no capítulo 2, conta-se o auto-teste com varrimento (test-per-scan BIST) [1]-[3]. Este tipo de teste é uma mais valia para o consumidor que certamente saberá dar valor a esta funcionalidade para além de aumentar a qualidade dos produtos e facilitar a assistência técnica. Do ponto de vista empresarial leva-se mais tempo a projectar o produto mas consegue-se lançá-lo com bastante rapidez, devido a não haver necessidade de fazer muitos testes externos, poupando assim custos em equipamento de teste externo (ATE, Automated Test Equipment). A assistência pós-venda vai ter muito menos procura, devido à alta qualidade do produto, e torna-se mais fácil fazer um diagnóstico de reparação. 1 1.2. Objectivo O objectivo deste Trabalho Final de Curso é o desenvolvimento de um fluxo de projecto de um módulo de CI digital com auto-teste integrado, em ASIC, numa tecnologia BIST estrutural em test-per-scan, com análise dos custos de inserção do BIST, e sua aplicação a um caso de estudo, não de um sistema domótico (como inicialmente se previu), mas num sistema de aquisição e processamento de dados de um sistema de imagiologia médica para mamografia baseado em tecnologia PET (Positron Emission Tomography) [4][5]. Pretende-se ainda comparar a solução FPGA com BIST funcional, com a solução ASIC com BIST estrutural e discutir se (e em que condições) se poderá reutilizar a solução de BIST funcional para auto-teste funcional. 1.3. Roteiro Este documento está organizado como se indica em seguida. No capítulo 2 revêem-se conceitos básicos sobre a necessidade do teste e do projecto tendo em vista a testabilidade (DfT, Design for Testability). Recordam-se as técnicas DfT mais comuns (técnica de varrimento (scan) e de auto teste integrado (BIST)). Identificam-se ainda os indicadores de qualidade de teste, que permitem uma análise de compromissos e de valor relativo de diversas soluções. No capítulo 3 identificam-se os fluxos de projecto automático para implementação em FPGA (em uso) e em ASIC (proposto neste trabalho). Concretiza-se para os sistemas EDA disponíveis no INESC-ID e apresenta-se a sua aplicação em casos de estudo elementares, um circuito combinatório industrial (XTRAN, da Tecmic [6]) e um circuito sequencial (circuito de referência B01 [7]). O capítulo 4 descreve a aplicação da metodologia e fluxo de projecto propostos num caso de estudo prático, um módulo de um sistema DAE (Data Acquisition Electronics [8]) de um sistema de imagiologia médica – um detector de nódulos cancerígenos através de mamografia com tecnologia PET. O módulo é descrito e colocado em contexto no sistema. A solução FPGA (desenvolvida pelo Eng.º. Pedro Bento, e apresentada na sua dissertação de Mestrado [9]) é brevemente descrita. Em seguida, apresenta-se o fluxo de projecto com inserção de BIST estrutural e a correspondente implementação ASIC testável, e as duas soluções são comparadas. Finalmente, o capítulo 5 resume as principais conclusões do trabalho e direcções de trabalho futuro. 2 2. Projecto de CI Testáveis 2.1. Necessidade do Teste Os circuitos integrados desde o inicio da sua produção estão sujeitos a ter vários tipos de defeitos físicos, tais como defeitos de processamento, de materiais, de encapsulamento, etc. Estes defeitos podem ser considerados críticos ou não críticos, ou seja, estas falhas podem influenciar ou não o funcionamento normal de um circuito. As falhas que influenciam o funcionamento do circuito são apelidadas de faltas. As faltas são analisadas de uma forma abstracta e não como um defeito físico, não sendo o mais importante descobrir que tipo de falta foi encontrada (fisicamente) mas sim descobrir se existem faltas, o que inutiliza o componente. As faltas podem ser descritas a diversos níveis de abstracção e ser classificadas em diferentes tipos, por exemplo: linhas fixas a um valor lógico (LSA, Line Stuck-At), duas linhas em curto-circuito, uma linha que não foi colocada, etc [1]. Sistemas complexos devem em numerosas situações, poder ser testados, desde a sua fase de produção e ao longo da sua vida útil, de forma a poder monitorizar o seu correcto funcionamento. Estes testes e eventualmente o diagnóstico de falhas e sua correcção deverão ser rápidos, ter uma elevada cobertura de faltas e certificar o funcionamento do componente. Tradicionalmente os circuitos são testados com equipamento de teste automático, onde se armazenam os vectores de teste, se geram os estímulos a aplicar ao CUT (Circuit Under Test) e se analisam as respectivas respostas aos estímulos. Durante o decurso do teste, este equipamento é ligado às entradas e saídas do CUT, procedendo-se à respectiva excitação das entradas e recolha dos valores das suas saídas. Uma desvantagem séria desta abordagem é o facto destes equipamentos de teste serem muito dispendiosos. Adicionalmente o processo de teste é caro, lento e com muitos vectores e limitações de memória por pino, resultando num tempo de utilização por componente elevado. Igualmente desvantajoso é o facto do teste com ATE (Automated Test Equipement) não ser completamente automático, uma vez que as pontas de prova necessitam de ser conectadas manualmente às entradas do circuito. Para além destes inconvenientes, a electrónica por pino no ATE tem vindo a aumentar com a complexidade dos sistemas, tornando difícil medir sinais no dispositivo, o que é essencial no processo de teste. Os sistemas VLSI (Very Large Scale Integration) continuam a tornar-se cada vez mais densos e rápidos com o desenvolvimento das tecnologias nanométricas. Consequentemente o tempo para a geração e a aplicação dos vectores de teste torna-se cada vez maior. Finalmente a quantidade de informação proveniente do teste, a ser armazenada no ATE, tem-se tornado proibitiva. Uma forma de minorar estes problemas é especificar o teste como mais uma função do sistema, de modo a tornar o componente auto-testável. Esta ideia motivou o desenvolvimento de métodos de BIST, providenciando formas de decompor hierarquicamente o sistema em teste, localizando-o em módulos menos complexos e por conseguinte acelerando o processo de teste. Em BIST procede-se à inclusão de mais lógica no circuito original, de modo a poder testá-lo. Desta forma, a maior parte das desvantagens do teste externo são eliminadas pelo BIST, o processo é muito mais económico e passa a ser completamente automático. Para além disso, outra vantagem é o facto das capacidades de teste acompanharem a evolução da tecnologia VLSI, algo que não se verifica com o teste externo. Portas lógicas tornam-se relativamente baratas, em comparação com 3 o esforço para desenvolver programas de teste e com o custo do equipamento de teste automático necessário. 2.2. Técnicas de DfT (Design for Testability) Existem diversas técnicas de teste de circuitos integrados, em particular, técnicas Ad-hoc e estruturadas. Entre as técnicas estruturadas merecem destaque as técnicas de varrimento (scan), de varrimento periférico (BoundaryScan), de auto-teste integrado (BIST, Built-In-Self-Test), e de inserção de portos de teste (TPI, Test-Point-Insertion) [1]-[3]. A técnica de scan é uma das mais utilizadas devido a sua simplicidade de implementação, sendo esta hoje em dia, automaticamente feita por software. Esta técnica consiste em reconfigurar o circuito, em modo de teste, criando uma cadeia entre todos os elementos de memória do circuito, designada por cadeia de scan. Trata-se de uma ligação física entre todos os registos de memoria do circuito, ou seja, a entrada de cada elemento de memoria esta ligada a saída de outro, excepto a entrada do primeiro elemento e a saída do ultimo elemento de memoria, formando assim uma cadeia. A funcionalidade da cadeia de scan é permitir chegar onde as entradas primárias não chegam. De facto, no circuito em modo normal, nem todos os registos de memória conseguem ser controlados pelas entradas do circuito. O mesmo acontece com as saídas das várias portas lógicas, nem todas conseguem ser observáveis nas saídas do circuito. O modo de funcionamento, em modo de teste, de um circuito com scan é relativamente simples. Os dados entram em série na cadeia e saem da mesma forma, como se de um registo de deslocamento (shift register) se tratasse. Quando a cadeia de scan esta preenchida aplica-se um sinal de relógio ao circuito obtendo assim um resultado. Imagine-se um circuito com 5 registos de memória (flip-flops) no qual se pretende inserir uma cadeia de scan. Adicionam-se duas entradas e uma saída (entrada de dados, entrada de activação da cadeia e saída de dados). Cria-se uma cadeia do tipo shift register entre os registos e alteram-se os mesmos, de forma a que quando se está a preencher a cadeia de scan estes recebem os valores da cadeia e não os do circuito. Por outras palavras, as entradas dos registos de memoria são multiplexadas entre as da cadeia de scan e as que vem do circuito. Este multiplexer é controlado pela entrada de activação da cadeia. Para testar o circuito activa-se a entrada de activação da cadeia e aplica-se na entrada de dados os 5 bits com que se quer preencher a cadeia. Este procedimento leva 5 ciclos de relógio visto a entrada de dados ser série. Em seguida desactiva-se a entrada de activação de cadeia e aplica-se um ciclo de relógio de forma a obter nos registos de memória a resposta ao conjunto de bits que estes continham. Finaliza-se procedendo a activação da entrada de activação da cadeia, e lê-se na saída de dados os 5 bits obtidos. Note-se que esta operação é em tudo idêntica a operação de inserção de dados na cadeia, o que permite que as duas sejam realizadas ao mesmo tempo possibilitando a entrada de um novo vector. Assim, para este exemplo, são necessários 11 ciclos de relógio para obter a primeira resposta e 6 para obter as seguintes. Resumindo, a técnica de scan é fácil de implementar, conduz a uma boa cobertura de faltas e é realizada com aumento de área de implantação não muito elevado. Como desvantagens refira-se o tempo que requer para que seja realizado um teste e a necessidade de vectores do tamanho da cadeia. Note-se que a cadeia pode ser partida em varias cadeias, de forma a poupar tempo de teste. Contudo, essa solução obriga a aumentar-se o número de pinos. 4 A técnica de BoundraryScan é no essencial uma técnica similar à apresentada anteriormente, mas com a diferença de ligar CI (circuitos integrados) e não elementos de memoria. As placas de circuito impresso (PCB, Printed Circuit Board) hoje em dia contêm vários circuitos integrados. Devido a tecnologia existente (PCB´s com várias camadas, encapsulamentos com pinos BGA) não é possível aceder as linhas ou pinos de teste dos CI´s. Assim criou-se uma cadeia que liga todos os CI´s ao exterior permitindo que estes sejam configurados, testados, etc. Esta cadeia também é conhecida por cadeia de JTAG. Este trabalho tem por objectivo o desenvolvimento de uma metodologia de projecto com BIST (auto-teste integrado) que sequencialmente testa circuitos VLSI, de modo a cobrir o maior número de faltas possível. Uma parte significativa do lucro de um produto pode ser perdida devido aos componentes que são devolvidos, devido ao facto de apresentarem defeitos (field rejects). Uma forma de minimizar este problema consiste usar um sistema de teste melhor na linha de produção. No entanto, esta solução é cara e lenta porque é necessário equipamento que analise componentes complexos e com elevado número de pinos. Com a implementação de BIST num componente, esta tarefa é facilitada porque o teste já vem total ou parcialmente implementado no chip, e vai acompanhá-lo para o resto da sua vida útil. As vantagens do uso desta técnica são: • Baixo custo de teste: ATE mais baratas que permitem que se realizem testes em paralelo aumentando a velocidade do teste de produção. • Melhor cobertura de faltas: ao permitir testes massivos em paralelo, e dispensando a necessidade de testes dispendiosos, mais tempo pode ser gasto para testar cada chip i.e. permite testes mais extensivos a cada componente em particular. • Possibilidade de tempos de teste mais curtos: no caso do chip poder ser dividido em partes, usando múltiplas cadeias de scan, que podem ser testadas em paralelo. • Testes podem ser executados durante toda a vida útil do chip: o consumidor pode testar o seu chip e saber se a funcionalidade do sistema é confiável ou não. No entanto, convém referir algumas desvantagens desta metodologia de auto teste, sendo elas: • • • • Maior área de implementação: maior área implica mais custos. Tempo de acesso e consumo de potência: o número de portas lógicas constituintes aumenta, o que fará com que o circuito fique mais lento e consuma mais energia. Necessidade de uso de mais pinos em algumas arquitecturas de BIST: existe um número limitado de pinos de saída em qualquer integrado e o circuito de BIST necessita de comunicar com o exterior. Não se garante 100% de cobertura de faltas: não se testa o hardware de teste, e o tempo de teste dos circuitos maiores é demasiado grande para que se torne viável testar todos os vectores possíveis. O auto-teste integrado (BIST) tem sido proposto como um poderoso instrumento para técnicas de teste por se dirigir especificamente aos problemas de teste dos circuitos VLSI [2]. O 5 projecto da funcionalidade de auto-teste inclui circuitos de teste dentro de circuitos integrados para gerar vectores de teste e analisar as respostas na saída. Consegue realizar teste interno ao chip de tal modo que reduz significativamente o uso de equipamento externo de teste, claramente complexo. 2.3. A Metodologia BIST (Built-In Self Test) Muitos dos elementos do BIST têm sido desenvolvidos e usados em aplicações práticas ao longo dos anos. Agora que um crescente número de chips se está a tornar em SoC (Systems on a Chip), as questões e problemas de engenharia de sistemas associados estão a tornar-se em problemas a nível industrial e em questões de necessidade comercial ao invés de soluções construtivas. A arquitectura de base de um CUT com BIST pode ser observada na Figura 2. 1. Esta arquitectura é muito eficaz quando o CUT é combinatório. Quando é um circuito sequencial, a solução usual consiste em reconfigurar o CUT, em modo de auto-teste, por forma a aumentar a acessibilidade dos nós internos, em particular, dos nós associados aos elementos de memória. n PIs PIs m POs POs MUX CUT MISR LFSR BIST Controller Figura 2. 1 – Arquitectura-base da metodologia BIST O projecto é realizado utilizando descrições de elevado nível de abstracção (HDL, Hardware Description Language) especificadas num nível de RTL (Register Transfer Level). Estas descrições de alto nível permitem que a funcionalidade de teste seja inserida no início do processo de projecto. Isto trás vantagens, incluindo: independência da tecnologia, melhor integração do BIST e circuitos funcionais e menos impacto no processo de projecto total. Dentro do BIST existem alguns tipos, por exemplo logicBIST e MemoryBIST [13]. As funções desempenhadas pelo logicBIST são baseadas em técnicas de scan design populares. A ideia base consiste em adicionar um PRPG (Pseudo-Random Pattern Generator) [11], às entradas primárias e de scan, e um MISR (Multiple Input Signature Register) às saídas das cadeias de scan e saídas primárias (um esquema exemplificativo do MISR encontra-se na Figura 2. 2). O PRPG é usualmente realizado com um LFSR (Linear Feedback Shift Register). Um controlador BIST gera as formas de onda necessárias para, repetidamente, carregar os padrões pseudo aleatórios para as cadeias de scan, iniciando um ciclo funcional (ciclo de captura) e registando as respostas capturadas no MISR. O MISR comprime as respostas acumuladas num 6 código de detecção de erro, designada por assinatura. Qualquer palavra digital diferente da assinatura do circuito bom indica a presença de defeitos. Figura 2. 2 – Analisador de assinuatura (MISR). Embora os padrões pseudo-aleatórios alcancem uma alta cobertura de teste para a maior parte do scan, existem, com generalidade, faltas resistentes ao teste com os padrões pseudo aleatórios. Uma ferramenta de inserção de pontos de teste (TPI, Test Point Insertion) pode ser utilizada para analisar o circuito à procura desses problemas e automaticamente adicionar portos de teste para assegurar que o teste é realizado na sua totalidade. Uma solução alternativa consiste em adicionar alguns vectores determinísticos para detectar essa faltas. O LogicBIST pode ainda operar a alta velocidade (at-speed), i.e. operando à frequência máxima do CUT [10], permitindo a detecção de defeitos relacionados com atrasos (delays). O controlador BIST, no que concerne ao memoryBIST, é implementado com algoritmos standard determinísticos de teste de memórias. Um “colar” (wrapper) de BIST é colocado em volta da memória embebida. Este “colar” consiste essencialmente em lógica de multiplexagem permitindo que a memória seja alimentada pelo controlador, no modo de teste, em lugar da lógica do utilizador. Tal como no LogicBIST, os padrões de teste podem ser aplicados à velocidade normal de operação (at-speed). Devido às estruturas regulares das memórias, o controlador de MemoryBIST pode ser partilhado por várias memórias. Obviamente, isto reduz a área circundante e a degradação de desempenho por memória e possibilita uma redução do tempo de teste devido ao facto de ser possível fazer-se testes em paralelo. Em BIST podem ser considerados dois tipos, nomeadamente BIST em linha (on-line) e BIST em separado (off-line) [12]. O teste on-line é aquele que se realiza durante o funcionamento normal do circuito. O teste off-line desactiva a funcionalidade do circuito durante um curto período de tampo para poder executar o teste, em modo de teste. No BIST on-line o teste opera paralelamente com o circuito a ser testado (CUT), ou seja, o modo normal de funcionamento inclui teste. O teste on-line é o mais complicado de implementar e tem custos mais elevados (este tipo de teste é utilizado em aplicações críticas de segurança, tais como em aviónica). No BIST off-line o CUT é testado enquanto não está a realizar a sua função normal de funcionamento. No caso de equipamentos de electrónica de consumo, tais como televisores, computadores, telemóveis, pode usar-se um teste off-line que é mais barato e fácil de implementar. Neste caso o teste realiza-se, por exemplo, quando se inicia o aparelho (power-on) ou ciclicamente durante um curto intervalo de tempo em que se encontra em repouso (idle). 7 A maior parte das técnicas de BIST para lógica sequencial envolvem um compromisso entre tempo de execução e hardware adicional. Pode-se caracterizar este compromisso ao classificar as técnicas de BIST em duas categorias distintas: at-clock e at-scan. No at-clock BIST aplica-se um padrão de teste e adquire-se uma resposta em cada período de relógio, justificando assim um teste bastante rápido, mas complicado de implementar, devido a necessidade de ter registos com 4 modos de funcionamento, e por sua vez, mais complexos que os usados na técnica seguinte. Em at-scan BIST, usa-se a capacidade de scan para aplicar um padrão de teste e capturar uma resposta em cada ciclo de scan. Um ciclo de scan corresponde ao número de ciclos de relógio necessários para enviar o padrão para uma cadeia de serial scan ou para mandar a resposta para fora do caminho da cadeia de serial scan (o que for mais extenso), mais um ou mais modos de relógio para se obter resposta do circuito. Quer dizer, se um chip que contenha 1 000 edge-triggered flip-flops tem uma única cadeia de scan completa, o at-scan BIST irá necessitar de 1001 períodos de clock para aplicar um padrão de (grosseiramente 1000 vezes mais lento do que a aproximação de at-clock). As duas aproximações envolvem estruturas de hardware e modos de comunicação distintas. A escolha de uma solução envolve uma análise de compromissos (trade-offs). De um modo geral, um circuito sequencial síncrono pode ser modelado como uma tabela iterativa de lógica combinatória. Em qualquer tempo t, o circuito sequencial comporta-se como um circuito combinatório com elementos de memória que guardam o estado prévio da lógica do tempo t = t − t0 . Deste modo, a detecção de faltas num circuito sequencial pode ser vista como a detecção de múltiplas faltas numa rede combinatória. À medida que o circuito se torna mais complexo, a tarefa de gerar vectores de teste adequados torna-se cada vez mais difícil. A dificuldade em gerar vectores de teste para circuitos sequenciais cresce devido à reduzida controlabilidade1 e observabilidade2 dos elementos de memória i.e. flip-flops e latches. Embora um scan completo com teste de geração combinatório seja visto como uma solução satisfatória, para o problema de teste sequencial existem muitas desvantagens para esta aproximação. Estas incluem a dimensão da área devido ao hardware adicionado, o subsequente alargamento do caminho crítico do circuito e o comprimento dos testes resultantes devido às mudanças em série extensivas dos padrões e respostas. O BIST desenvolvido no âmbito deste projecto é um BIST off-line do tipo logicBIST realizado com técnica at-scan. 2.4. Indicadores de Qualidade A qualidade do teste é aferida por diversos indicadores e métricas: • Eficácia do teste (TE, Test Effectiveness) – a eficácia de um teste depende de: o A cobertura de faltas (FC, Fault Coverage) – esta medida indica a percentagem de faltas detectadas; 1 Valor numérico que indica a possibilidade de controlar a colocação de um valor lógico num ponto do circuito a partir do valor lógico que se coloca na entrada em questão 2 Valor numérico que indica a possibilidade de observar a alteração do valor de um ponto do circuito a partir do valor lógico que se obtém na saída em questão. A observabilidade também depende da controlabilidade. 8 o Modelos de faltas (FM, Fault Models) – existem diferentes modelos de faltas. Quantos mais forem usados, melhor eficácia terá o teste. Alguns exemplos de modelos de faltas em tecnologias CMOS são: Line-Stuck-At-0/1, Bridging, linhas interrompidas, Gate Oxide Short, Floating Gate, etc [1]; • Sobrecarga do teste (TO, Test Overhead) – devido a introdução de novo hardware de teste, aumenta a complexidade (portas lógicas e/ou área de silício) e a degradação do desempenho de circuito. Assim, o novo hardware de teste, para além de influenciar o tamanho do circuito, pode diminuir a sua velocidade de funcionamento em modo normal. • O tempo do teste (TL, Test Lenght) – é o tempo que se leva a aplicar o número de vectores de teste suficientes para se atingir o valor de FC necessário. Em realidade, o tempo de teste é o produto do período de relógio de teste pelo número de vectores do padrão de teste; • Potência do teste (TP, Test Power) – em alguns casos a adição de teste e o consequente aumento de hardware, junto com a necessidade de activar todo o circuito, implicam que quando se esteja a fazer o teste haja um maior consumo de energia e potencia relativamente aos que se observam em modo normal de funcionamento; Neste trabalho utilizou-se extensivamente o modelo de faltas do tipo LSA (linha fixa a) e avaliou-se a eficácia do teste (TE) através da cobertura de faltas, FC, correspondente. Caracterizou-se a sobrecarga de teste (TO) através de duas métricas: o aumento percentual da área de silício (estimada pelo sistema Synopsys™) e a redução percentual da máxima frequência de trabalho do sinal de relógio, fMAX, estimada com uma técnica de simulação lógica explicada adiante (secção 3.3.1). Finalmente, avaliou-se o tempo de teste (TL), através do número de ciclos de relógio necessários para efectuar o auto-teste com a eficácia pretendida. 9 3. Fluxo de Projecto 3.1. FPGA e ASIC O primeiro passo a realizar na produção de um projecto em FPGA é descrever a funcionalidade do circuito a implementar ou obter uma descrição de circuito que se queira implementar. Normalmente usam-se as ferramentas disponibilizadas pelos construtores das FPGA’s, nomeadamente a Xilinx™. Em seguida deve-se simular logicamente o circuito, de forma a verificar se se obtem o funcionamento pretendido. A ferramenta ModelSim™ é usada neste trabalho para este efeito. Antes de se poder passar ao próximo nível tem de se especificar qual a FPGA que se pretende usar. Sem se definir qual a arquitectura da FPGA que se vai usar não faz sentido sintetizar o circuito. As FPGA’s têm uma geometria fixa e recursos finitos. Assim, é necessário garantir que uma descrição pode ser mapeada na FPGA em questão. A síntese produz relatórios que nos informam de tempos de atraso, área ocupada, tempos máximos, etc. Estes relatórios apenas são validos para a FPGA em questão. Em outra FPGA terá comportamentos/velocidades diferentes consoante a tecnologia usada na mesma. Depois do circuito ser mapeado convêm que o mesmo seja simulado antes de ser programado na FPGA. Por fim, deve-se configurar a FPGA e efectuar os testes que o hardware que acompanha a FPGA (normalmente uma placa de desenvolvimento) nos permitir. Para o projecto ASIC usam-se neste trabalho ferramentas comerciais da Synopsys e Cadence. Antes de trabalhar com as ferramentas tem de se especificar as bibliotecas a usar. As bibliotecas contêm informação da tecnologia, do fabricante e o design kit. Neste trabalho usa-se uma tecnologia CMOS 0,35µm da Áustria Micro Systems alimentada a 3.3 V). Note-se que as bibliotecas são diferentes para cada um das ferramentas (Synopsys e Cadence) embora tentem simular os mesmos parâmetros. A Figura 3. 1 apresenta os passos do fluxo de projecto de um sistema digital, até se atingir o nível estrutural (lógico), com indicação das ferramentas utilizadas neste trabalho, nas duas implementações (FPGA e ASIC). A estes passos segue-se o projecto físico, até se gerar a implantação (layout) e a verificação ascendente (bottom-up). O primeiro passo a realizar é obter ou descrever o código de linguagem de descrição de hardware que define a funcionalidade do circuito. Normalmente este código está descrito em alto-nivel (comportamental). A verificação da funcionalidade é realizada com a ferramenta ModelSim™. Um passo importante, de seguida, é fazer a sua síntese lógica, passagem a baixo nível (estrutural). Este processo é feito automaticamente pelas ferramentas do sistema Synopsys, em que o utilizador controla os parâmetros através da escolha de opções. Por exemplo, podem ser especificados tempos de atraso pretendidos ou área máxima pretendida. Depois de realizado este passo o circuito deve ser simulado, de forma a verificar que a síntese não alterou a sua funcionalidade. Também podem ser feitos outros testes, como por exemplo, averiguar a velocidade máxima de funcionamento do circuito. 10 Depois de realizados todos os testes deve ser inserida a cadeia scan (tarefa realizada de automaticamente pelo sistema de ferramentas). Os módulos de auto-teste (BIST) são realizados de forma semelhante à utilizada para criar o circuito a testar. Os módulos devem ser criados em linguagem de alto nível e devem ser sintetizados em conjunto com o circuito, por forma a obter-se um circuito mais compacto e um ficheiro final que contem todo o circuito com a funcionalidade de BIST. Em seguida fazem-se todos os testes necessários, de forma a avaliar a qualidade da solução encontrada, averiguando-se a eficácia do teste na detecção de faltas, a sobrecarga de teste e o seu tempo de execução. Figura 3. 1 – Fases iniciais do fluxo de projecto (com indicação das ferramentas utilizadas para implementação FPGA e ASIC) 3.2. Sistemas e Ferramentas de Projecto Automático (EDA) O software habitualmente usado para produção de documentos e programação de FPGA’s é o software do fabricante de FPGA’s. Neste trabalho, utilizou-se a Xilinx. Esse programa é conhecido como ISE Webpack e tem diversas funcionalidades. A primeira coisa a fazer quando se usa este software é seleccionar a linguagem de descrição de hardware que se vai usar, Verilog ou VHDL. Este programa permite criar vários ficheiros que se unem de forma hierárquica e intuitiva. Quando se tem os ficheiros criados devese fazer a simulação lógica. Antes de simular é necessário criar a base à simulação (test-bench). Esta pode ser criada em modo gráfico ou em modo de texto. Para fazer a simulação lógica usa-se uma ferramenta da Mentor, o Modelsim™. Esta ferramenta possibilita fazer 4 níveis de simulação (lógico, sintetizado, mapeado, simula a FPGA de destino carregada). A simulação lógica é bastante útil porque permite que se aceda a todas as linhas internas do circuito, possibilitando uma boa análise do que se passa internamente, o que permite detectar erros de projecto de uma forma muito rápida e precisa. A simulação física é uma simulação bastante mais pesada porque tem em conta vários aspectos físicos, como por exemplo, 11 atrasos nas linhas, não sendo possível visualizar nós internos, de forma a não tornar a simulação ainda mais lenta e pesada. Por ultimo o Webpack contempla ainda uma ferramenta que permite programar as FPGA’s que estejam ligadas ao PC. É complicado inserir cadeias de scan num projecto para FPGA porque este é todo feito em alto nível, logo não é possível ter uma ferramenta que introduza automaticamente a cadeia de scan. Apenas se consegue introduzir a cadeia após a síntese do circuito. Todavia, como este é sintetizado para FPGA e a FPGA tem arquitectura fixa, não é possível alterar os elementos de memória. As ferramentas da Synopsys e Cadence são usadas para projecto de ASIC’s. A Synopsys possui uma ferramenta, design_vision, que é utilizada para fazer a síntese lógica em ambientes Linux. Esta ferramenta tem de ser bem configurada (associada as respectivas bibliotecas, licenças activas e também associada as bibliotecas). A ferramenta possibilita o uso de diferentes tipos de linguagem de descrição de hardware e permite passar de um nível RTL para o nível lógico, tendo em conta diversos parâmetros tais como: • • • • • • Área máxima que se deseja obter Potência máxima “Fanout” máximo Percentagem mínima de cobertura de faltas Tempos de subida e de descida de relógio Frequência de funcionamento Existem várias opções de optimização de circuito, sendo as mais evidentes, as de mapeamento que podem ser de baixo, médio e alto nível de “esforço” de síntese. Existem ainda a possibilidade de activar as opções de dar prioridade a caminhos mais curtos, e mapeamento incremental. Caso se decida combinar todas estas opções (optimização, prioridade caminhos curtos e mapeamento incremental) podem-se obter 12 opções possíveis. Depois de feita a síntese, pode-se introduzir uma cadeia de scan automaticamente. As ferramentas usadas para simulação pertencem à Cadence. Este software deve ser usado com ficheiros descritos em Verilog. Por isso, quando se usam as ferramentas de síntese, deve terse o cuidado de guardar o resultado neste tipo de linguagem. Licenças e ficheiros de configuração têm de ser preparados antes de usar as ferramentas. De modo a simular o funcionamento é necessária criar uma test-bench. Esta serve para regular o tipo de simulação que é feita, isto é, especificar as entradas, especificar como devem ser lidas as saídas, quantos estímulos devem ser aplicados, a frequência de relógio com que se alimenta o circuito, entre outras possibilidades que não foram usadas neste trabalho. O programa que permite fazer estas simulações é o Verilog™3. Este programa pode ser associado a um script descrito em linguagem C, que aumentam a sua versatilidade. Este script conhecido como interface PLI (Programmable Logic Interface)[15] pode ser criado para executar diversas funções, neste trabalho foi realizado um PLI para avaliar a frequência máxima de funcionamento do circuito. Por último utiliza-se a ferramenta Verifault™, da Cadence, . Esta ferramenta possui um mecanismo de funcionamento idêntico ao da ferramenta Verilog™. Contudo, o seu objectivo é 3 O nome do programa é idêntico ao nome de um tipo de linguagem de descrição de hardware pelo que não devem ser confundidos. 12 contabilizar a cobertura de faltas, FC. Tal como para a ferramenta anterior, é necessário criar um test-bench. Caso se pretenda, podem-se utilizar diversos modelos de faltas para avaliar a cobertura de faltas, FC. Neste trabalho utilizou-se sempre a avaliação por defeito. 3.3. Casos de Estudo Elementares (XTRAN e B01) Neste passo inicial do trabalho, utilizaram-se dois circuitos de teste com o objectivo de experimentar e familiarizar o utilizador com as ferramentas computacionais, um circuito combinatório e um sequencial. 3.3.1. XTRAN O primeiro circuito a ser utilizado foi o circuito XTRAN, descrito em VHDL, um circuito combinatório. Este circuito tem 13 entradas, mais uma de relógio, 11 saídas e é habitualmente usado (no INESC-ID) por quem se inicia na síntese e optimização de circuitos. Para conseguir optimizar o circuito foi usada a ferramenta “design_vision” da Synopsys. Esta ferramenta permite visualizar o esquemático a partir do ficheiro VHDL (veja-se Figura 3. 2). Posteriormente guarda-se o circuito obtido num ficheiro com descrição Verilog. O circuito X_TRAN foi sintetizado usando todas as combinações possíveis mencionadas no capítulo 3.2. Geram-se assim 12 circuitos possíveis. Após a obtenção dos 12 circuitos, foi criada uma test-bench4 em Verilog a fim de se verificar se todos os circuitos tinham o mesmo valor de saída, quando expostos aos mesmos sinais de entrada. Analisando o hardware e o código obtido em cada processo de síntese, notou-se que muitos dos circuitos eram estruturalmente idênticos. Neste caso, concluiu-se que apenas existiam duas estrutruras do circuito. Criou-se um ficheiro com 10 vectores aleatórios para executar o teste. Utilizando um compilador de Verilog, o ficheiro test_bench foi executado para cada um dos circuitos, tendo-se obtido valores idênticos em todos os circuitos, que era o resultado esperado, confirmando-se assim que cada circuito tinha sido bem gerado e alterado. Para se poder estimar qual a frequência máxima a que o circuito pode trabalhar correctamente, é necessário associar a ferramenta PLI à test-bench. Para experimentar este procedimento foi seleccionado o circuito com uma arquitectura mais simples. A metodologia usada para a resolução do problema é relativamente fácil. Executa-se o test-bench uma primeira vez, exactamente da mesma forma que foi feito anteriormente para simular o circuito, com a diferença das saídas obtidas serem guardadas numa estrutura de dados que irá servir de referência. De seguida o test-bench reinicia-se5, subtraindo ao período de relógio um valor predefinido (este valor aumenta a cada vez que se reinicia). O resultado obtido em cada passo da simulação é comparado com o resultado de referência. Quando, num dado passo de simulação, se detecta que o resultado difere do de referência, conclui-se que o circuito já excedeu a sua frequência máxima, fMAX. Esta é então avaliada como a frequência de relógio utilizada no ciclo anterior. 4 Test-bench é um ficheiro em código Verilog que permite testar circuitos, injectando vectores na entrada dos mesmos e lendo as saídas. 5 Reiniciar implica repetir o processo mas com uma frequência mais elevada. 13 Figura 3. 2 - Circuito XTRAN A gravura seguinte apresenta uma impressão do que foi obtido no ecrã do computador. Na Figura 3. 3 vê-se um erro, para a última frequência de relógio em que a simulação foi efectuada (parte de baixo da figura), porque a resposta ao quarto vector de entrada não é idêntica às anteriores. Assim, a frequência anterior é a máxima frequência do sinal de relógio (esta corresponde ao período mínimo de 6,1 ns). Os 10 vectores aleatórios utilizados não garantem que se teste o hardware de forma completa. De facto, com tão poucos vectores de teste, a probabilidade de se activarem todos os caminhos críticos de sinal (os que conduzem a um maior tempo de propagação dos sinais da entrada para a saída do bloco combinatório) é reduzida. Assim, prevê-se que com um número maior de vectores se obtenha períodos de relógio maiores. 14 Figura 3. 3 – Período de relógio mínimo nujma das estruturas do XTRAN (6,1 ns) 3.3.2. B01 O segundo circuito a ser testado foi o circuito de referência B01 [7], um circuito sequencial. Na Figura 3. 4 pode-se observar a arquitectura deste circuito (ainda num nível RTL). A estratégia de optimização é diferente da utilizada no circuito anterior (XTRAN). Foram realizadas duas optimizações, uma para cada circuito: • • Optimização de frequência de relógio Optimização de área de implantação O nível de optimização utilizado para ambos os circuitos foi o de máxima optimização, isto é, utilizando o máximo nível de esforço. No primeiro especifica-se um período de relógio de 0.00001 ns, e no segundo uma área de dimensão zero. Este procedimento assegura que serão utilizados os valores mínimos. Os circuitos obtidos são apresentados na Figura 3. 5 e Figura 3. 6 para frequência de relógio e área respectivamente. Nestes, distingue-se a área de implantação (layout) menor no segundo caso. Ao contrário, no primeiro caso encontramos portas lógicas 15 simples, embora em maior número, que tornam o circuito mais rápido. Os resultados obtidos são os esperados, um funcionamento rápido, para o caso de optimização de frequência de relógio mas com consequências de aumento de área, e o oposto para o circuito com optimização de área. A simulação com test-bench deu resultados idênticos de saída para ambos os circuitos. Figura 3. 4 – Circuito B01 não optimizado (descrição RTL) 16 Figura 3. 5 – Estrutura do B01 com optimização da frequência de relógio (nível lógico) Figura 3. 6 – Estrutura do B01 com optimização em área (nível lógico) 17 4. Fluxo de Projecto com BIST e Análise das Soluções 4.1. Caso de Estudo: Controlador RD_ROC Após a familiarização com as ferramentas de trabalho, passou-se à sua aplicação no circuito RD_ROC (RD_ReadOutControl), que foi disponibilizado para o desenvolvimento deste projecto [9]. O RD_ROC é uma interface de comunicação aplicável a uma FPGA (Field Programmable Gate Array) que faz a comunicação da FPGA para um PC (não faz o retorno). Este módulo faz parte do sistema DAE (em particular do módulo designado por trigger DCC), logo está inserido na FPGA deste sistema. O RD_ROC é constituído por quatro ficheiros em formato VHDL, sendo eles: • • • • PEM_param.vhd rd_roc.vhd rd_counter_EvN.vhd rd_counter_EvT.vhd O primeiro ficheiro, PEM_param.vhd, descreve o hardware que serve para armazenar os parâmetros e as constantes necessários, para parametrização da funcionalidade. O RD_ROC é o ficheiro de topo e contém a parte maioritária do circuito (Figura 4. 1). Neste ficheiro é descrita a máquina de estados do circuito (Figura 4. 2). O circuito tem 8 entradas mais a entrada de relógio. Dessas 8 entradas, duas são de dados (uma com 244 bits, dout_fout, e a outra com 25 bits, int_errcount). As restantes 6 entradas são de controlo, duas controlam os contadores (uma faz ENABLE, int_req_onoff, e a outra dá ordem de contar ou parar, onoff), três controlam a máquina de estados (empty_fout, full_bbus, int_readyerr) e a última é o RESET. Figura 4. 1 – Diagrama de topo do RD_ROC 18 Figura 4. 2 – Máquina de Estados do circuito de RD_ROC O circuito contem cinco saídas. A saída dout_bbus possui 64 bits e por elas passam os dados a enviar para o PC. A saída rd_fout contêm um sinal de controlo que indicará que a FIFO, onde estão colocados os dados a transferir da FPGA para o PC, está a ser lida pelo circuito RD_ROC. A saída wr_bbus é um sinal de controlo que indica o envio de dados para escrita no PC pela saída dout_bbus. Por fim, a saída int_doneerr é um sinal de controlo que indica que os erros já foram enviados para o PC. A saída dcc_busy indica ao computador que a FPGA está ocupada. No que concerne à máquina de estados, observa-se que esta contém dez estados. O estado inicial é o estado IDLE. Existem dois trajectos possíveis, um com o SLAT_SEND_DATA que é o trajecto caracterizado pelo envio de dados; o outro é o trajecto de envio de erros (ERR). A passagem do estado SEND_DATA_5 para o estado SEND_DATA_2 dá-se quando existem mais do que um pacote de dados a ser enviado. Como se referiu, o ficheiro rd_roc.vhd é o ficheiro de topo que contém a máquina de estados. Quanto aos ficheiros restantes, rd_counter_EvT.vhd e rd_counter_EvN.vhd, são contadores de 32 bits, sendo o segundo controlado por mais uma variável (incr) que se comporta como um ENABLE. Note-se ainda que, com a aplicação do sinal START, os contadores são reiniciados a zero. Os contadores estão representados na Figura 4. 3 e Figura 4. 4 respectivamente e são parte integrante da hierarquia do ficheiro RD_ROC. 19 Figura 4. 3 – Contador rd_counter_EvT.vhd Figura 4. 4 - Contador rd_counter_EvN.vhd 4.1.1. Síntese e Optimização Usando a ferramenta design_vision agregaram-se os 4 ficheiros do circuito, entidades VHDL, para posterior síntese. Fizeram-se dois tipos de síntese, uma em desempenho e outra em área. Este procedimento é idêntico ao usado no capítulo 3.3.2. e Figura 3. 1. Os primeiros resultados obtidos não eram satisfatórios o que levou a que com a utilização destes procedimentos fossem encontradas possibilidades de melhoramento do circuito original, que acabaram por ser realizadas. O circuito obtido é armazenado em linguagem Verilog (num só ficheiro) para que posteriormente se possa trabalhar com as ferramentas da Cadence6. Na Figura 4. 5 são apresentados os relatórios obtidos na síntese do circuito f max A frequência máxima corresponde ao inverso dos valores a negrito, isto é: 1 = para cada um dos casos. data _ arrival _ time(ns ) 6 Sendo o Verilog a linguagem mais usada nos EUA, a Cadence, empresa norte americana, desenvolve o seu software para esta linguagem, enquanto que na Europa utiliza-se mais o VHDL. 20 Desempenho Área **************************************** Report : area Design : rd_roc Version: 2001.08 Date : Tue Aug 9 00:55:19 2005 **************************************** **************************************** Report : area Design : rd_roc Version: 2001.08 Date : Tue Aug 9 01:24:40 2005 **************************************** Number Number Number Number Number Number Number Number of of of of ports: nets: cells: references: 344 1411 1067 44 of of of of ports: nets: cells: references: 344 1117 769 52 Combinational area: Noncombinational area: Net Interconnect area: 1110192.500000 1283756.375000 4466.093262 Combinational area: Noncombinational area: Net Interconnect area: 470639.562500 1181926.500000 3519.672363 Total cell area: Total area: 2393949.000000 2398415.000000 Total cell area: Total area: 1652566.000000 1656085.625000 **************************************** Report : timing Design : rd_roc Version: 2001.08 Date : Tue Aug 9 00:55:19 2005 **************************************** ---------------------------------------data required time -0.45 data arrival time -5.17 ---------------------------------------slack (VIOLATED) -5.62 **************************************** Report : timing Design : rd_roc Version: 2001.08 Date : Tue Aug 9 01:24:41 2005 **************************************** ---------------------------------------data required time 49.53 data arrival time -34.14 ---------------------------------------slack (MET) 15.39 Figura 4. 5 – Relatórios de síntese do circuito de RD_ROC para optimização em a) desempenho e b) área 4.1.2. Criação da Test-bench e Teste do Circuito Foi criado um ficheiro test-bench para se poder testar o circuito. No ficheiro de vectores de estímulo, cada linha (que representa um vector) tem o número exacto de bits de entrada, 275 neste caso. Caso não sejam tomados cuidados pode-se ter problemas na sincronização entre o clock do circuito e o clock de amostragem, os tempos de set e hold têm de ser respeitados. Os sinais de relógio são idênticos (trabalham à mesma frequência, mas com atraso entre eles). Contudo, um é injectado directamente no circuito, o outro é utilizado para ler o vector de entrada no flanco ascendente e disponibilizar as saídas, para o display, no flanco descendente (ver os dois primeiros sinais na Figura 4. 6). No caso do relógio de amostragem só ser activado nos flancos ascendentes ter-se-ia de usar uma frequência com o dobro da velocidade (isto é exemplificado na Figura 4. 6). 21 Figura 4. 6– Ilustração da sincronização entre os clocks Os dez vectores de teste (padrão de teste T1) deste teste inicial foram gerados aleatoriamente; apenas se teve o cuidado de aplicar um RESET e forçar a entrada num estado específico (ERR) para carregar as saídas. Posteriormente, desenvolveram-se vectores de estímulos mais apropriados. Com o padrão de teste T1 apenas se testam 3 estados, de entre os 10 da máquina. O código de test-bench encontra-se em anexo. De seguida adicionou-se, ao testbench, um ficheiro PLI que permite estimar a frequência máxima de funcionamento de cada uma das estruturas. O PLI é uma interface em linguagem C que recebe da test-bench o valor das saídas para cada uma das frequências. Inicialmente é injectado um conjunto de vectores no circuito, e os primeiros resultados (para a frequência inicial, a mais baixa) são guardados em memória. Posteriormente aumenta-se a frequência em passos discretos, de tamanho predefinido pelo projectista, injectam-se os mesmos vectores e, para cada nova simulação, comparam-se os resultados com os resultados da frequência inicial. Este procedimento repete-se para as frequências seguintes. Quando um destes resultados for diferente do caso inicial sabe-se que o circuito já não está a funcionar a 100%. Assim, assume-se que a frequência anterior é a frequência máxima de funcionamento. Em rigor, é uma estimativa do valor da frequência máxima para o conjunto de vectores injectado. O erro da estimativa depende do passo de variação da frequência. Posteriormente testaram-se os circuitos e os resultados obtidos não foram favoráveis no que diz respeito ao circuito optimizado em desempenho, porque o seu período mínimo era superior ao do circuito optimizado em área (Tabela 4. 1). Tabela 4. 1:resultados simulação PLI Optimizado_desempenho 23.9 ns Optimizado_área 9.3 ns 22 4.1.3. Geração de Vectores de Teste A fim de se poder gerar um padrão de teste funcional mais completo, analisou-se em detalhe a máquina de estados. Isto permitiu a construção de uma tabela (Tabela 4. 2) onde se ilustram as condições necessárias às passagens em todos os estados. Tabela 4. 2:Estados activados por vectores reset int_redyerr Full_bbus empty_fout STATE 1 X X X IDLE 0 1 0 ERR 0 X X X SLATE_ERR 0 X X X IDLE 0 0 0 0 SLATE_SEND_DATA 0 X X X SLATE_SEND_DATA_1 0 X X X SEND_DATA_1 0 X X X SEND_DATA_2 0 X X X SEND_DATA_3 0 X X X SEND_DATA_4 0 X X X SEND_DATA_5 Com base na tabela de estados criou-se um ficheiro de estímulos com 22 vectores (padrão de teste T2) que servem para percorrer a máquina de estados duas vezes. Embora se considerasse toda a máquina de estados, os resultados obtidos em frequência mostraram poucas melhorias e as saídas pareciam não estar correctas. A fim de se descobrir o erro, fizeram-se várias alterações a nível de test-bench, e usaram-se vários vectores de estímulo. Posteriormente, com a utilização da ferramenta ModelSim, entendeu-se o motivo do problema encontrado. Através dos resultados obtidos, exibidos na Figura 4. 7, pode verificar-se que a máquina de estados funciona correctamente e que os tempos da test-bench estão correctos. O problema é que não se teve em consideração que as variáveis de saída de cada estado são auxiliares, ou seja, só no estado seguinte é que as saídas são actualizadas com os valores que estão nas variáveis auxiliares. 23 Figura 4. 7 – Explicação de funcionamento dos três primeiros estados do circuito (ModelSim™) Analisando a Figura 4. 7 reconstruiu-se uma máquina de estados com maior detalhe, (Figura 4. 8) a fim de melhor entender o funcionamento do circuito. 24 Figura 4. 8 – Máquina de Estados criada a partir do ficheiro RD_ROC original 25 Na Figura 4. 8 verifica-se que a máquina de estados é uma mistura de máquina de Mealy e de Moore. A máquina é dominantemente de Moore. Todavia, no estado de IDLE, comporta-se como uma máquina de Mealy (as saídas dependem também das entradas). O novo ficheiro de estímulos (T2) foi testado. Na Tabela 4. 3 resumem-se os valores obtidos de períodos mínimos de relógio. (os valores à esquerda foram obtidos com versão 3.5 da AMS, à direita versão 3.6) Tabela 4. 3:Resumo dos resultados de simulação com PLI activando todos os estados Optimizado_desempenho 20.0 ns / 19.9 ns Optimizado_área 20.0 ns / 19.9 ns Realizaram-se de saída testes mais longos, com 1 000 vectores aleatórios (padrão de teste T3) e 10 000 vectores aleatórios (padrão de teste T4). Os valores obtidos em desempenho e área para a versão escolhida estão registados na Tabela 4. 4. Tabela 4. 4: Resultados de simulação com PLI para diferente número de vectores de entrada Optimizado_ desempenho Optimizado_área 1 000 vectores 24.0 ns 22.0 ns 10 000 vectores 24.0 ns 22.0 ns Por verificação da tabela e observando que a versão optimizada em desempenho piorou em termos de período, seleccionou-se assim a versão optimizada em área porque embora os tempos de relógio sejam idênticos para ambas, a área é menor7. 4.2. Implementação FPGA. BIST Funcional Na Figura 4. 9, representam-se os módulos do DAE divididos pelas diferentes FPGA's. FPGA DAQ (x8) FPGA DBUS Trigger TGR/ DCC UNIDADE FE DAQ FILTRO DE MEMORIA GBUS DCC (ROC) PC Figura 4. 9 – Agrupamento de módulos do DAE nas FPGA's. 7 Note-se que nos resultados presentes nos relatórios obtidos no capítulo Criação da Test-bench e Teste do Circuito, os valores baseiam-se em bibliotecas da ferramenta da Synopsyis. Os resultados obtidos neste capítulo baseiam-se em bibliotecas da Cadence, cujos modelos são diferentes, dai a discrepância de resultados. Como a ferramenta de simulação é da Cadence, são os valores obtidos pela mesma considerados para efeitos de decisão. 26 Como se pode observar na Figura 4. 9, a FPGA TGR/DCC contém os módulos Trigger e Concentrador de Dados (DCC). Os módulos Aquisição de Dados, Filtro e Unidade de Memória estão na segunda FPGA, denominada FPGA DAQ. Dado o volume de dados de entrada no DAE, foi necessário recorrer a 8 FPGA’s DAQ. Toda a comunicação entre o sistema DAE e o computador é realizada através do módulo denominado Controlador de Saída da Electrónica de Aquisição de Dados (DCC ROC ou RD_ROC). O teste deste sistema está longe de constituir uma tarefa trivial. Numa primeira aproximação, poder-se-ia pensar em utilizar cadeias de varrimento. Contudo, as configurações das FPGA’s em modo de teste e de funcionalidade normal, neste caso, são diferentes acarretando comportamentos diferentes, particularmente no que se refere ao cumprimento dos requisitos de desempenho. Por outro lado, o teste que faz sentido realizar não é um teste estrutural, na medida em que os fornecedores da tecnologia, asseguram a ausência (quase total) de defeitos nos componentes. Assim, o que é necessário, na realidade, é realizar um teste funcional e de desempenho do sistema. A necessidade de testar o comportamento, não só do sistema como um todo, mas, para efeitos de diagnóstico, testar o comportamento dos vários módulos que o constituem, motivou o desenvolvimento de um teste funcional integrado [9]. Trata-se de um auto-teste, na medida em que os próprios vectores de teste estão incorporados nas FPGA’s e o teste pode ser despoletado do exterior ou internamente (por exemplo, na ligação do sistema). Uma vez que, na configuração da FPGA, nem todos os recursos são atribuídos, é possível implementar a funcionalidade de BIST funcional sem sobrecarga em área – isto é, no mesmo componente. Verificou-se que a degradação de desempenho, devido à atribuição de mais recursos na FPGA, é limitada. O auto-teste funcional (Functional BIST) é realizado cada vez que o sistema é ligado, cada vez que se faz o reset do sistema, ou a pedido do utilizador. Pode ser realizado num ambiente de produção para validação do protótipo ou durante a vida útil do sistema. Adicionalmente, o teste incorporado permite verificar o funcionamento correcto do sistema, relativo à sua funcionalidade e desempenho, em todos os seus modos de funcionamento, bem como, verificar o funcionamento correcto dos barramentos que garantem a comunicação entre as diversas FPGA’s que constituem o sistema. Como se pode observar na Figura 4. 10, a profundidade do teste é escolhida pelo projectista. De facto, para cada cenário de operação podem identificar-se processos, módulos, funções, etc. A cada um destes elementos corresponde uma assinatura, que representa o resultado correcto da execução funcional desse elemento para um dado padrão de teste. Esta assinatura é comparada com o resultado do teste, para os diferentes elementos, duma forma hierárquica e é gerado um bit de verdade. Se as assinaturas correspondentes coincidirem, o bit de verdade é colocado a um dado valor (0 ou 1 consoante o projectista achar conveniente). 27 Para cada cenário Identificação do cenário Para cada processo do cenário Identificação do processo Entrada de Dados/Controlo do processo Para cada módulo no processo Identicação do módulo Entrada de Dados/Controlo do módulo Para cada função do módulo Identificação da função Entrada de Dados/Controlo da função ………. ………. Saída dos Dados/Controlo da função Geração da assinatura da função Geração dos bit de verdade da função Fim da Função Saída dos Dados/Controlo do módulo Geração da assinatura do módulo Geração dos bit de verdade do módulo Fim do Módulo Saída dos Dados/Controlo do processo Geração da assinatura do processo Geração dos bit de verdade do processo Fim do Módulo Geração da assinatura do processo Geração dos bit de verdade do processo Fim do cenário Figura 4. 10 – Descrição esquemática da estratégia de teste. Se o que se pretende obter com o teste é um resultado correcto/incorrecto (go/no go) então o resultado final será o bit de verdade. Se se pretende obter um resultado para diagnóstico, então pode construir-se uma palavra com os bits de verdade. O valor de cada bit indica a correcção ou incorrecção do funcionamento do elemento em teste que lhe corresponde. Para se obter um teste eficiente e confiável é necessário dispor de um conjunto de vectores de teste adequados para o efeito. No caso presente, foram desenvolvidos mecanismos de geração de vectores de teste funcionais a ser aplicados segundo a estratégia de teste préestabelecida. Para testar as FPGA’s foram implementados em cada FPGA, controladores locais de teste, nomeadamente, o controlador local de teste da DAQ, referido como DAQ Test na FPGA DAQ e o controlador local de teste da TGR/DCC referido como TGR/DCC Test na FPGA TGR/DCC. Cada um destes controladores locais de teste realiza as seguintes funções: • Gera localmente os vectores de teste necessários para o teste de cada módulo da FPGA, • Indica, através de um sinal de controlo, a um multiplexer de teste que direccione para a entrada do módulo em teste os vectores de teste, em vez dos dados relativos ao funcionamento normal do sistema. • Recebe os resultados do módulo em teste e compara com assinaturas pré-definidas. Na Figura 4. 11 apresenta-se a arquitectura genérica do controlador local de teste. 28 Controlador Local de Teste Gerador de Vectores de Teste Controlo BIST funcional Comparador Módulo em Teste (RD_ROC) Mux Dados de Entrada Assinatura Dados de Saída Figura 4. 11 – Arquitectura genérica do controlador local de BIST funcional. Como se pode observar na Figura 4. 11 o controlador local de teste é constituído por: (1) um módulo de controlo, (2) um bloco gerador de vectores de teste e (3) um comparador de assinaturas. O bloco de controlo é uma máquina de estados que comanda os restantes blocos do controlador local de teste bem como o multiplexer de teste. Os vectores de teste podem ser gerados de uma forma pseudo-aleatória, recorrendo à utilização de circuitos (exemplo de LFSR – Linear Feedback Shift Register), ou podem ser vectores de teste determinísticos que permitam cobrir o maior número possível de faltas, No último caso, os vectores e as assinaturas correspondentes são previamente armazenados em memória. Em qualquer dos casos, os vectores devem permitir uma elevada cobertura de erros funcionais em todos os modos de funcionamento. O comparador de assinaturas compara o resultado do teste com a assinatura previamente carregada em memória. O resultado de uma comparação estabelece o valor do bit de verdade. Para permitir o diagnóstico, armazenam-se em registos os resultados de cada comparação. Estes registos são ligados em série, de modo a que seja possível fazer um deslocamento de todos os bits de verdade para um local observável. Se todos os bits de verdade estiverem activos, podese afirmar que o circuito passou no teste. O controlador local de teste armazena todos os bits de verdade referente ao teste da sua FPGA. Placa TGR/DCC FPGA TGR/DCC DCC TGR/DCC ROC DCC ROC QL 5064 TGR Falta a legenda 29 PC 4.3. Implementação ASIC. Fluxo de projecto com BIST Estrutural. Para a realização deste projecto com BIST estrutural idealizou-se uma arquitectura simples, como se pode visualizar na Figura 4. 12. Os blocos são apresentados em maior pormenor nos capítulos seguintes. Figura 4. 12 - Arquitectura BIST utilizada 30 Na Figura 4. 13 apresenta-se o fluxo de projecto para introdução de BIST estrutural num CUT sequencial que se propõe neste trabalho. Note-se que este diagrama é uma continuação do diagrama apresentado na Figura 3. 1. Como se observa, o procedimento para a geração dos diferentes blocos do hardware de BIST é idêntico ao realizado para o CUT. Neste caso usa-se a ferramenta Verifaul™t da Cadence para verificar a cobertura de faltas e validar o circuito com BIST. No passo de simulação lógica do CUT já com a funcionalidade de autoteste, pode reutilizar-se a metodologia de estimação da máxima frequência de relógio, e desse modo avaliar a degradação de desempenho que a funcionalidade de BIST introduz no circuito, quando opera em modo normal de funcionamento. Figura 4. 13 – Fluxo de projecto BIST estrutural 4.3.1. Gerador de Vectores de Teste Pseudo-aleatório (PRPG) O test pattern generator usado pode ser dividido em dois blocos. A Figura 4. 14 representa a arquitectura utilizada. O primeiro bloco é um LFSR (Linear Feedback ShiftRregister) de tipo 2, tamanho N igual a 20. A arquitectura de uma LFSR resume-se a um anel de Flip Flop’s com realimentações em alguns dos FF. Essas realimentações são feitas com portas lógicas XOR e não são escolhidas ao acaso, têm de respeitar o vector determinístico8. Neste caso (N=20) foi usada a expressão x 20 + x 3 + 1 = 0 (polinómio primitivo). Um anel de 20 FF tem uma dimensão significativa. A título de exemplo, apresenta-se na Figura 4. 15 um LFSR com N=4 cujo vector determinístico é x4 + x3 + 1 = 0 . 8 Garante que são gerados 2N-1 vectores distintos, que se repetem ciclicamente em blocos de N-1 31 Figura 4. 14 - Gerador de vectores pseudo-aleatórios Figura 4. 15 - Exemplo de LFSR com N=4 Como o número de entradas do circuito (275) é superior ao tamanho do LFSR, criou-se à saída do mesmo uma cadeia com 254 flip flop's (o reset é controlado pelo controlador BIST) de forma a garantir que é feita a entrada de 275 bits em paralelo nas entradas principais. O último Flip Flop também alimenta a entrada da cadeia de scan. 4.3.2. Multiplexer O Multiplexer de 275 entradas (Figura 4. 16) tem uma função simples, deixar passar os valores do utilizador, provenientes do exterior, no modo normal, ou deixar passar os valores pseudo-aleatórios, provenientes do LFSR, no modo de teste. 32 Figura 4. 16 - MUX 4.3.3. Circuito Sob Teste (CUT) Circuit Under Test, é o circuito que vai ser testado. No presente trabalho esse circuito é o RD_ROC mas com uma cadeia de scan e é apresentado no capítulo 4.3.7 (Circuito RD_ROC). 4.3.4. Compactador O compactador (Figura 4. 17) tem um hardware similar ao do LFSR. Contudo, a sua função é totalmente diferente. A ideia base do compactador é comportar-se como um somador porque vai “agrupando” a nova resposta com as respostas já obtidas. Desta forma, cria-se uma chave única. Como a cada teste se garante que os estímulos de entrada são sempre os mesmos, as respostas a estes também serão sempre as mesmas assim como a chave criada. Esta chave apenas muda se uma ou mais das respostas for diferente do esperado, ou seja, uma ou mais faltas. Figura 4. 17 - Compactador 33 4.3.5. Comparador O comparador é um bloco simples onde se compara a “palavra” obtida no comparador com a “palavra” esperada. Esta comparação é feita bit a bit, passando os bits do mesmo “peso” pela mesma porta lógica XOR. O NOR de todos os blocos anteriores, assegura que no caso de existir pelo menos um bit diferente do esperado, o valor lógico na saída é 0. Na Figura 4. 18 é apresentado um comparador. Figura 4. 18 - Comparador 4.3.6. Registo de Assinatura A palavra (assinatura) é o valor que se espera ter no final do teste no compactador. Para se conseguir testar se o resultado obtido é o resultado esperado, tem de se ter esse resultado guardado num registo. Este bloco realiza essa mesma função, guardar a palavra que vai ser comparada com o resultado obtido no comparador. Na Figura 4. 19 pode-se ver o modelo de um registo de assinatura. Figura 4. 19 - Registo de assinatura 4.3.7. Desenvolvimento e Implementação do BIST Neste capítulo apresenta-se o circuito BIST realizado, ou seja, a evolução do circuito idealizado nos capítulos anteriores até ao circuito realizado. Os blocos foram todos descritos em VHDL, com recurso ao Webpack da Xilinx (o código VHDL de cada um dos blocos é apresentado em anexo, na secção: código VHDL dos diferentes blocos). A simulação lógica do 34 circuito foi feita com Modelsim de forma a verificar o funcionamento correcto do BIST, antes de se proceder à síntese. O processo de síntese é idêntico ao realizado para o ficheiro RD_ROC no capítulo 4.1.1. Em seguida são apresentados os blocos obtidos. A Figura 4. 20 representa a diagrama de topo do BIST. Tem 4 entradas e 3 saídas Figura 4. 20 - top level, package Na Tabela 4. 5 é apresentada uma descrição das entradas e saídas do bloco. Tabela 4. 5:portos de Top_level Sinal test_bist Reset data_in Clk Data_out Bist_result Bist_done Tipo Bits entrada 1 entrada 1 entrada 275 entrada 1 saída 68 saída 1 saída 1 Descrição Quando activo a 1 inicia o modo de test BIST off-line “reset” aos registos Entrada de dados equivalente a entrada de dados de RD_ROC Frequência de relógio Saída de dados equivalente a saída de dados de RD_ROC Quando activo a 1 indica que o teste passou, apenas faz quando bist_done estiver activo Quando activo a 1 indica que o teste acabou No modo de funcionamento normal (test_bist desligado) o circuito tem comportamento idêntico a RD_ROC, sendo as entradas clk, data_in e a saída data_out. Data_in tem 275 pinos e estes correspondem a: • Pino 0 – reset • Pino 1 – onoff • Pino 2 – int_req_onoff • Pino 3 – empty_fout • Pino 4 – int_readyerr • Pino 5 – full_bbus • Pino 6 a 249 – dout_fout • Pino 250 a 274 – int_errcount 35 Data_out tem 68 pinos e estes correspondem a: • Pino 0 – wr_bbus • Pino 1 – rd_fout • Pino 2 – int_doneerr • Pino 3 a 66 – dout_bbus • Pino 67 – dcc_busy A Figura 4. 21, que apresenta os blocos internos do BIST, foi obtida após síntese no Design_Vision (Synopsys). Figura 4. 21 – Circuito RD_ROC com BIST estrutural Todos estes blocos são apresentados em seguida. Bloco TPG O test pattern generator criado baseia-se num LFSR de 20 bits do tipo do apresentado no capítulo 4.3.1. Este é seguido de uma cadeia de 254 registos (Flip-Flop's) que somados aos 20 da LFSR criam 274 saídas. Estas saídas correspondem as entradas do CUT, excepto CLK e RESET, a primeira é externa e o reset (em modo de teste) é controlado pelo controlador BIST. A cadeia de scan do CUT (capítulo 4.3.7 (Circuito RD_ROC)) tem 373 registos e a entrada da mesma é feita em modo série. Assim, são necessários 373 impulsos de clock até que se preencha a cadeia. Nessa altura os 274 bits de entrada paralela vão ser utilizados. Na Figura 4. 22 é apresentado o bloco TPG e na Tabela 4. 6 têm um resumo dos Portos do circuito. O vector inicial da LFSR (designado por semente) pode influenciar a cobertura de faltas, porque quando se executa o teste raramente se usam todos os vectores e alguns detectam mais faltas que outros. 36 Esta LFSR é do tipo “galois”, mais conhecido por LFSR modular. É um pouco mais complicado de implementar, comparativamente a LFSR “fibonacci ”, mais conhecido por LFSR linear, porque os xor ficam entre os flip-flops e tem que se adicionar mux’s para poder converter o LFSR em registo de deslocamento. No entanto, geram vectores pseudo-aleatórios menos corelacionados entre si, ou seja, um pouco mais aleatórios, conduzindo normalmente a melhores resultados para a cobertura de faltas [14]. Figura 4. 22 – LFSR, package Tabela 4. 6:Portos de LFSR Sinal Tipo bits Descrição Clock entrada 1 Frequência de relógio Reset entrada 1 “reset” aos registos Enable entrada 1 Controla o arranque do módulo data_out saída 274 dados de saída Bloco MUX 275 Este bloco (Figura 4. 23) descreve um multiplexer com duas entradas de 275 bits e uma saída de 275 bits comutadas por uma linha de controlo. As saídas representam as entradas de dados do CUT, como se pode verificar na Tabela 4. 7. Figura 4. 23 – mux, package 37 Tabela 4. 7:Portos de Mux Sinal Tipo Bits A entrada 275 B entrada 275 Control entrada 1 C saída 275 Descrição Dados do exterior Dados da LFSR(274 bits) e reset(1 bit) Comuta entre as duas entradas Dados para as entradas primarias e cadeia de scan Circuito RD_ROC O circuito RD_ROC apresentado no capítulo 4.1 foi alterado de forma a ser mais fácil testar. Essa alteração consistiu na introdução de uma cadeia de scan. A cadeia de scan do circuito RD_ROC é idêntica à explicada no capítulo 2.2. A única diferença é o número de registos de memória, que neste caso é de 373. Para introduzir a cadeia de scan utilizou-se mais uma vez o software da Synopsys, o design_vision. Esta cadeia é inserida automaticamente. O circuito obtido é apresentado na Figura 4. 24. Figura 4. 24 – RD_ROC com scan, package 38 Comparando a Figura 4. 24 com a Figura 4. 1 nota-se que foram introduzidas duas entradas, tal como era esperado, mas não foi inserida uma nova saída. Isso deve-se ao facto do software não permitir a introdução da mesma, delegando assim esse efeito para uma das saídas normais do circuito, visto as mesmas não terem à partida interesse quando a cadeia de scan está activa. A saída wr_bbus foi a escolhida pelo programa para a realização dessa função. Na Figura 4. 25 é apresentado o relatório de área, que permite verificar o aumento percentual de área ocasionado pela funcionalidade de BIST. Comparando-se com a Figura 4. 5 conclui-se que é de cerca 6.7%. **************************************** Report : area Design : rd_roc Version: V-2004.06-SP1 Date : Wed May 24 00:10:18 2006 **************************************** Number Number Number Number of of of of ports: nets: cells: references: 346 1856 1229 55 Combinational area: Noncombinational area: Net Interconnect area: 730559.875000 1031803.812500 4638.004883 Total cell area: Total area: 1762368.000000 1767001.750000 ***** End Of Report ***** Figura 4. 25 – Relatorio de area de Rd_roc com cadeia de scan Na Tabela 4. 8 apresenta-se um resumo dos portos do circuito. Tabela 4. 8:Portos de RD_ROC com scan Sinal Tipo Bits Descrição Clk Reset onoff int_req_onoff empty_fout int_readyerr full_bbus Dout_fout(243 downto 6) int_errcount(24 downto 0) Test_se test_si Wr_bbus Rd_fout entrada entrada entrada entrada entrada entrada entrada entrada entrada entrada entrada saída saída 1 1 1 1 1 1 1 244 25 1 1 1 1 Frequência de relógio “reset” aos registos Ver capítulo 4.1 Ver capítulo 4.1 Ver capítulo 4.1 Ver capítulo 4.1 Ver capítulo 4.1 Ver capítulo 4.1 Ver capítulo 4.1 Activa modo scan Entrada de dados scan Saída de dados e scan Saída de dados 39 Int_doneerr Dout_bbus Dcc_busy saída saída saída 1 64 1 Saída de dados Saída de dados Saída de dados Note-se que a entrada test_si pertence ao mesmo nó que a entrada int_errcount(24). Isto deve-se ao facto de ambas pertencerem ao nó que contem a ultima saída do TPG e a primeira ter importância quando a cadeia de scan esta activa e a outra nos restantes casos. Bloco COMPACTADOR (MISR) O compactador MISR possui 68 entradas de dados, as equivalentes ao número de saídas do circuito, como se pode constatar na Tabela 4. 9. . Tabela 4. 9: Portos de Compactador Sinal Tipo bits Descrição data_in entrada 68 Entrada de dados clock entrada 1 Frequência de relógio reset entrada 1 “reset” aos registos data_out saída 68 Saída de dados . Figura 4. 26 – compactador, package Este compactador tem como função “acumular” as saídas paralelas do circuito e a saída da cadeia de scan. O resultado final é quase único, dependendo de todos os valores que entraram no compactador. Relembra-se que a saída de dados da cadeia de scan é a saída wr_bbus. Como são necessários 373 ciclos de relógio para preencher/esvaziar a cadeia de scan e apenas um para aplicar o teste, pode-se dizer que durante os 373 ciclos entra no compactador o vector da cadeia de scan e num ciclo as saídas primárias. Isto não é inteiramente verdade. Neste trabalho optou-se por se ler sempre as saídas primarias (excepto wr_bbus por ser multiplexada) com o intuito de tentar detectar mais faltas, visto que durante o processo de preenchimento da cadeia de scan, o CUT vai dar respostas aos estímulos que estão presentes nos registos de memoria a cada ciclo de relógio. A Figura 4. 26 apresenta o compactador depois de sintetizado 40 Bloco CONTROL O controlador é o bloco coordenador do BIST porque tal como o nome indica, controla todos os blocos e operações. É necessário que este esteja bem feito de modo a garantir que tudo é feito no tempo, caso contrario não se obtém uma boa cobertura de faltas. Na Tabela 4. 10. Tabela 4. 10: Portos de control Sinal Tipo Bits Descrição Clk Reset Test_bist Data Scan_en Reset_tpg Reset_cut Reset_misr Enable_misr Bist_result entrada entrada entrada entrada saída saída saída saída saída saída 1 1 1 68 1 1 1 1 1 1 Bist_done saída 1 Frequência de relógio “reset” aos registos Ordem de inicio de test Resultado do compactador a ser comparado com a chave Activa o modo de preenchimento da cadeia de scan no CUT Reset ao TPG Reset ao CUT Reset ao compactador põe o compactador “on-line” Quando activo a 1 indica que o teste passou, apenas faz quando bist_done estiver activo Quando activo a 1 indica que o teste acabou Repare-se que uma das entradas do controlador é uma entrada de dados de 68 bits. Este valor é o valor de saída do compactador. Normalmente este resultado deveria seguir para o comprador de modo a ser comparado com o registo de assinatura. Como estes blocos foram descritos em VHDL e era muito mais simples fazer a comparação por comandos IF, esta funcionalidade foi embebida no controlador porque é o único bloco em que se deve aceitar este tipo de instruções (a instrução IF tem de estar dentro de um procedimentos e por razões de coerência e organização o único bloco que tem procedimentos é o controlador). Resumindo, os blocos comparador e registo de assinatura estão incluídos no controlador. Na Figura 4. 27 apresenta-se o bloco do controlador. 41 Figura 4. 27 – controlador, package O controlador foi realizado recorrendo a uma máquina de estados, idealizada de forma a ser o mais fiável possível sem que isso levasse a um número de estados exagerado. Assim chegou-se a uma máquina, apresentada na Figura 4. 28, com apenas 7 estados. 42 A máquina de estados só sai do estado de INÍCIO no caso de o teste bist ter sido activado. Se em qualquer altura este for desactivado, volta-se imediatamente ao estado inicial. Estes testes são facilmente perceptíveis no diagrama, visto se encontrarem em cor amarela. O primeiro passo do teste é fazer um reset ao TPG, de forma a assegurar que este inicia sempre da mesma forma e o mesmo para o CUT (RESET_TPG). Em seguida enche-se a cadeia de scan bit a bit, até completar os 373 bits da cadeia (FILL_SCAN). Como o reset do CUT não garante que todos os elementos de memória tenham sido limpos e estes sofrem um shift para dentro do compactador durante o estado anterior, executa-se um reset ao compactador e um clock no CUT(RESET_MISR). No estado seguinte esvazia-se a cadeia de scan para o compactador. A cadeia de scan é preenchida ao mesmo tempo que esvazia. O estado TEST injecta um clock no CUT de forma a obter resposta ao vector que se encontra na cadeia de scan, tal como em RESET_MISR. No caso de ainda não se terem testados os vectores estipulados, recua-se ao estado EMPTY_SCAN de forma a obter um novo resultado. Caso contrário, passa-se ao estado BIST_END onde se activa a saída bist_done e se indica se o teste teve sucesso ou não. Note-se que existe um reset assíncrono prioritario no estado INICIO. A função deste reset é assegurar que o circuito não arranca num estado não definido. Figura 4. 28 – Máquina de estados do controlador 43 4.4. Análise de Resultados 4.4.1. Cobertura de Faltas do Circuito RD_ROC sem BIST Estrutural No seguimento dos testes efectuados no capítulo 4.1.3, concluiu-se qual o circuito escolhido (versão 3 / optimizado_área) para implementar a funcionalidade de BIST estrutural (versão ASIC). Nesta secção apresentam-se resultados de simulação de faltas sobre este circuito, com vectores pseudo-aleatórios e com vectores utilizados na versão FPGA com BIST funcional. Pretende-se analisar a cobertura de faltas, FC. Primeiro utilizam-se 10 000 vectores pseudoaleatórios (padrão de teste T4), número escolhido tendo em conta a obtenção de um resultado de cobertura de faltas aceitável sem que a simulação dure muito tempo. Este teste é feito injectando um vector de 254 bits a cada ciclo de relógio. Assim, a aplicação do padrão de teste T4 tem a duração de dez mil ciclos de relógio. Os resultados são apresentados na Figura 4. 29. L101 "./rd_roc_tb.v": $finish at simulation time 20000000000 statistics Untestable Drop_detected Detected Potential Undetected Drop_potential All end_statistics Total # 720 8056 0 0 3572 1324 12952 Total % 62.2 0.0 0.0 27.6 10.2 Prime # 720 3438 0 0 2138 1145 6721 Prime % 51.2 0.0 0.0 31.8 17.0 Figura 4. 29 - Cobertura de faltas de RD_ROC com 10 mil vectores pseudo-aleatórios (T4) O valor drop detected indica-nos a percentagem de cobertura de faltas, neste caso 62.2%. Os 10.000 vectores usados são aleatoriamente gerados pela aplicação rand9. Como é de esperar, a cobertura de faltas de um circuito sequencial sem cadeia de scan é limitada, devido à falta de acessibilidade dos nós correspondentes aos elementos de memória (variáveis de estado). Como se referiu, a solução gerada pelo Eng. Pedro Bento [9], de RD_ROC com BIST funcional, não procura detectar faltas estruturais de hardware, porque o fabricante das FPGA’s é que tem essa responsabilidade. Assim a sua solução baseia-se em identificar falhas de funcionalidade. O auto-teste funcional utiliza 60 vectores determinísticos (padrão de teste T5), optimizados para cobrir a funcionalidade descrita nos cenários de operação. Procurou-se avaliar 9 Ferramenta desenvolvida pelo Professor Marcelino Santos. 44 se este padrão de auto-teste funcional (padrão de teste T5) é eficaz na detecção de faltas estruturais. Os resultados estão descritos na Figura 4. 30 L99 "./rd_roc_tb.v": $finish at simulation time 120000000 statistics Untestable Drop_detected Detected Potential Undetected Drop_potential All end_statistics Total # Total % Prime # Prime % 720 720 46.8 2479 36.9 6063 0 0.0 0 0.0 0 0.0 0 0.0 5573 43.0 3100 46.1 1316 10.2 1142 17.0 12952 6721 361 warnings 4234 simulation events + 76769 accelerated events CPU time: 0.1 secs to compile + 0.1 secs to link + 1.6 secs in simulation End of VERIFAULT-XL 03.20-p003 Jul 22, 2006 23:10:17 Figura 4. 30 – Cobertura de faltas de RD_ROC com 60 vectores funcionais (T5) usados em FPGA Como se observa, o valor de FC = 46,8% é muito reduzido, insuficiente para activar a estrutura lógica e detectar possíveis faltas estruturais. Esse resultado é de esperar, para um circuito sequencial e com um número tão reduzido de vectores de teste. Todavia, o circuito RD_ROC possui um número elevado de entradas de dados. Assim, o teste funcional original (T5), cobrindo toda a funcionalidade, pode ser repetido para muitos dados diferentes. Assim, gerou-se um novo padrão de teste funcional (T6), baseado no padrão T5, mas em que o total de vectores ascende agora a 10 000. Com os mesmos estímulos de controlo, utilizam-se agora 10.000 vectores distintos de dados (ver Figura 4. 31). Os vectores de controlo são repetidos a cada 60 vectores. Os 10.000 vectores de dados foram gerados com a ferramenta rand. 45 L113 "./rd_roc_tb.v": $finish at simulation time 20000000000 statistics Untestable Drop_detected Detected Potential Undetected Drop_potential All end_statistics Total # 720 8097 0 0 3527 1328 12952 Total % Prime # 720 62.5 3456 0.0 0 0.0 0 27.2 2117 10.3 1148 6721 Prime % 51.4 0.0 0.0 31.5 17.1 361 warnings 2030624 simulation events + 9953513 accelerated events CPU time: 0.3 secs to compile + 0.4 secs to link + 244.0 secs in simulation End of VERIFAULT-XL 2.50-s001 Sep 10, 2006 22:23:46 Figura 4. 31 – Cobertura de faltas de RD_ROC com vectores usados em FPGA, 10.000 vectores (T6) Observa-se que a cobertura de faltas do teste funcional subiu de 46,8% (T5 – 60 vectores) para 62,5% (T6 – 10 000 vectores). Comparando o resultado obtido, com o obtido anteriormente para o teste (T4) com 10 000 vectores pseudo-aleatórios (Figura 4. 29), nota-se que o aumento de cobertura de faltas com um teste funcional é de apenas 0.3%, relativamente ao teste pseudoaleatório. Realizou-se ainda mais um teste funcional, utilizando o mesmo princípio (60 vectores, repetindo-se com diferentes dados, mas com 1 000 000 vectores (padrão de teste T7)). O resultado obtido foi FC = 62,9%, o que evidencia claramente que a assíntota de saturação da curva FC(N), em que N é o número de vectores, se situa em cerca de 63% com o teste do circuito RD_ROC mantendo a configuração sequencial. Conclui-se assim que os padrões de teste funcional, utilizados na versão FPGA, não são uma mais valia para efeitos da cobertura de faltas estruturais, relativamente a um padrão de teste pseudo-aleatório com o mesmo número de vectores. 4.4.2. Cobertura de Faltas do Circuito RD_ROC com BIST Estrutural Antes de analisar a cobertura de faltas obtida, vai-se avaliar o aumento de área do circuito. Como se verificou anteriormente, no capítulo 4.3.7, a introdução de uma cadeia de scan levou ao aumento de 6.7% do circuito RD_ROC. Em seguida apresenta-se duas figuras, nas quais se pode 46 analisar o valor de área do circuito com BIST (top_level) e a área de cada um dos blocos do circuito, Figura 4. 32 e Figura 4. 33 respectivamente. **************************************** Report : area Design : top_level Version: V-2004.06-SP1 Date : Wed May 24 00:04:33 2006 **************************************** Library(s) Used: cxx_HRDLIBL (File: /soft/ams/3.7/synopsys/cxx_3.3V/cxx_HRDLIB L.db) cxx_HRDLIB (File: /soft/ams/3.7/synopsys/cxx_3.3V/cxx_HRDLIB .db) cxx_IOLIB (File: /soft/ams/3.7/synopsys/cxx_3.3V/cxx_IOLIB. db) Number of ports: 348 Figura 4. 32 – Área do circuito com BIST Number of nets: 970 Number of cells: 5 Number of references: 5 Combinational area: Noncombinational area: Net Interconnect area: 1527257.750000 2495635.000000 8815.467773 Total cell area: Total area: 4022872.500000 4031708.250000 ***** End Of Report ***** 47 **************************************** Report : reference Design : top_level Version: V-2004.06-SP1 Date : Wed May 24 00:12:24 2006 **************************************** Attributes: b - black box (unknown) bo - allows boundary optimization d - dont_touch mo - map_only h - hierarchical n - noncombinational r - removable s - synthetic operator u - contains unmapped logic Reference Library Unit Area Count Total Area Attributes ----------------------------------------------------------------------------Misr 321965.375000 1 321965.375000 h, n TPG 1106229.625000 1 1106229.625000 h, n control 406849.562500 1 406849.562500 h, n mux275 321892.437500 1 321892.437500 h rd_roc 1865935.500000 1 1865935.500000 h, n ----------------------------------------------------------------------------Total 5 references 4022872.500000 ***** End Of Report ***** Figura 4. 33 – Área dos diferentes blocos do circuito RD_ROC com BIST estrutural Como se observa, o aumento de área de implantação é muito elevado, da ordem dos 140%. Neste caso em que o CUT é de complexidade reduzida, a estrutura de BIST estrutural é maior que a do circuito RD_ROC. Pela analise dos resultados ilustrados na Figura 4. 33 verificase que o problema se deve principalmente à dimensão do bloco TPG. Devido ao elevado número de entradas do CUT, que conduziu a um bloco TPG com 373 Flip-Flop’s, o resultado penaliza severamente a área final do circuito. Antes de se pensar numa redução da área do circuito deve ser analisada a cobertura de faltas, FC. Para efectuar a simulação de faltas foi feita uma nova test_bench que é aplicada ao bloco top_level. Merece relevo o facto de que o tempo de teste, com a introdução e retirada de palavras digitais da cadeia de scan, se torna agora muito mais elevada. Por exemplo, se se utilizar os mesmos N’ = 10 000 vectores pseudo-aleatórios a aplicar ao RD_ROC, são agora precisos (373+1)xN’ = 3 740 000 vectores (ou ciclos de relógio) para realizar a sessão de BIST. No anexo BIST Test Bench pode-se verificar o código da nova test_bench. Esta simulação leva em media 3 dias (em que máquina?) e são necessárias máquinas com um considerável volume de memória disponível para a sua realização (qual o espaço de memória da máquina utilizada?). O resultado obtido para 10 mil vectores pseudo-aleatorios é apresentado na Figura 4. 34. 48 L111 "./bist10_tb.v": $finish at simulation time 8712091000000 statistics Total # Total % Prime # Untestable 46 46 86.8 7158 Drop_detected 15646 Detected 0 0.0 0 Potential 0 0.0 0 Undetected 1115 6.2 679 Drop_potential 1269 7.0 1177 All 18030 9014 end_statistics Prime % 79.4 0.0 0.0 7.5 13.1 492 warnings 218948159 simulation events + 1899556331 accelerated events CPU time: 0.1 secs to compile + 0.2 secs to link + 27528.8 secs in simulation End of VERIFAULT-XL 03.20-p003 Jul 23, 2006 18:02:24 Figura 4. 34 – Cobertura de Faltas com BIST Pode-se verificar pela figura que a cobertura de faltas subiu significativamente, sendo o valor de FC = 86.8%. Este valor está ainda longe dos 95% desejados. Contudo, existem apenas 46 faltas que não são detectadas. De qualquer forma, pode concluir-se que a introdução da cadeia de scan foi um sucesso, comparativamente ao caso anterior em que existiam 720 faltas não detectáveis (Figura 4. 29). A obtenção de um valor mais elevado de FC com esta estrutura é possível, introduzindo alguns (poucos) vectores determinísticos para cobrir as 46 faltas remanescentes. Poder-se-ia repetir a simulação com diferentes vectores iniciais (sementes) no bloco TPG, ou alterar o tamanho do polinómio (capítulo 4.3.1). Devido a problemas nos computadores, licenças e configurações da Synopsys durante a realização do trabalho não foi possível efectuar sínteses a partir desta altura sendo impossível alterar o bloco TPG e obter outros resultados de cobertura de faltas. Estas experiências com a solução de BIST estrutural demonstram que o aumento de acessibilidade das variáveis de estado garante a eficácia do autoteste estrutural. A fim de avaliar a degradação de desempenho do circuito, devido a introdução do hardware de BIST, fez-se uma simulação para avaliar a frequência máxima de funcionamento do circuito. Para este teste foram usados os mesmos parâmetros, usados no teste apresentado na Tabela 4. 4, de forma a comparar as duas soluções e avaliar o nível de degradação. Note-se que o circuito em questão é o optimizado em área. O período de relógio mínimo obtido para a solução com BIST, é de 24 ns, mais 2 ns que a solução sem BIST. À partida este valor parece ser reduzido. Analisando o hardware introduzido, nota-se que os sinais não têm um caminho muito mais longo a percorrer. Quando o circuito BIST funciona em modo normal, os sinais apenas tem de atravessar o multiplexer, e obviamente o módulo RD_ROC. O atraso causado pelo multiplexer 49 é muito reduzido e as alterações no RD_ROC remetem-se a introdução da cadeia de scan, ou seja, uma alteração nos Flip-Flop’s de modo a que estes aceitem entrada de dados pela cadeia. Estas alterações a nível de caminho crítico são mínimas, dai os 2 ns de diferença. Deste modo, pode concluir-se que a degradação de desempenho da solução BIST estrutural é, para este caso de estudo, diminuta. 5. Conclusões Como se referiu, este Trabalho Final de Curso tinha um objectivo duplo. Primeiro, recorrendo-se a sistemas de projecto automático comerciais (Xilinx, Synopsys e Cadence), definir o fluxo de projecto para uma inserção eficiente de BIST estrutural, tendo em consideração as vantagens e limitações de cada solução BIST. Segundo, discutir a possibilidade de desenvolver uma solução unificada de BIST para implementar o auto-teste funcional e estrutural. O trabalho foi realizado utilizando um caso de estudo do mundo real, um controlador (RD_ROC) de leitura de um sistema electrónico de aquisição de dados para imagiologia médica (mamografia, com recurso a tecnologia PET). Nesta aplicação, existia previamente uma solução de BIST funcional numa implementação em FPGA [9]. Neste TFC, desenvolveu-se um fluxo de projecto para inserção de BIST estrutural com varrimento (test-per-scan) (baseada em implementação ASIC) e comparam-se as duas soluções. A comparação tomou em consideração diversas métricas de qualidade do teste, em particular a eficácia do teste, TE (medida pela cobertura de faltas do tipo linha fixa a (LSA), FC), a sobrecarga do teste, TO (aferida pelo aumento percentual de área estimada de silício e pela degradação percentual da máxima frequência de operação) e o comprimento do teste, TL. Demonstrou-se que a utilização dos estímulos de auto-teste funcional num CUT sequencial como o do caso de estudo conduz a valores reduzidos da cobertura de faltas estruturais. Com efeito, a definição do BIST funcional no RD_ROC determinou a utilização de uma primeira sequência de 60 vectores (padrão T5), que cobrem a execução dos 5 cenários de funcionamento do controlador e do sistema DAE. A aplicação desses 60 vectores conduziu a uma cobertura de faltas, FC, de 42,5%. Uma vez que o CUT possui um número elevado de entradas de dados (269), realizou-se um teste funcional com 10 000 vectores (padrão T6), em que a sequência de 60 vectores é aplicada sucessivamente com valores diferentes (pseudo-aleatórios) das entradas de dados. Nesse caso, obteve-se FC = 62,2%. Finalmente, repetiu-se a experiência com 1 000 000 de vectores (padrão T7), obtendo-se FC = 62,9 %. Este valor é ainda insuficiente para permitir afirmar que um teste de BIST funcional conduz à detecção de praticamente todas as faltas LSA a nível estrutural. Assim, confirma-se que o teste de um CUT sequencial, mesmo com escolha criteriosa de vectores de controlo (os 60 vectores), não assegura um teste estrutural de qualidade. Contudo, a circunstância de manter o carácter sequencial do CUT, não o reconfigurando em modo de teste, permite aplicar o teste at-speed (isto é, à frequência nominal de trabalho) e realizar uma sessão de auto-teste rápida com elevado número de vectores de entrada. A utilização de padrões de teste funcional não conduziu a melhoria significativa na cobertura de faltas, relativamente à utilização de padrões pseudo-aleatórios. Contudo, se os estímulos de auto-teste funcional forem utilizados para verificar que a funcionalidade é correcta, então as faltas associadas à estrutura que realiza a funcionalidade-alvo da aplicação são detectadas por este padrão de teste funcional. Assim, para este objectivo, o teste funcional pode ser reutilizado como teste estrutural parcial. Por outras palavras, se o circuito não 50 for de utilização geral, não planeada ou restrita pela projectista do sistema, mas for para ser utilizado de forma recorrente e repetitiva num conjunto limitado de cenários de utilização, com diversos dados, então o teste funcional proposto na versão FPGA é util para validar a parte da estrutura que efectivamente é activada nesses cenários. As faltas não detectadas não afectam o correcto funcionamento do circuito. Desse modo, o BIST funcional revela-se muito útil, não para o teste de produção (validando a qualidade integral de cada componente fabricado), mas para o teste durante a vida útil do componente (validando a funcionalidade correcta e a integridade física da estrutura que suporta a funcionalidade-alvo). Deste modo, se na especificação do teste de produção (por exemplo, um teste numa implementação ASIC), se exigir um teste estrutural de qualidade, é necessário recorrer a técnicas de DfT que aumentem a acessibilidade (controlabilidade e observabilidade) dos nós internos do CUT, nomeadamente os associados aos elementos de memória (registos). É neste contexto que se valorizou a solução de BIST estrutural, numa arquitectura de test-per-scan. O fluxo de projecto desenvolvido, com recurso ao simulador ModelSim™ no ambiente Xilinx, ao sistema Design_Vision™, da Synopsys, e às ferramentas Verilog™ e VeriFault™ da Cadence, permitiu a geração a nível RTL da infra-estrutura de BIST (MUX, Controlador de BIST, TPG (essencialmente, o LFSR) e Analisador de Assinatura (MISR)) e a síntese lógica conjunta com o CUT, ao qual se inseriu a possibilidade de actuação com cadeia de scan, em modo de auto-teste. Com uma sessão de 10 000 vectores pseudo-aleatórios (excepto o sinal de Reset), obteve-se FC = 86,8%, o que é significativamente melhor que a cobertura de faltas obtida com o BIST funcional. É fácil de entender que é possível melhorar a cobertura de faltas do BIST estrutural, já que a geração de vectores de teste (pseudo-aleatória) pode ser melhorada. Com efeito, é conhecido o resultado que um auto-teste apenas com vectores pseudo-aleatórios pode não ser suficiente. Assim, pode tornar-se necessário acrescentar vectores determinísticos, o que é facilitado pela presença da cadeia de scan. Técnicas com as de bit-flipping, ou de bit-fixing podem ser utilizadas, melhorando adicionalmente a qualidade do teste (maior FC), podendo ainda reduzir o comprimento do teste, TL, já que a solução desenvolvida, com uma só cadeia de scan, de n registos, conduz a TL = n . N (neste caso, N = 10000). No caso de estudo, N=373 e TL = 3740000 vectores de teste. Uma análise cuidada da estrutura do CUT com BIST estrutural pode sugerir medidas adicionais. Por exemplo, o CUT possui dois contadores de 32 bit, o que, como se sabe, são muito difíceis de testar; assim, poder-se-ia fraccionar, em modo de teste, este contadores. A complexidade reduzida do circuito ocasionou que a sobrecarga de teste, em termos de área de silício, é muito elevada (cerca de 140%). A implantação do bloco TPG, com elevado número de registos, é muito onerosa em termos de área. Ter-se-á de procurar soluções alternativas, que mantenham o carácter pseudo-aleatório dos vectores de entrada. Adicionalmente, o tempo de aplicação do teste é elevado, devido à presença da cadeia de scan, que requer um elevado número de ciclos de relógio para o deslocamento de entrada e de saída de dados. A fim de reduzir o tempo de teste, a solução para este problema passa por fraccionar a cadeia de scan em varias cadeias mais curtas, que levam menos tempo a ser preenchidas, com o inconveniente do aumento do número de entradas. Também, é de esperar que a potência e energia consumidas para a realização da sessão de BIST são significativas, devido ao maior número de portas lógicas e de ciclos de relógio. Este ultimo aspecto é especialmente sério em equipamentos portáteis, já que reduzem a autonomia das baterias. Um circuito que aumenta a sua complexidade para mais do dobro vai aumentar o seu consumo de energia de uma forma bastante significativa. Uma forma de reduzir este consumo é 51 tornar latente (ou inactivo) as zonas do circuito que não estejam a ser utilizadas. Durante o processo de BIST, todo o circuito está a ser utilizado. Consequentemente, durante a sessão de auto-teste será a altura em que o consumo de potência será mais elevado. Contudo, durante o funcionamento normal não é assim. Com efeito, quando o circuito funciona em modo normal, o bloco de LFSR e o bloco MISR não necessitam de estar a funcionar. A introdução de uma linha de Enable nestes blocos leva a um menor consumo. 52 6. Referências [1] M.L. Bushnel, V.D. Agrawal, “Essentials of Electronic Testing for Digital Memory and Mixed-Signal VLSI Circuits”, Kluwer Academic Publishers, 2000. [2] Charles E. Stroud, “A Designer’s Guide to Built-In Self-Test”, Kluwer Academic Publishers, Boston, United States of America, 2002. [3] G. Hetherington, T. Fryars, N. Tamarapalli, M. Kassab, A. Hassan, J. Rajski, “Logic BIST for Large Industrial Designs: Real Issues and Case Studies”, Proc. IEEE Int. Test Conf. (ITC), pp. 358-367, 1999. [4] P. Lecoq and J. Varela, 2002 “Clear-PEM, A dedicated PET camera for mammography”, Nucl. Instrum. Meth. vol. A 486, pp. 1-6, 2002. [5] M.C. Abreu, J.D. Aguiar, F.G. Almeida, P. Almeida, P. Bento, B. Carriço, M. Ferreira, N.C. Ferreira, F. Gonçalves, C. Leong, F. Lopes, P. Lousã, M.V. Martins, N. Matela, P.R. Mendes, R. Moura, J. Nobre, N. Oliveira, C. Ortigão, L. Peralta, R. Pereira, J. Rego, R. Ribeiro, P. Rodrigues, J. Sampaio, A.I. Santos, L. Silva, J.C. Silva, P. Sousa, I.C. Teixeira, J.P. Teixeira, A. Trindade, and J. Varela, “Design and Evaluation of the Clear-PEM Scanner for Positron Emission Mammography”, IEEE Transactions on Nuclear Science, vol.. 53, Nº. 1, pp. 71-76, February 2006. [6] Tecmic, http://www.tecmic.pt/eng/index.html [7] Scott Davidson, “ITC’99 Benchmark Circuits – Preliminary Results”, Proc. IEEE International Test Conf (ITC), pp. 1125, 1999; benchmarks available at http://www.cerc.utexas.edu/itc99- benchmarks/bench.html [8] C. Leong, P. Bento, P. Lousã, J. Nobre, J. Rego, P. Rodrigues, L. Silva, J.C. Silva, I.C. Teixeira, J.P. Teixeira, A. Trindade, and J. Varela, “Design and Test Issues of an FPGA Based Data Acquisition System for Medical Imaging using PEM”, IEEE Transactions on Nuclear Science, vol.. 53, nº. 3, pp. 761-769, June 2006. [9] P. Bento “Sistema Electrónico para Organização e Encaminhamento de Dados num Sistema de Detecção de Cancro da Mama em Tecnologia PET” Dissertação para a Obtenção de Grau Mestre em Engenharia Electrotécnica e de Computadores pelo Instituto Superior Técnico, Abril 2006. [10] Nandu Tendolkar, Rick Woltenberg, Rajesh Raina, Xijiang Lin, Bruce Swanson, Greg Aldrich, “ScanBased At-Speed Testing for the Fastest Chip”, Mentor Graphics, June 2001. [11] Nur A. Touba, “Synthesis Techniques for Pseudo-Random Built-In Self-Test”, Stanford University, June 1996. [12] Chien-In Henry Chien, “Efficient Aproaches to Low-Cost High-Fault Coverage VLSI BIST Designs”, IEEE Transactions on Aerospace and Electronic Systems, Vol. 34, No. 1, January 1998. [13] Bernd Koenemann, Stephen Pateras, “Built-In Self-Test (BIST) in the Era of Sub-Micron Technology”, LogicVision, California, USA. [14] http://www.ui.savba.sk/diag/tools/bist/ [15] http://fidelio.inesc-id.pt/dft/ 53 Anexos 54 RD_ROC Test Bench `timescale 1ns/1ps module rd_roc_tb; /*parameters */ parameter Num_Inputs = 274; parameter Num_Outputs = 68; parameter Num_Vectores = 10000; /*número de vectores de teste*/ parameter CLKa = 2000; /*Aux vars*/ integer index; real half_clk,quarter_clk; reg [0:Num_Inputs-1] input_vec; /*Regs for assigning test vectors to circuit inputs */ reg [0:Num_Inputs-1] inputs [0:Num_Vectores]; reg clk; reg reset; /* circuit inputs*/ wire onoff, int_req_onoff, empty_fout, int_readyerr, full_bbus; wire [0:243] dout_fout; wire [0:24] int_errcount; /*assign "inputs" to circuit inputs */ assign { int_readyerr, full_bbus, onoff, int_req_onoff, empty_fout, dout_fout[0:243], int_errcount[0:24]} = inputs [index]; /*wires for transferring results to output */ wire [0:Num_Outputs-1] outputs; /* circuit outputs*/ wire rd_fout, int_doneerr, wr_bbus, dcc_busy; wire [0:63] dout_bbus; /* assign "outputs" to wire outputs */ assign outputs = {rd_fout, int_doneerr, dout_bbus[0:63], wr_bbus, dcc_busy}; /* CUT instantiation */ 55 rd_roc TOP_inst ( .clk(clk), .reset(reset), .onoff(onoff), .int_req_onoff(int_req_onoff), .dout_fout(dout_fout), .empty_fout(empty_fout), .rd_fout(rd_fout), .int_readyerr(int_readyerr), .int_errcount(int_errcount), .int_doneerr(int_doneerr), .dout_bbus(dout_bbus), .wr_bbus(wr_bbus), .full_bbus(full_bbus), .dcc_busy(dcc_busy)); initial begin $fs_add(rd_roc); $fs_inject; /*variable initialization*/ index=0; clk=0; reset=1; half_clk = CLKa/2; quarter_clk = half_clk/2; /* Getting input vectors from file */ $readmemb("./estimulos.vec",inputs); $display ("***************************** ***************************\n"); inicio /* Executing Simulation */ while (index < Num_Vectores) begin input_vec = inputs[index]; $display ("***************************** vector %d ***************************\n",index+1); $display ("entradas\ndout_fout %b\nempty_fout %b\nfull_bbus %b\nint_errcount %b\nint_readyerr %b\nint_req_onoff %b\nonoff %b\nreset %b\n",input_vec[6:249],input_vec[5],input_vec[2],input_vec[250:274],input_vec[1],input_vec[4],input_vec[3],input _vec[0]); #quarter_clk; #half_clk; $fs_strobe(rd_fout, int_doneerr, dout_bbus[0:63],wr_bbus, dcc_busy); #quarter_clk; $display ("saidas \ndcc_busy %b\ndout_bbus %b\nint_doneerr %b\nrd_fout %b\nwr_bbus %b\n",outputs[67],outputs[2:65],outputs[1],outputs[0],outputs[66]); index = index + 1; $fs_strobe(rd_fout, int_doneerr,dout_bbus[0:63],wr_bbus, dcc_busy); reset=0; end //$fs_strobe(rd_fout, int_doneerr, dout_bbus[0:63],wr_bbus, dcc_busy); 56 $finish; end always #half_clk clk = ~clk; endmodule 57 PLI /* filename: pli.c */ #include "acc_user.h" #include "veriuser.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> const numSaidas = 68; //alterar também na estrutura em baixo typedef struct vec{ char array[68]; }element; element *estrutura=null; double lastclock=0; teste() //apenas o inicio do que vai ser feito { //argumentos do PLI que vem do testbench (por ordem) int numVectores = acc_fetch_tfarg_int(1); double clk_start = acc_fetch_tfarg(2); double clk_real = acc_fetch_tfarg(3); int index = acc_fetch_tfarg_int(5); handle saida; char *vector; int i; //instrucoes para transformar vector binario vindo do tesbench em string saida = acc_handle_tfarg(4); vector = acc_fetch_value(saida,"%b",null); //alocacao da estrutura onde se guarda as referencias if (clk_start == clk_real && index == 0) { // io_printf("malloc\n"); estrutura = (element *) malloc( numVectores * sizeof( element) ); //malloc mal feito } if (clk_start == clk_real) { //guarda em memoria as primeiras iteracoes 58 // io_printf("inserir\n"); strncpy((estrutura+index)->array,vector,numSaidas); // io_printf("inserir2\n"); } else // deteccao de erros nos vectores comparando-os com a referencia if (strncmp((estrutura+index)->array,vector,numSaidas)!=0){ //11 corresponde ao número de bits de cada vector io_printf("ERRO\n"); io_printf("o valor do clock anterior %f e do de erro %f\n",lastclock,clk_real); exit(0); } // if (index==(numVectores-1)) // lastclock=clk_real; //escrita na saída dos diferentes valores //io_printf("Número de vectores de entrada: %d\n",numVectores); //io_printf("valor do clock: %f\n",clk_real); //io_printf("Valor da ultima saída: %s\n",vector); //io_printf("Mais um: %s\n\n",*(estrutura+index)); } 59 Código VHDL dos Diferentes Blocos Control library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity control is Port ( clk : in std_logic; reset : in std_logic; test_bist : in std_logic; data : in std_logic_vector (67 downto 0); scan_en : out std_logic; reset_tpg : out std_logic; reset_cut : out std_logic; reset_misr : out std_logic; enable_misr : out std_logic; bist_done : out std_logic; bist_result: out std_logic); end control; architecture Behavioral of control is type estados is (INICIO,RESET_TPG_ST,FILL_SCAN,RESET_MISR_ST,EMPTY_SCAN,TEST,BIST_END); signal estado,p_estado: estados; signal vectores,contador,p_vectores,p_contador: integer; begin process (clk) begin if (reset='1') then estado <= INICIO; elsif rising_edge (clk) then --falling_ estado <= p_estado; contador <= p_contador; vectores <= p_vectores; end if; end process; process (estado,p_estado,test_bist,contador,vectores,data,clk) begin case estado is 60 when INICIO => reset_tpg <='0'; if (reset='1') then reset_cut <='1'; else reset_cut <='0'; end if; reset_misr<='0'; enable_misr<='0'; p_contador<=0; p_vectores<=0; scan_en<='0'; bist_done<='0'; bist_result<='0'; if (test_bist = '1') then p_estado <= RESET_TPG_ST; else p_estado <= INICIO; end if; when RESET_TPG_ST => reset_tpg <='1'; reset_cut <='1'; reset_misr<='0'; enable_misr<='0'; p_contador<=0; p_vectores<=0; scan_en<='0'; --faz tambem de enable da lfsr bist_done<='0'; bist_result<='0'; if (test_bist = '0') then p_estado <= INICIO; else p_estado <= FILL_SCAN; end if; when FILL_SCAN => reset_tpg <='0'; reset_cut <='0'; reset_misr<='0'; enable_misr<='0'; p_contador<=contador+1; p_vectores<=0; scan_en<='1'; bist_done<='0'; bist_result<='0'; if (test_bist = '0') then p_estado <= INICIO; elsif (contador=372) then p_estado <= RESET_MISR_ST; else p_estado <= FILL_SCAN; end if; when RESET_MISR_ST => 61 reset_tpg <='0'; reset_cut <='0'; reset_misr<='1'; enable_misr<='1'; p_contador<=0; p_vectores<=1; scan_en<='0'; bist_done<='0'; bist_result<='0'; if (test_bist = '0') then p_estado <= INICIO; else p_estado <= EMPTY_SCAN; end if; when EMPTY_SCAN => reset_tpg <='0'; reset_cut <='0'; reset_misr<='0'; enable_misr<='1'; p_contador<=contador+1; p_vectores<=vectores; scan_en<='1'; bist_done<='0'; if (test_bist = '0') then p_estado <= INICIO; elsif (contador=372) then p_estado <= TEST; else p_estado <= EMPTY_SCAN; end if; when TEST => reset_tpg <='0'; reset_cut <='0'; --arranjar maneira de fazer uns resets nesta zona a partir do número de vectores, tipo, ao vector 200 fazer reset. reset_misr<='0'; enable_misr<='1'; p_contador<=0; p_vectores<=vectores+1; scan_en<='0'; bist_done<='0'; bist_result<='0'; if (test_bist = '0') then p_estado <= INICIO; elsif (vectores=10) then p_estado <= BIST_END; else p_estado <= EMPTY_SCAN; end if; when BIST_END => reset_tpg <='0'; reset_cut <='0'; reset_misr<='0'; 62 enable_misr<='0'; p_contador<=0; p_vectores<=vectores; scan_en<='0'; bist_done<='1'; if (data = "10001011001000001000010000010011111101110010010101011100100111100010") then bist_result<='1'; else bist_result<='0'; end if; if (test_bist='0') then p_estado <= INICIO; else p_estado <= BIST_END; end if; when others => null; end case; end process; end Behavioral; 63 LFSR library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TPG is port( Clock: in std_logic; Reset: in std_logic; enable: in std_logic; Data_out: out std_logic_vector(273 downto 0)); end TPG; architecture Comportamento of TPG is signal Qin: std_logic_vector(273 downto 0); signal Qout: std_logic_vector(273 downto 0); begin Qin(0) <= Qout(19); Qin(1) <= Qout(0); Qin(2) <= Qout(1); Qin(3) <= Qout(2); Qin(4) <= Qout(3); Qin(5) <= Qout(4); Qin(6) <= Qout(5); Qin(7) <= Qout(6); Qin(8) <= Qout(7); Qin(9) <= Qout(8); Qin(10) <= Qout(9); Qin(11) <= Qout(10); Qin(12) <= Qout(11); Qin(13) <= Qout(12); Qin(14) <= Qout(13); Qin(15) <= Qout(14); Qin(16) <= Qout(15); Qin(17) <= Qout(19) xor Qout(16); Qin(18) <= Qout(17); Qin(19) <= Qout(18); Qin(20) <= Qout(19); Qin(21) <= Qout(20); Qin(22) <= Qout(21); Qin(23) <= Qout(22); Qin(24) <= Qout(23); Qin(25) <= Qout(24); Qin(26) <= Qout(25); Qin(27) <= Qout(26); Qin(28) <= Qout(27); Qin(29) <= Qout(28); Qin(30) <= Qout(29); Qin(31) <= Qout(30); Qin(32) <= Qout(31); Qin(33) <= Qout(32); 64 Qin(34) <= Qout(33); Qin(35) <= Qout(34); Qin(36) <= Qout(35); Qin(37) <= Qout(36); Qin(38) <= Qout(37); Qin(39) <= Qout(38); Qin(40) <= Qout(39); Qin(41) <= Qout(40); Qin(42) <= Qout(41); Qin(43) <= Qout(42); Qin(44) <= Qout(43); Qin(45) <= Qout(44); Qin(46) <= Qout(45); Qin(47) <= Qout(46); Qin(48) <= Qout(47); Qin(49) <= Qout(48); Qin(50) <= Qout(49); Qin(51) <= Qout(50); Qin(52) <= Qout(51); Qin(53) <= Qout(52); Qin(54) <= Qout(53); Qin(55) <= Qout(54); Qin(56) <= Qout(55); Qin(57) <= Qout(56); Qin(58) <= Qout(57); Qin(59) <= Qout(58); Qin(60) <= Qout(59); Qin(61) <= Qout(60); Qin(62) <= Qout(61); Qin(63) <= Qout(62); Qin(64) <= Qout(63); Qin(65) <= Qout(64); Qin(66) <= Qout(65); Qin(67) <= Qout(66); Qin(68) <= Qout(67); Qin(69) <= Qout(68); Qin(70) <= Qout(69); Qin(71) <= Qout(70); Qin(72) <= Qout(71); Qin(73) <= Qout(72); Qin(74) <= Qout(73); Qin(75) <= Qout(74); Qin(76) <= Qout(75); Qin(77) <= Qout(76); Qin(78) <= Qout(77); Qin(79) <= Qout(78); Qin(80) <= Qout(79); Qin(81) <= Qout(80); Qin(82) <= Qout(81); Qin(83) <= Qout(82); Qin(84) <= Qout(83); Qin(85) <= Qout(84); Qin(86) <= Qout(85); Qin(87) <= Qout(86); Qin(88) <= Qout(87); Qin(89) <= Qout(88); 65 Qin(90) <= Qout(89); Qin(91) <= Qout(90); Qin(92) <= Qout(91); Qin(93) <= Qout(92); Qin(94) <= Qout(93); Qin(95) <= Qout(94); Qin(96) <= Qout(95); Qin(97) <= Qout(96); Qin(98) <= Qout(97); Qin(99) <= Qout(98); Qin(100) <= Qout(99); Qin(101) <= Qout(100); Qin(102) <= Qout(101); Qin(103) <= Qout(102); Qin(104) <= Qout(103); Qin(105) <= Qout(104); Qin(106) <= Qout(105); Qin(107) <= Qout(106); Qin(108) <= Qout(107); Qin(109) <= Qout(108); Qin(110) <= Qout(109); Qin(111) <= Qout(110); Qin(112) <= Qout(111); Qin(113) <= Qout(112); Qin(114) <= Qout(113); Qin(115) <= Qout(114); Qin(116) <= Qout(115); Qin(117) <= Qout(116); Qin(118) <= Qout(117); Qin(119) <= Qout(118); Qin(120) <= Qout(119); Qin(121) <= Qout(120); Qin(122) <= Qout(121); Qin(123) <= Qout(122); Qin(124) <= Qout(123); Qin(125) <= Qout(124); Qin(126) <= Qout(125); Qin(127) <= Qout(126); Qin(128) <= Qout(127); Qin(129) <= Qout(128); Qin(130) <= Qout(129); Qin(131) <= Qout(130); Qin(132) <= Qout(131); Qin(133) <= Qout(132); Qin(134) <= Qout(133); Qin(135) <= Qout(134); Qin(136) <= Qout(135); Qin(137) <= Qout(136); Qin(138) <= Qout(137); Qin(139) <= Qout(138); Qin(140) <= Qout(139); Qin(141) <= Qout(140); Qin(142) <= Qout(141); Qin(143) <= Qout(142); Qin(144) <= Qout(143); Qin(145) <= Qout(144); 66 Qin(146) <= Qout(145); Qin(147) <= Qout(146); Qin(148) <= Qout(147); Qin(149) <= Qout(148); Qin(150) <= Qout(149); Qin(151) <= Qout(150); Qin(152) <= Qout(151); Qin(153) <= Qout(152); Qin(154) <= Qout(153); Qin(155) <= Qout(154); Qin(156) <= Qout(155); Qin(157) <= Qout(156); Qin(158) <= Qout(157); Qin(159) <= Qout(158); Qin(160) <= Qout(159); Qin(161) <= Qout(160); Qin(162) <= Qout(161); Qin(163) <= Qout(162); Qin(164) <= Qout(163); Qin(165) <= Qout(164); Qin(166) <= Qout(165); Qin(167) <= Qout(166); Qin(168) <= Qout(167); Qin(169) <= Qout(168); Qin(170) <= Qout(169); Qin(171) <= Qout(170); Qin(172) <= Qout(171); Qin(173) <= Qout(172); Qin(174) <= Qout(173); Qin(175) <= Qout(174); Qin(176) <= Qout(175); Qin(177) <= Qout(176); Qin(178) <= Qout(177); Qin(179) <= Qout(178); Qin(180) <= Qout(179); Qin(181) <= Qout(180); Qin(182) <= Qout(181); Qin(183) <= Qout(182); Qin(184) <= Qout(183); Qin(185) <= Qout(184); Qin(186) <= Qout(185); Qin(187) <= Qout(186); Qin(188) <= Qout(187); Qin(189) <= Qout(188); Qin(190) <= Qout(189); Qin(191) <= Qout(190); Qin(192) <= Qout(191); Qin(193) <= Qout(192); Qin(194) <= Qout(193); Qin(195) <= Qout(194); Qin(196) <= Qout(195); Qin(197) <= Qout(196); Qin(198) <= Qout(197); Qin(199) <= Qout(198); Qin(200) <= Qout(199); Qin(201) <= Qout(200); 67 Qin(202) <= Qout(201); Qin(203) <= Qout(202); Qin(204) <= Qout(203); Qin(205) <= Qout(204); Qin(206) <= Qout(205); Qin(207) <= Qout(206); Qin(208) <= Qout(207); Qin(209) <= Qout(208); Qin(210) <= Qout(209); Qin(211) <= Qout(210); Qin(212) <= Qout(211); Qin(213) <= Qout(212); Qin(214) <= Qout(213); Qin(215) <= Qout(214); Qin(216) <= Qout(215); Qin(217) <= Qout(216); Qin(218) <= Qout(217); Qin(219) <= Qout(218); Qin(220) <= Qout(219); Qin(221) <= Qout(220); Qin(222) <= Qout(221); Qin(223) <= Qout(222); Qin(224) <= Qout(223); Qin(225) <= Qout(224); Qin(226) <= Qout(225); Qin(227) <= Qout(226); Qin(228) <= Qout(227); Qin(229) <= Qout(228); Qin(230) <= Qout(229); Qin(231) <= Qout(230); Qin(232) <= Qout(231); Qin(233) <= Qout(232); Qin(234) <= Qout(233); Qin(235) <= Qout(234); Qin(236) <= Qout(235); Qin(237) <= Qout(236); Qin(238) <= Qout(237); Qin(239) <= Qout(238); Qin(240) <= Qout(239); Qin(241) <= Qout(240); Qin(242) <= Qout(241); Qin(243) <= Qout(242); Qin(244) <= Qout(243); Qin(245) <= Qout(244); Qin(246) <= Qout(245); Qin(247) <= Qout(246); Qin(248) <= Qout(247); Qin(249) <= Qout(248); Qin(250) <= Qout(249); Qin(251) <= Qout(250); Qin(252) <= Qout(251); Qin(253) <= Qout(252); Qin(254) <= Qout(253); Qin(255) <= Qout(254); Qin(256) <= Qout(255); Qin(257) <= Qout(256); 68 Qin(258) <= Qout(257); Qin(259) <= Qout(258); Qin(260) <= Qout(259); Qin(261) <= Qout(260); Qin(262) <= Qout(261); Qin(263) <= Qout(262); Qin(264) <= Qout(263); Qin(265) <= Qout(264); Qin(266) <= Qout(265); Qin(267) <= Qout(266); Qin(268) <= Qout(267); Qin(269) <= Qout(268); Qin(270) <= Qout(269); Qin(271) <= Qout(270); Qin(272) <= Qout(271); Qin(273) <= Qout(272); sinc_TPG: process(Clock,Reset) begin if Reset = '1' then Qout <= "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; elsif Clock'event and Clock = '1' and enable = '1' then Qout <= Qin; end if; end process; Data_out <= Qout; end Comportamento; 69 MISR library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Misr is port( Data_in: in std_logic_vector(67 downto 0); Clock: in std_logic; Reset: in std_logic; enable: in std_logic; Data_out: out std_logic_vector(67 downto 0)); end Misr; architecture Comportamento of Misr is signal Qin: std_logic_vector(67 downto 0); signal Qout: std_logic_vector(67 downto 0); begin Qin(0) <= Qout(67) xor Data_in(0); Qin(1) <= Qout(0) xor Data_in(1); Qin(2) <= Qout(1) xor Data_in(2); Qin(3) <= Qout(2) xor Data_in(3); Qin(4) <= Qout(3) xor Data_in(4); Qin(5) <= Qout(4) xor Data_in(5); Qin(6) <= Qout(5) xor Data_in(6); Qin(7) <= Qout(6) xor Data_in(7); Qin(8) <= Qout(7) xor Data_in(8); Qin(9) <= Qout(8) xor Data_in(9) xor Qout(67); Qin(10) <= Qout(9) xor Data_in(10); Qin(11) <= Qout(10) xor Data_in(11); Qin(12) <= Qout(11) xor Data_in(12); Qin(13) <= Qout(12) xor Data_in(13); Qin(14) <= Qout(13) xor Data_in(14); Qin(15) <= Qout(14) xor Data_in(15); Qin(16) <= Qout(15) xor Data_in(16); Qin(17) <= Qout(16) xor Data_in(17); Qin(18) <= Qout(17) xor Data_in(18); Qin(19) <= Qout(18) xor Data_in(19); Qin(20) <= Qout(19) xor Data_in(20); Qin(21) <= Qout(20) xor Data_in(21); Qin(22) <= Qout(21) xor Data_in(22); Qin(23) <= Qout(22) xor Data_in(23); Qin(24) <= Qout(23) xor Data_in(24); 70 Qin(25) <= Qout(24) xor Data_in(25); Qin(26) <= Qout(25) xor Data_in(26); Qin(27) <= Qout(26) xor Data_in(27); Qin(28) <= Qout(27) xor Data_in(28); Qin(29) <= Qout(28) xor Data_in(29); Qin(30) <= Qout(29) xor Data_in(30); Qin(31) <= Qout(30) xor Data_in(31); Qin(32) <= Qout(31) xor Data_in(32); Qin(33) <= Qout(32) xor Data_in(33); Qin(34) <= Qout(33) xor Data_in(34); Qin(35) <= Qout(34) xor Data_in(35); Qin(36) <= Qout(35) xor Data_in(36); Qin(37) <= Qout(36) xor Data_in(37); Qin(38) <= Qout(37) xor Data_in(38); Qin(39) <= Qout(38) xor Data_in(39); Qin(40) <= Qout(39) xor Data_in(40); Qin(41) <= Qout(40) xor Data_in(41); Qin(42) <= Qout(41) xor Data_in(42); Qin(43) <= Qout(42) xor Data_in(43); Qin(44) <= Qout(43) xor Data_in(44); Qin(45) <= Qout(44) xor Data_in(45); Qin(46) <= Qout(45) xor Data_in(46); Qin(47) <= Qout(46) xor Data_in(47); Qin(48) <= Qout(47) xor Data_in(48); Qin(49) <= Qout(48) xor Data_in(49); Qin(50) <= Qout(49) xor Data_in(50); Qin(51) <= Qout(50) xor Data_in(51); Qin(52) <= Qout(51) xor Data_in(52); Qin(53) <= Qout(52) xor Data_in(53); Qin(54) <= Qout(53) xor Data_in(54); Qin(55) <= Qout(54) xor Data_in(55); Qin(56) <= Qout(55) xor Data_in(56); Qin(57) <= Qout(56) xor Data_in(57); Qin(58) <= Qout(57) xor Data_in(58); Qin(59) <= Qout(58) xor Data_in(59); Qin(60) <= Qout(59) xor Data_in(60); Qin(61) <= Qout(60) xor Data_in(61); Qin(62) <= Qout(61) xor Data_in(62); Qin(63) <= Qout(62) xor Data_in(63); Qin(64) <= Qout(63) xor Data_in(64); Qin(65) <= Qout(64) xor Data_in(65); Qin(66) <= Qout(65) xor Data_in(66); Qin(67) <= Qout(66) xor Data_in(67); sinc_TPG: process(Clock,Reset) 71 begin if Reset = '1' then Qout <= "00000000000000000000000000000000000000000000000000000000000000000000"; elsif Clock'event and Clock = '1' and enable = '1' then Qout <= Qin; end if; end process; Data_out <= Qout; end Comportamento; 72 MUX library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity mux275 is port( A:in std_logic_vector(274 downto 0); B:in std_logic_vector(274 downto 0); control:in std_logic; C:out std_logic_vector(274 downto 0)); end mux275; architecture Behavioral of mux275 is begin process (control,A,B) begin if control = '1' then C <= B; else C <= A; end if; end process; end Behavioral; 73 Top Level library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity top_level is port( clk: in std_logic; reset: in std_logic; data_in: in std_logic_vector (274 downto 0); test_bist: in std_logic; data_out: out std_logic_vector (67 downto 0); bist_done: out std_logic; bist_result: out std_logic); --Colocar a saida BIST_DONE,funçao k o bist result faz neste momento end top_level; architecture Behavioral of top_level is component Misr is port( Data_in: in std_logic_vector(67 downto 0); Clock: in std_logic; Reset: in std_logic; enable: in std_logic; Data_out: out std_logic_vector(67 downto 0) ); end component; component mux275 is port( A:in std_logic_vector(274 downto 0); B:in std_logic_vector(274 downto 0); control:in std_logic; C:out std_logic_vector(274 downto 0)); end component; component TPG is port( Clock: in std_logic; Reset: in std_logic; enable: in std_logic; Data_out: out std_logic_vector(273 downto 0)); end component; component rd_roc is port( clk: in std_logic; reset: in std_logic; onoff: in std_logic; int_req_onoff: in std_logic; dout_fout: in std_logic_vector (243 downto 0); 74 empty_fout: in std_logic; int_readyerr: in std_logic; int_errcount: in std_logic_vector (24 downto 0); full_bbus: in std_logic; test_se: in std_logic; test_si: in std_logic; dcc_busy: out std_logic; dout_bbus: out std_logic_vector (63 downto 0); int_doneerr: out std_logic; rd_fout: out std_logic; wr_bbus: out std_logic ); end component; component control is Port ( clk : in std_logic; reset : in std_logic; test_bist : in std_logic; data : in std_logic_vector (67 downto 0); scan_en : out std_logic; reset_tpg : out std_logic; reset_cut : out std_logic; reset_misr : out std_logic; enable_misr : out std_logic; bist_done : out std_logic; bist_result: out std_logic); end component; signal tpg_out : std_logic_vector (273 downto 0); signal mux_in,mux_out : std_logic_vector (274 downto 0); signal rd_out,data_out_aux : std_logic_vector (67 downto 0); signal scan_en,reset_tpg,reset_cut,reset_misr,enable_misr:std_logic; begin LFSR: TPG port map( Clock => clk, reset => reset_tpg, enable => scan_en, Data_out=> tpg_out ); mux_in <= tpg_out & reset_cut; mux : mux275 port map( A => Data_in, B => mux_in, Control => test_bist, C => mux_out ); --isto tem erro, atençao depois circuito: rd_roc port map( clk => clk, reset => mux_out(0), onoff => mux_out(1), int_req_onoff => mux_out(2), 75 dout_fout => mux_out(249 downto 6), empty_fout => mux_out(3), int_readyerr => mux_out(4), int_errcount => mux_out(274 downto 250), full_bbus =>mux_out(5) , test_se => scan_en, test_si =>mux_out(274) , dcc_busy => rd_out(67), dout_bbus => rd_out(66 downto 3), int_doneerr => rd_out(2), rd_fout => rd_out(1), wr_bbus => rd_out(0) ); compactador : Misr port map( Data_in =>rd_out , Clock => clk, Reset => reset_misr, enable => enable_misr, Data_out => Data_out_aux ); controlo: control port map( clk => clk, reset => reset, test_bist => test_bist, data => data_out_aux, scan_en => scan_en, reset_tpg => reset_tpg, reset_cut => reset_cut, reset_misr => reset_misr, enable_misr => enable_misr, bist_done => bist_done, bist_result => bist_result ); data_out <= data_out_aux; end Behavioral; 76 BIST Test Bench `timescale 1ns/1ps module bist10_tb; /*parameters */ parameter Num_Inputs = 275; parameter Num_Outputs = 68; parameter Num_Vectores = 44; /*número de vectores de teste*/ parameter CLKa = 2000; /*Aux vars*/ integer index; real half_clk,quarter_clk; integer contador; /*Regs for assigning test vectors to circuit inputs */ reg [0:Num_Inputs-1] inputs [0:Num_Vectores]; reg clk; reg reset; reg test_bist; /* circuit inputs*/ wire [0:274] data_in; /*assign "inputs" to circuit inputs */ assign { data_in[0:274]} = inputs [index]; /*wires for transferring results to output */ wire [0:Num_Outputs-1] outputs; wire bist_result; wire bist_done; /* circuit outputs*/ wire [0:67] data_out; /* assign "outputs" to wire outputs */ assign outputs = {data_out[0:67]}; /* CUT instantiation */ top_level TOP_inst (.clk(clk),.reset(reset),.data_in(data_in),.test_bist(test_bist),.data_out(data_out),.bist_done(bist_done),.bist_r esult(bist_result)); 77 initial begin $fs_add(top_level); $fs_inject; /* para verifault */ /*variable initialization*/ index=0; clk=0; reset=1; half_clk = CLKa/2; quarter_clk = half_clk/2; test_bist = 0; contador = 0; /* Getting input vectors from file */ $readmemb("./estimulos.vec",inputs); $display ("***************************** ***************************\n"); inicio while (index < Num_Vectores) begin @(negedge clk) /* $display ("***************************** vector %d ***************************\n",index+1); $display ("entradas\data_in %b\ntest_bist %b\nclk %b\n ",data_in[0:274],test_bist,clk); */ #half_clk; $fs_strobe(data_out[0:67],bist_result,bist_done); $display ("entradas\data_in %b\ntest_bist %b\nclk %b\n /* ",data_in[0:274],test_bist,clk);*/ /* $display ("saidas \ndata_out%b \nbist_result %b\nbist_done %b \n",data_out[0:67],bist_result,bist_done);*/ if (contador > 99000) begin reset = 0; index = index + 1; contador = 0; if (index > 5 ) begin test_bist = 1; end $display ("saidas \ndata_out%b \nbist_result %b\nbist_done %b \n",data_out[0:67],bist_result,bist_done); end contador = contador + 1; end 78 $finish; end always #1000 clk = ~clk; endmod 79