Вы находитесь на странице: 1из 144

Faculdade de Engenharia da Universidade do Porto

Técnicas de Auto-teste (BIST) e


Auto-reparação (BISR) para
memórias RAM sı́ncronas

Alberto Rui Frutuoso Barroso

Tese submetida no âmbito do


Mestrado Integrado em Engenharia Electrotécnica e de Computadores
Major de Telecomunicações

Orientador: João Canas Ferreira (Professor)

30 Junho de 2008

c Alberto Rui Frutuoso Barroso, 2008
LII PORTO
CEuD FACULDADE DE DO
ENGENHARIA
UNIVERSIDADE PORTO

MIEEC - MESTRADO INTEGRADO EM ENGENHARIA 2007/2008


ELECTROTÉCNICA E DE COMPUTADORES

A Dissertação intitulada

“Técnicas de Auto-Teste (BIST) e Auto-Reparação (BISR) para Memórias RAM


Sincronas”

foi aprovada em provas realizadas 18/Julho/2008

o júri
Presidente Professor Doutor José Alfredo Ribeiro da Silva Matos
Professor Catedrático da Faculdade de Engenharia da Universidade do Porto

Professor Dout{or Fernando Ma uel Duarte Gonçalves


Professor AuxiLiar~io Instituto Superior Técnico da Universidade Técnica de Lisboa

Professor Doutor João Paulo de Castro Canas Ferreira


Professor Auxiliar da Faculdade de Engenharia da Universidade do Porto

O autor declara que a presente dissertação (ou relatório de projecto) é da sua


exclusiva autoria e foi escrita sem qualquer apoio externo não explicitamente
autorizado. Os resultados, ideias, parágrafos, ou outros extractos tomados de ou
inspirados em trabalhos de outros autores, e demais referências bibliográficas
usadas, são correctamente citados.

Autor Álbert9 Rui Frutuoso Barroso

Faculdade de Engenharia da Universidade do Porto



c Alberto Rui Frutuoso Barroso, 2008
Resumo

Os actuais processos de fabrico CMOS com resoluções inferiores a 100nm permitem o


desenvolvimento de dispositivos de memória discreta com vários Gigabit e integrar bancos
de memória com vários Megabit em microprocessadores e circuitos de aplicação especı́fica.
Devido ao facto do número de dispositivos fabricados sem defeito diminuir com o
aumento do número de células de armazenagem, exige que sejam introduzidos nestes dis-
positivos de memória mecanismos de Auto-teste (BIST) e Auto-reparação (BISR).

Nesta dissertação são apresentadas algumas técnicas de BIST e BISR utilizadas na


actualidade, e é descrito um sistema BIST em espelho associado a um mecanismo de
BISR de redundância programável, complementado com um sistema de refrescamento
adaptativo.
Para simulação de mecanismos de BIST e BISR em memórias sı́ncronas foi desenvolvido
um sistema com um dispositivo de lógica programável (FPGA).
Este sistema foi implementado utilizando um kit contendo uma FPGA XC3S400 da Xil-
inx, e foi construı́da uma placa auxiliar com 4 Megabytes de memória dinâmica assı́ncrona.
Nesta placa auxiliar foram implementados quatro canais de memória para simular
estruturas com vários bancos em memórias sı́ncronas, adaptadores (latches HCT) nas
linhas de endereço para simulação de pontes de memória (North-Bridge) e uma porta
paralela para transferência bilateral de comandos e dados para o exterior do sistema.
Com o objectivo de desenvolver soluções com o mı́nimo de acréscimo de área no circuito
integrado (die overhead ), foi desenvolvida uma solução de BIST em espelho para memórias
estruturadas em dois ou mais bancos, simulando o caminho de dados (datapath) existente
entre os comutadores de amplificadores de sentido (sense amplifiers) e o bloco controlador
de pinos de entrada e de saı́da.
Complementando os elementos redundantes para reparação integrada (BIR), foi tes-
tada uma unidade de medida do tempo de retenção das células, para utilização em sistemas
de refrescamento adaptativo.

Adicionando registos de configuração nos sistemas de reparação por linhas e colunas


redundantes, e utilizando unidades de Auto-teste em espelho nos barramentos de dados
de prefetch dos actuais produtos de memória sı́ncrona, provou-se ser possı́vel a integração
da função BIST desenvolvida neste trabalho nas zonas exteriores aos blocos de memória
(espinha do dispositivo), causando acréscimos na área de silı́cio inferiores a 72% nessas
zonas.

i
ii
Abstract

Nowadays CMOS processes with features below 100nm allow designers to develop multi
Gigabit memory devices, and integrate Mega sized memory banks in microprocessors and
ASIC products.
Due to the fact that the memory Yield decreases with the increase of the number of
storage cells, the manufacturing of RAM products must integrate built-in self-test (BIST)
and built-in self-repair (BISR) mechanisms to achieve an acceptable manufacturing Yield.

Some techniques of BIST and BISR currently used are presented in this dissertation.
A mirror BIST system is proposed and described associated with a programmable BISR,
and with an adaptable refresh schema.
A programmable logic system was developed, to simulate BIST and BISR mechanisms
used in synchronous memories. This system was implemented using a Xilinx XC3S400
FPGA kit, with a sister board with 4 Megabytes of asynchronous DRAM.
Four memory channels were integrated in the sister board, with the objective of sim-
ulating multiple bank structure seen in synchronous RAM devices. HCT latches were
installed in the the address lines to simulate North-Bridge connections, and a parallel port
was implemented for bilateral command and data transfers.
With the objective of developing minimum die overhead solutions, a mirror BIST
solution was created to be implemented in multi-bank RAM architectures, simulating the
data path between the sense amplifiers switches and the output pins controller.
As a complement to the redundant elements present in conventional BIR systems, a
time measurement unit (TMU) was tested to measure retention time of cells, and to setup
refresh controllers in adaptable refresh systems.
Adding configuration registers to redundant row and column repair systems, and using
mirror BIST units in the prefetch data path of current synchronous memory products, the
feasibility of integrating the proposed BIST schema in the memory device, with a die
overhead in the spine zone less than 72%, became proved.

iii
iv
Acknowledgements

I would like to thank Professor João Canas Ferreira for the continuous support.

My sincere thanks to Mr. Christian Seibert for the huge interest in this work.

I am extremely grateful to my family and friends for their infinite encouragement.

Alberto Rui Frutuoso Barroso

v
vi
Dedicated to my parents

Alberto Rui Frutuoso Barroso

vii
viii
Conteúdo

1 Introdução 1
1.1 Built in Self Test em dispositivos de memória . . . . . . . . . . . . . . . . . 3
1.2 Built In Self Repair em dispositivos de memória . . . . . . . . . . . . . . . 5
1.3 Apresentação dos objectivos e da metodologia utilizada . . . . . . . . . . . 8
1.3.1 BIST por espelho de falhas . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.2 BISR por granularidade e por refrescamento adaptativo . . . . . . . 11
1.3.3 Apresentação da metodologia utilizada . . . . . . . . . . . . . . . . . 12
1.4 Descrição do sistema de lógica programável . . . . . . . . . . . . . . . . . . 13
1.5 Roteiro das próximas secções . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Dispositivos de memória: evolução e fabrico 19


2.1 Electrónica em estado sólido . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Fabricantes de memórias em tecnologia CMOS . . . . . . . . . . . . . . . . 20
2.2.1 Instabilidade e deflação de preços . . . . . . . . . . . . . . . . . . . . 21
2.2.2 Perspectivas de crescimento . . . . . . . . . . . . . . . . . . . . . . . 22
2.3 Arquitecturas de memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3.1 Memórias DRAM assı́ncronas . . . . . . . . . . . . . . . . . . . . . . 25
2.3.2 Memórias DRAM assı́ncronas com paginação rápida . . . . . . . . . 26
2.3.3 Memórias DRAM assı́ncronas com paginação rápida EDO . . . . . . 28
2.3.4 Memórias DRAM assı́ncronas com paginação rápida BEDO . . . . . 29
2.3.5 Memórias dinâmicas sı́ncronas (SDRAM) . . . . . . . . . . . . . . . 30
2.3.6 Memórias sı́ncronas DDR . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3.7 Tendências de mercado para produtos DRAM . . . . . . . . . . . . . 35
2.4 Teste de dispositivos de memória . . . . . . . . . . . . . . . . . . . . . . . . 37
2.4.1 Estratégias para teste de memórias . . . . . . . . . . . . . . . . . . . 40
2.4.2 Dispositivos de memória com Auto-teste integrado . . . . . . . . . . 41
2.4.2.1 Implementações tı́picas de BIST em memórias . . . . . . . 44
2.4.3 Interface IEEE1500 em BIST para memórias . . . . . . . . . . . . . 48

3 Avaliação dos mecanismos BIST desenvolvidos 51


3.1 Solução de BIST por teste em espelho . . . . . . . . . . . . . . . . . . . . . 51
3.1.1 Módulo DataPathSemBIST . . . . . . . . . . . . . . . . . . . . . . . 53
3.1.2 BIST em espelho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.2 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4 Apresentação de sistemas de auto-reparação 61


4.1 BISR por manipulação de granularidade . . . . . . . . . . . . . . . . . . . . 61
4.2 BISR por refrescamento adaptativo . . . . . . . . . . . . . . . . . . . . . . . 63

ix
x CONTEÚDO

4.2.1 Implementação em Verilog do TMU (medida de tRET) . . . . . . . 64

5 Conclusões 73

A Esquemas eléctricos 75
A.1 Kit Altium live design Spartan-3 . . . . . . . . . . . . . . . . . . . . . . . . 76
A.2 Placa de memória dinâmica registada . . . . . . . . . . . . . . . . . . . . . . 86

B Código Verilog desenvolvido 93

C Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 105

D Programa em linguagem C para comunicações IEEE1284 117

Referências 124
Lista de Figuras

1.1 Nı́veis hierárquicos de BIST . . . . . . . . . . . . . . . . . . . . . . . . . . . 3


1.2 Integração do BIST no dispositivo . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 NEC uPD720900 Advanced Memory Buffer . . . . . . . . . . . . . . . . . . 4
1.4 MoSys: 1T-SRAM BISR com auto-configuração por BIST . . . . . . . . . . 5
1.5 BISR: granularidade por palavra dividida (DWL) . . . . . . . . . . . . . . . 6
1.6 BISR: granularidade por bloco . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.7 Arquitectura interna de memórias DDR2 . . . . . . . . . . . . . . . . . . . 8
1.8 Mecanismo de BIST em espelho de falhas . . . . . . . . . . . . . . . . . . . 9
1.9 Micro unidades BIST em espelho . . . . . . . . . . . . . . . . . . . . . . . . 10
1.10 Kit livedesign da Altium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.11 Diagrama de um modo de leitura da SRAM K6R4016 . . . . . . . . . . . . 14
1.12 Arquitectura da SRAM K6R4016 . . . . . . . . . . . . . . . . . . . . . . . . 14
1.13 Sister board com 4 Mega Bytes de DRAM . . . . . . . . . . . . . . . . . . . 15
1.14 Módulo SIM 30 pinos, com 1 MegaByte . . . . . . . . . . . . . . . . . . . . 16
1.15 Vista lateral do sistema de desenvolvimento . . . . . . . . . . . . . . . . . . 17
1.16 DLL inpout32.dll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.1 Cota de mercado: Memórias CMOS vs Circuitos integrados . . . . . . . . . 20


2.2 Dispositivos de memória CMOS . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3 Lei de Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4 SMJ4164: estrutura interna . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5 SMJ4164: ciclo de leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 Ciclo de leitura em modo de paginação rápida . . . . . . . . . . . . . . . . . 27
2.7 Diagrama de blocos da memória FPM HY514400 . . . . . . . . . . . . . . . 28
2.8 Diagrama de blocos da memória EDO TMS4C7400 . . . . . . . . . . . . . . 28
2.9 Diagrama de blocos de uma memória BEDO . . . . . . . . . . . . . . . . . 29
2.10 Diagrama de blocos de uma memória SDRAM . . . . . . . . . . . . . . . . 30
2.11 Diagrama de estados da SDRAM TMS664414 . . . . . . . . . . . . . . . . . 31
2.12 Memórias com paralelismo no núcleo . . . . . . . . . . . . . . . . . . . . . . 32
2.13 Estrutura Prefetch 2n em DDR . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.14 Elpida: Computadores pessoais e servidores . . . . . . . . . . . . . . . . . . 35
2.15 Elpida: Produtos de consumo . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.16 Elpida: Telefones celulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.17 Percurso de fabricação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.18 Curva em banheira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.19 Equipamento de teste VLSI Advantest T6682 . . . . . . . . . . . . . . . . . 39
2.20 AMD-K5 Array Access Register . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.21 Solução SOC para ADSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

xi
xii LISTA DE FIGURAS

2.22 Integração de BIST por zonas . . . . . . . . . . . . . . . . . . . . . . . . . . 42


2.23 Registo de deslocamento com realimentação linear . . . . . . . . . . . . . . 42
2.24 Instruções do porto de acesso a testes do microprocessador AMD-K5 . . . . 43
2.25 Registo de assinatura com nove entradas . . . . . . . . . . . . . . . . . . . . 43
2.26 Implementação tı́pica: BIST com colar e controlador . . . . . . . . . . . . . 44
2.27 Implementação de BIST com máquinas de estados . . . . . . . . . . . . . . 45
2.28 BIST por microcódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.29 BIST com compressão de resultados . . . . . . . . . . . . . . . . . . . . . . 46
2.30 Registo de falhas com memória CAM . . . . . . . . . . . . . . . . . . . . . . 47
2.31 IEEE1500 wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.32 Terminais de acesso a um wrapper . . . . . . . . . . . . . . . . . . . . . . . 49
2.33 Múltiplo em-BIST com bancos de fusı́veis . . . . . . . . . . . . . . . . . . . 50

3.1 Esquema de topo usado no teste do datapath . . . . . . . . . . . . . . . . . 52


3.2 Modo de escrita por controlo de chip strobe . . . . . . . . . . . . . . . . . . 53
3.3 Resultados de referência (sı́ntese XST) . . . . . . . . . . . . . . . . . . . . . 54
3.4 BIST em espelho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.5 Máquina de estados do BIST em espelho . . . . . . . . . . . . . . . . . . . . 57
3.6 Setup do Chipscope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.7 Estado inı́cial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.8 Estado final (teste 1 ou teste 2) . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.1 Acesso em paralelo ao banco de fusı́veis . . . . . . . . . . . . . . . . . . . . 62


4.2 Acesso em série ao banco de fusı́veis . . . . . . . . . . . . . . . . . . . . . . 62
4.3 Dispositivo PSRAM da Micron . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.4 Programação da frequência do DCM . . . . . . . . . . . . . . . . . . . . . . 65
4.5 Programação das saı́das do DCM . . . . . . . . . . . . . . . . . . . . . . . . 65
4.6 Módulo superior para medida de tRET . . . . . . . . . . . . . . . . . . . . . 66
4.7 Folded DRAM sense amplifier . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.8 TMU em execução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.9 Chipscope: setup de sinais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.10 Chipscope: TMU em execução . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.11 Chipscope: TMU em execução (t2) . . . . . . . . . . . . . . . . . . . . . . . 70
Lista de Tabelas

1.1 Sinais presentes na porta paralela . . . . . . . . . . . . . . . . . . . . . . . 18

2.1 Tabela de comandos da SDRAM TMS664414 . . . . . . . . . . . . . . . . . 30


2.2 DDR, DDR2, DDR3: Comparação de caracterı́sticas . . . . . . . . . . . . . 33

3.1 Comandos e pinos de controlo da memória simulada . . . . . . . . . . . . . 51


3.2 Resultados de die overhead do BIST em espelho . . . . . . . . . . . . . . . 60

xiii
xiv LISTA DE TABELAS
Lista de acrónimos

DRAM - Dynamic Random Access Memory


FPM - Fast Page Mode
EDO - Extended Data Out
BEDO - Burst EDO
SDRAM - Synchronous Dynamic Random Access Memory
DDR - Double Data Rate
SRAM - Static Random Access Memory
FRAM - Ferroelectric Random Access Memory
FCRAM - Fast Cycle Random Access Memory
DDR - Double Data Rate
QDR - Quad Data Rate
CAM - Content Addressable Memory
ROM - Read Only memory
FIFO - First In First Out
FPGA - Field Programmable Gate Array
XST - Xilinx Synthesis Technology
HAL - Hardware Abstraction Layer
SOC - System On a Chip
VLSI - Very Large System Integration
CLB - Configurable Logic Blocs
IOB - Input Output Block
DCI - Digital Controlled Impedance
DCM - Digital Clock Managers
GCLK - Global Clock (Buffer Input)
I/O - Input / Output
PCB - Printed Circuit Board
BIST - Built in Self Test
BISR - Built in Self Repair
BIR - Built in Repair
PBIST - Programmable Built-In Self-Test
mBIST - Memory Built-In Self-Test
LBIST- Logic Built-In Self-Test
AMBIST - Analog and Mixed-Signal Built-In Self-Test
CMOS - Complementary Oxide Semiconductor
SOI - Silicon on Insulator
MSLP- Mixed Signal Logic Products
ADC - Analog to Digital Converter
DAC - Digital to Analog Converter

xv
xvi LISTA DE TABELAS

PLL - Phase Locked Loop


CPU - Central Processing Unit
POST - Power On Self Test
BIOS - Basic Input Output System
ATE - Automatic Test Equipment
DFT - Design For Test
AQL - Acceptable Quality Level
TMU - Time Measurement Unit
CCC - Communications, Computers and Consumer electronics
BJT- Bipolar Junction Transistor
FET- Field Effect Transistor
JFET - Junction Field Effect Transistor
MOSFET - Metal Oxide Semiconductor Field Effect Transistor
SCR - Silicon Controlled Rectifier
IGBT - Insulated Gate Bipolar Transistor
DC - Direct Current
AC- Alternating Current
ESR - Equivalent Series Resistance
TSV - Through-Silicon Via
VIOD - Video On Demand
PVR - Personal Video Recorder
WMV - Microsoft Windows Media Video
JVM - Java Virtual Machine
AMB - Advanced Memory Bus
HPC - High Performing Computing
SOHO - Small Office Home Office
ECP - Extended Capabilities Port
LOC - Leads Over Chip
BGA - Ball Grid Array
DUT - Device Under Test
SCF - Single Cell Fail
STIL - Standard Test Interface Language
LFSR - Linear Feedback Shift Register
JTAG - Joint Test Action Group
TAP - Test Access Port
CTL - Core Test Language
WIR - Wrapper Instruction Register
WBY - Wrapper Bypass Register
WBR - Wrapper Boundary Register
CDR - Core Data Registers
WSP - Wrapper Serial Port
WSI - Wrapper Serial Input
TCSR - Temperature Compensated Self Refresh
PAR - Partial Array Refresh
Capı́tulo 1

Introdução

Muitos métodos e tecnologias utilizados na fabricação de semicondutores são baseados


em invenções com alguns séculos ou milénios, sendo o processo de crescimento de cristais
(cristal growth) um exemplo de uma invenção com mais de 2000 anos (África, margens do
lago Vitória [1]).
Nos primeiros anos da indústria de semicondutores(1960-1980), os primeiros circuitos
integrados eram produzidos em linhas de produção piloto onde não existia grande domı́nio
na maioria dos passos de produção, não existiam dados suficientes sobre as propriedades
e comportamento fı́sicos dos materiais utilizados no produto. Não existia protecção elec-
trostática eficiente e onde não existia um controlo eficiente sobre o número de partı́culas
e humidade presentes no ar.
Nesse ambiente agressivo para a tecnologia de semicondutores o rendimento produtivo
era baixo e a qualidade de produção muito deficiente.
Apesar destes problemas, o desenvolvimento de semicondutores progredia e a indústria
electrónica florescia, sustentada por um crescimento de vendas de electrónica de consumo
e por contratos milionários com o sector militar.
A rivalidade (guerra fria) existente entre a NATO e o pacto de Varsóvia fomentaram
o desenvolvimento de tecnologias de uso restrito ao sector militar, que mais tarde foram
libertadas para uso civil.
A indústria de semicondutores da União Soviética não colaborou muito no desenvolvi-
mento da microelectrónica porque se dedicava mais a actividades de reverse engineering
dos projectos de alguns fabricantes, muito inovadores nessa época (Intel, Texas Instru-
ments, Motorola). A utilização de ionizadores nas áreas de teste, e o clone perfeito do
microprocessador 8086 da Intel foram alguns dos casos mais divulgados de espionagem
industrial. Actualmente podemos consultar listas de equivalências de produtos lógicos
Soviéticos em diversas páginas [2] da World Wide Web.

1
2 Introdução

A famı́lia lógica CMOS, série 4000, foi um desses exemplos, sendo criada para resolver
os problemas de autonomia que alguns sistemas aeroespaciais tinham quando implemen-
tados com tecnologia bipolar lógica TTL.
Apesar de necessitarem de mais potência para funcionarem, as caracterı́sticas eléctricas
dos circuitos integrados bipolares eram nessa altura bastante superiores aos produtos fab-
ricados no processo CMOS. Os circuitos integrados em tecnologia bipolar eram obrigato-
riamente utilizados em projectos de sistemas de alto desempenho: circuitos lógicos com
frequências de relógio superiores a 500MHz e circuitos analógicos para amplificação difer-
encial, com slew rates superiores 500V/us, são alguns exemplos.
Famı́lias lógicas TTL, ECL e produtos MSLP em tecnologia bipolar eram obrigatoria-
mente utilizados, porque a sua integração em dispositivos ASIC era difı́cil ou impraticável.

Com o amadurecimento do processo de desenho e de produção de circuitos integrados,


a tecnologia CMOS conseguiu ultrapassar, em quase todos os parâmetros eléctricos e
económicos, a tecnologia de circuitos integrados bipolares. O baixo preço de produção, que
caracteriza os produtos CMOS, levou à quebra de preços de muitos produtos electrónicos
e a uma globalização da indústria electrónica.
O sucesso que o sistema Europeu de comunicações móveis GSM obteve a nı́vel mundial
e a explosão do número de ligações à Internet em banda larga foram alavancas para um
desenvolvimento ainda mais acelerado da tecnologia CMOS, da criação de fundições de
silı́cio (silicon foundry) e de muitas empresas de projectos em CMOS (fabless).
Os actuais ASICs em tecnologia CMOS integram microprocessadores, blocos de memória,
conversores analógico-digitais (ADC), conversores digitais-analógicos (DAC) e malhas PLL
(Phase Locked Loop), permitindo o desenvolvimento de sistemas SOC (System On a Chip).
Estes ASICs são utilizados em muitos produtos de telecomunicações e comunicações de
dados: modems xDSL, modems para cabo coaxial, telemóveis de terceira geração, redes
sem fios, sistemas de orientação por satélites (GPS), etc.
Muitos produtos e serviços que foram desenvolvidos originalmente para o sector mil-
itar (comunicações móveis, Internet e rede de pacotes, GPS) estão agora integrados em
produtos de electrónica de consumo (de linha castanha); esta integração é conhecida por
fusão CCC (computação, comunicações, e electrónica de consumo).
Neste estado de arte (state of art) tecnológico o teste final é um passo muito importante
do processo produtivo porque necessita manter ou aumentar o actual nı́vel de qualidade
em circuitos integrados, com centenas de milhão de transı́stores.
As utilização de mecanismos de BIST e BISR nos actuais e futuros circuitos integrados,
começam a ter um carácter quase obrigatório.
1.1 Built in Self Test em dispositivos de memória 3

Neste capı́tulo introdutório são apresentados os conceitos de Auto-teste integrado e de


Auto-reparação integrada em circuitos de memória.
É feita uma descrição do sistema de lógica programável, construı́do durante este tra-
balho, para implementação e simulação de mecanismos de BIST/BISR em memórias e
são apresentadas as ideias para soluções BIST/BISR que são objecto de estudo desta
dissertação.

1.1 Built in Self Test em dispositivos de memória

As funcionalidades de Built in Self Test (Auto-teste integrado) em dispositivos de


memória, são mecanismos de testabilidade que se podem adicionar em diversos nı́veis
hierárquicos (figura 1.1) de um equipamento: no circuito integrado, na placa de circuito
impresso e na placa mãe.

Figura 1.1: Nı́veis hierárquicos de BIST

Com o aumento da densidade de integração e da complexidade nos circuitos integrados,


o interesse da indústria electrónica em sistemas de Auto-teste tem vindo a aumentar
proporcionalmente.
A procura de sistemas de teste que tenham baixo custo de implementação e máxima
cobertura de teste, são os objectivos primários da inclusão de circuitos de BIST nos actuais
produtos VLSI (very large scale of integration).
Nos actuais projectos de circuitos integrados, normalmente dividem-se os projectis-
tas em diversos grupos de projecto: fonte de alimentação com regulação LDO (low drop
output), conversores AD e DA, interface de E/S, sistema de memória, projecto digital,
package, etc.
Normalmente estes grupos necessitam apenas de saber pequenos detalhes dos blocos
que vão ser ligados ao que estão a desenhar, com a excepção do grupo de desenho para o
teste (DFT).
A integração de mecanismos BIST em circuitos integrados obriga que o DFT conheça
todos os blocos com grande detalhe, decida que alterações deve introduzir no CUT (figura
4 Introdução

1.2) e escolha a estratégia que garanta os melhores resultados de AQL (acceptable quality
level ).

Figura 1.2: Integração do BIST no dispositivo

Devido a algumas questões de acréscimo de área de silı́cio e de layout do circuito


integrado, não é muito comum a integração de sistemas BIST em memórias discretas
(DRAM, SRAM, flash).
No caso especı́fico das memórias dinâmicas utilizadas neste trabalho (HY514400) não
existe BIST integrado nestes dispositivos, mas existe um modo de teste que permite testar
o dispositivo na máxima largura de dados, para diminuir o tempo de endereçamento e de
teste.
Este modo de teste utiliza um XOR para combinar os resultados dos dois blocos que
são testados em paralelo; esta técnica também é utilizada para agregar num pino de dados
(d0 por exemplo) as saı́das dos outros pinos de dados e assim reduzir o número de canais
utilizados no equipamento ATE (automatic test equipment), o que permite testar mais
dispositivos em paralelo e aumentar a produtividade na área de teste final.
Ao nı́vel da placa de circuito impresso (PCB) existem módulos do tipo fully buffered
dimm que possuem BIST no controlador AMB (figura 1.3).

Figura 1.3: NEC uPD720900 Advanced Memory Buffer


1.2 Built In Self Repair em dispositivos de memória 5

Relativamente ao nı́vel de sistema, o Auto-teste inicial POST (Power On Self Test)


está quase sempre incluı́do na maioria dos actuais equipamentos com microprocessadores,
possuindo alguma eficácia na detecção de falhas. Os sistemas de POST, presentes nos
actuais computadores pessoais, são exemplos da grande eficácia do BIST, onde podemos
observar relatórios completos de falhas, ou alguns avisos sonoros (quando as falhas surgem
em zonas necessárias ao boot normal).
Em memórias integradas nos microprocessadores (caches) e em circuitos de aplicação
especı́fica (ASIC), a utilização de sistemas BIST é quase obrigatória, devido à frequente
falta de acesso directo aos terminais da memória existente no dispositivo. Normalmente
existem nestes dispositivos registos de resultados e de comando para os sistemas BIST
integrados, que são utilizados pelo fabricante no teste final destes dispositivos.

1.2 Built In Self Repair em dispositivos de memória


Built In Self Repair (BISR) em dispositivos de memória [3], são mecanismos de recon-
figuração estrutural que permitem a desactivação (figura 1.4) ou substituição de sectores
do circuito onde existam falhas.
Os esquemas de reconfiguração BISR também podem ser designados ou divididos por
BIR (Built-in repair ), reparação por laser, reparação eléctrica; mas na realidade existem
dois mecanismos de reparação BISR por redundância : soft repair and hard repair.
Soft repair é um mecanismo reversı́vel (registos, flash) e o hard repair é um mecanismo
irreversı́vel (fusı́veis e antifusı́veis).

Figura 1.4: MoSys: 1T-SRAM BISR com auto-configuração por BIST

A utilização de mecanismos BISR permite testar e recuperar circuitos integrados na


fase de produção, ou mesmo quando já estão implementados no cliente final [3].
6 Introdução

O mecanismo ideal de BISR teria a capacidade de substituir uma única célula com
problemas por outra do bloco de redundância. Na prática tal resolução de reparação não
é viável e as soluções que existem utilizam granularidades por segmentos, linhas, palavras
divididas (figura 1.5), colunas, blocos, etc.

Figura 1.5: BISR: granularidade por palavra dividida (DWL)

As soluções de BISR utilizadas nas DRAM actuais são bastante complexas e versáteis.
Ocupam alguma área de silı́cio na espinha dorsal da DRAM e a sua eficiência é avaliada
pela capacidade “milagrosa” de produzir um yield superior a 50% em bolachas de silı́cio
onde esse valor é 0% antes da reparação BISR ser efectuada.
Os defeitos no óxido de silı́cio provocam muitas falhas SCF (single cell fails) e, se o
fabricante utilizar uma granularidade demasiado elevada no mecanismo de redundância,
pode correr o risco de algumas SCF estarem presentes nos blocos que iriam ser utilizados
na reparação.
Na figura 1.6 podemos verificar que a granularidade é demasiado elevada, o que provoca
desperdı́cio de células e o aparecimento de blocos redundantes com falhas.
1.2 Built In Self Repair em dispositivos de memória 7

Figura 1.6: BISR: granularidade por bloco

Técnicas de hard repair e de downgrade


Nos produtos mais recentes de memória existem linhas e colunas redundantes na matriz
de células, para utilização durante as fases de reparação na bolacha de silı́cio e na reparação
em produtos encapsulados.
Este mecanismo de redundância necessita da utilização de equipamentos exteriores
(lasers, ATE) para se realizar a reparação.
Nestas fases de recuperação é vulgar realizar um downgrade do dispositivo: capacidade
nos produtos de memórias discreta, paralelismo em microprocessadores.
Na actualidade, podemos adquirir microprocessadores com 3 núcleos (de processa-
mento), que são fabricados utilizando dies de quatro núcleos, com falhas localizadas num
dos quadrantes das caches. Nos anos 80 era vendido um computador (o famoso Sinclair
ZX Spectrum) que, nas versões com 48K bytes de memória possuı́a um banco extra de 32K
bytes constituı́do por 8 circuitos integrados de 32 kbit. Estes circuitos integrados de 32K
eram fabricados por downgrade de dispositivos de 64K com problemas num dos bancos.
8 Introdução

1.3 Apresentação dos objectivos e da metodologia utilizada


As principais vantagens e desvantagens da utilização de mecanismos de BIST/BISR
em memórias são referidos num grande número de artigos técnicos, livros, dissertações e
teses de doutoramento.
Tendo em conta estas vantagens e desvantagens e, procurando obter a máxima cober-
tura de teste, está descrito nesta dissertação o trabalho realizado sobre um mecanismo de
BIST e um sistema de BISR.

1.3.1 BIST por espelho de falhas


Objectivamente foi tentado desenvolver um mecanismo BIST de grande simplicidade,
para não provocar demasiado overhead na área do circuito integrado.
Esta estratégia de Auto-teste é sustentada no aumento das capacidades de processa-
mento paralelo, que caracterizam as actuais unidades de processamento central (CPU)
utilizadas em computadores, sistemas gráficos de consolas de jogos, sistemas de televisão
digital, etc.
Este mecanismo de BIST em espelho foi projectado para ser integrado em dispositivos
de memória que possuam estruturas prefetch (figura 1.7) e sistemas de reparação integrada
(BIR).

Figura 1.7: Arquitectura interna de memórias DDR2

A duplicação do número de células de armazenagem, a utilização de células com 4F2


de área e a produção de dispositivos, utilizando tecnologias inferiores a 45 mm, vão causar
um aumento da taxa de falhas e aumentar o tempo de teste da matriz.
1.3 Apresentação dos objectivos e da metodologia utilizada 9

Paralelamente sabemos que é impossı́vel integrar uma cobertura total de teste para
os modelos de falha conhecidos e que a cobertura mais eficiente para detecção de falhas é
realizada no produto final (test at the application).
Partindo dessa realidade, o mecanismo de BIST em espelho, desenvolvido neste tra-
balho, tira proveito do paralelismo existente nos actuais produtos DDR/DDR2/DDR3/XDR
e em sistemas de microprocessadores multicore.
Esta solução de BIST foi desenvolvida e simulada para ser integrada nos percursos da
espinha dorsal do dispositivo, em particular na zona entre o multiplexador de prefetch e a
matriz de memória(ver figura 1.7).

Figura 1.8: Mecanismo de BIST em espelho de falhas

A integração de BIST em espelho, associado a um BISR por reconfiguração de BIR,


permite criar uma nova classe de produtos e um novo percurso de produção e teste, para
dispositivos não reparados e sem teste total da matriz de memória.
O BIST em espelho permite retirar os custos de reparação por laser e reduzir o tempo
de teste da matriz, recuperar alguns tipos de falhas sem reparação possı́vel por redundância
(laser ou antifusı́veis) e criar dispositivos de memória de baixo custo para aplicações não
criticas.
Esta nova classe de produto será adicionada às diversas classes de produtos que existem
actualmente: temperatura estendida (industrial, militar), protegidas contra radiações e
soft errors, baixo consumo, etc.
O teste desta nova classe de dispositivos inclui todos os testes básicos e de velocidade,
mas os dispositivos devem ser escolhidos de populações, sem defeitos em algumas linhas
iniciais dos blocos, para fornecer ao BIST em espelho uma área inicial de registo de falhas.
Os passos tı́picos de teste na bolacha para produzir este tipo de unidades serão: teste e
escolha (cherry picking) dos dies sem falhas nas linhas iniciais, registo por laser do número
de série do die e do número de segmentos (ou linhas) sem falhas.
Como nesta classe de dispositivos a matriz de memória não é testada totalmente, o
tempo de burnin com teste pode ser reduzido.
10 Introdução

A dimensão da área pré-testada será calculada com base na taxa de falhas da matriz:
um determinado dispositivo de memória que tenha em média 10% de endereços com falhas,
necessita de um sector de arranque testado nessa dimensão.
Quando o BIST é accionado no produto final, o número de blocos iniciais sem falhas,
vai ser utilizado para carregar o contador de paragem do bloco de referência (ver flag
AdMax na fonte em Verilog).

Esta solução de BIST utiliza partes de memória convencional para guardar os endereços
que falharam, o controlador de BIST utiliza a arquitectura em espelho dos quatro (ou oito)
blocos de memória existentes nas memórias DRAM DDRx, para registar no primeiro bloco
testado (sem falhas) as posições de memória que falharam no bloco oposto.
Na figura 1.8, podemos ver que o controlador de BIST vai ficar integrado no bloco de
I/O gating, que é a zona que permite integrar este tipo de BIST sem grande intrusão nos
percursos existentes.
Nos actuais dispositivos DRAM, a matriz é dividida teoricamente em X linhas e Y
colunas, mas na prática, são divididas em palavras com um número de bits que depende
da arquitectura de saı́da (x4, x8, x16).
Este sistema de BIST pode ser dividido em micro unidades (figura 1.9), de forma que
a matriz a testar seja simétrica (quadrados com o mesmo número de linhas de dados e
endereços) para utilizar um endereço por falha, ou então, distribuir o endereço de falha
com Z bits por Z/n posições no bloco de memória (com largura n) que está a ser utilizado
para registar os endereços em falha.

Figura 1.9: Micro unidades BIST em espelho

Numa configuração simétrica, e no caso catastrófico de todos os endereços falharem


os testes de BIST, a memória de resultados iria ser ocupada, na totalidade, com todos os
endereços de falha.
Os resultados do BIST possuem um indicador de falha (BIST fail flag) e, nos casos em
que existem falhas (de um a todos os endereços), o CPU acede após o BIST, ao bloco de
resultados para construir um mapa de endereços em falha, que serão protegidos de serem
acedidos, por mecanismos de protecção de memória do CPU.
1.3 Apresentação dos objectivos e da metodologia utilizada 11

O bloco espelho de falhas deve ser carregado com zeros, para funcionar como indicador
de último endereço com falha.
Os endereços em falha podem ficar registados no disco duro ou numa memória flash
(presente na actual geração de computadores com Windows Vista) e serem utilizados e
descartados em operações de recuperação BISR, ou então serem utilizados em mecanismos
de protecção de memória do microprocessador.

1.3.2 BISR por granularidade e por refrescamento adaptativo


BISR por granularidade:
Esta solução é baseada na existência de linhas e de colunas redundantes na matriz de
células, com uma granularidade cujo valor é mantido em segredo pela maioria dos fabri-
cantes. A implementação é trivial e consiste na colocação de lógica cablada wired logic nos
circuitos de comando definitivos de fusı́veis e de antifusı́veis. Teoricamente seria necessário
adicionar um registo por cada transı́stor que fosse colocado em lógica cablada, mas na
prática o cenário é diferente, porque existem limitações de espaço na colocação de fusı́veis
para correcção laser e os antifusı́veis são elementos que não podem ser colocados muito
juntos porque possuem circuitos auxiliares de detecção do seu estado (os antifusı́veis em
silı́cio estão muito longe de serem um componente ideal). O bloco lógico de descodificação
de endereços existente nos actuais dispositivos DRAM é projectado pelo fabricante para
ter a granularidade suficiente para recuperar o Yield in the wafer para valores que permi-
tam vender os dispositivos sem perder dinheiro. Este bloco é programado normalmente
pelas linhas de endereços e pela configuração de fusı́veis e antifusı́veis. Com esta solução
BISR, o mecanismo BIR presente no die pode ser programado pelos registos de reparação,
com uma granularidade menor que a dos fusı́veis e antifusı́veis.

BISR por refrescamento adaptativo:


Esta solução BISR consiste na utilização de controladores de refrescamento programáveis
distribuı́dos pela matriz de memória. A utilização desta solução BISR é restrita a memórias
do tipo PSRAM (Pseudo Static RAM) que utilizam controladores PAR (Partial Array
Refresh) de refrescamento integrado e um controlador TCSR (Temperature Compensated
Self Refresh) para o modo standby.
A variação da frequência de refrescamento, em zonas da matriz onde existam células
com problemas de retenção, pode permitir a recuperação de falhas SCF (Single Cell Fails)
e complementar os existentes mecanismos de reparação por substituição (redundância).
Nesta dissertação foi idealizado uma unidade de medida de tempo de retenção, para car-
acterizar a retenção em posições de memória, com falhas SCF.
12 Introdução

1.3.3 Apresentação da metodologia utilizada


Os sistemas BIST e BISR desenvolvidos nesta dissertação foram simulados e imple-
mentados utilizando um sistema de lógica programável (figura 1.4) contendo memórias
discretas (estáticas e dinâmicas) e foram utilizados métodos Semicustom para projecto
de circuitos integrados ASIC, com o objectivo de verificar a área adicional (die overhead )
introduzida.
Os relatórios de resultados de sı́ntese do ambiente ISE da Xilinx, utilizando o XST
(Xilinx synthesis technology), também são utilizados para este cálculo.
Neste trabalho de desenvolvimento Semicustom foi utilizado o ambiente de desenvolvi-
mento ISE para criação dos módulos em linguagem Verilog. Estes módulos foram testados
na FPGA utilizando uma segunda porta paralela para simular o acesso entre os blocos
de memória e os registos DDR e foi utilizado o software Xilinx Chipscope [4] em alter-
nativa ao normal sistema de simulação com bancadas de teste (testbenches) em Verilog
comportamental.
Finalmente as soluções BIST foram implementadas em tecnologia CMOS 350nm, uti-
lizando o Synopsys Design Compiler [5] e realizada uma sı́ntese fı́sica com o Cadence SOC
encounter [6] .
1.4 Descrição do sistema de lógica programável 13

Figura 1.10: Kit livedesign da Altium

1.4 Descrição do sistema de lógica programável

Nesta dissertação foi desenvolvido um sistema para implementação e simulação de


mecanismos de BIST/BISR em memorias sı́ncronas.
O sistema foi construı́do utilizando por base um kit live design (figura 1.10) da Al-
tium, integrando uma FPGA Spartan-3 da Xilinx, dois dispositivos de memória estática
256K(x16) e vários periféricos de entrada e saı́da (não utilizados).
A FPGA (XC3S400) utilizada neste kit possui 896 blocos de lógica configurável (CLB)
equivalente a um ASIC com 400.000 gates e 264 pinos para utilização como I/O (en-
trada/saı́da); das 264 linhas de I/O este kit apenas disponibiliza 34 linhas em dois conec-
tores, utilizando as restantes linhas nos muitos periféricos existentes, na placa de circuito
impresso (PCB). Este problema de falta de linhas foi ultrapassado com a desactivação de
5 dos 6 displays de 7 segmentos, disponibilizando assim mais 40 linhas necessárias para
a implementação de uma placa irmã (figura 1.13) com 4 canais de memória dinâmica
registada.
No kit live design existem dois dispositivos de memória estática de alta velocidade
Samsung K6R4016V1D que permite uma cadência máxima de leitura (figura 1.11), de 100
Mega palavras por segundo (tRC=10ns).
Este dispositivo possui um barramento de dados com 16 bits de largura, mas a sua
14 Introdução

Figura 1.11: Diagrama de um modo de leitura da SRAM K6R4016

arquitectura interna (figura 1.12) que permite que se liguem em paralelo os bits com o
mesmo peso, “dobrando” a meio o barramento de dados para utilização em sistemas de 8
bits. Os sinais de controlo UB* e LB* permitem colocar as suas linhas de dados em estado
de alta impedância.

Figura 1.12: Arquitectura da SRAM K6R4016

O kit possui um oscilador de 50 MHz implementado com um inversor CMOS (SN74LV04),


numa configuração do tipo Pierce. Este oscilador funciona com um cristal sintonizado no
terceiro harmónico da frequência fundamental, como é normal para valores de frequência
superiores a 25 MHz. Acima dos 25 MHz, os osciladores de quartzo são projectados
utilizando cristais sintonizados na terceira, quinta, ou sétima frequência harmónica. As
principais razões para não se utilizarem cristais “cortados” para frequências fundamentais,
superiores a 25 MHz, são: a robustez (o substrato cristalino fica demasiado fino e frágil),
1.4 Descrição do sistema de lógica programável 15

o comportamento térmico (o cristal fica mais sensı́vel às variações de temperatura) e o


aging (sofre grandes variações de frequência com o envelhecimento).
Podemos ver no apêndice A.1 o esquema eléctrico deste oscilador, com a tı́pica re-
sistência de polarização (R112), colocando a entrada da gate numa zona linear. O circuito
ressonante C31/C32/L1 está sintonizado numa frequência ligeiramente inferior ao terceiro
harmónico e o condensador C30 é utilizado no isolamento da corrente contı́nua no pino 4
de U3B.
A ligação deste oscilador à FPGA é feita por uma resistência de adaptação de 47 Ohm
(R122), utilizando um pino tipo GCLK da Spartan-3 (bola AA12).
Na placa de circuito impresso deste kit estão implementados três reguladores de tensão
baseados no LM1084, que fornecem à FPGA as tensões necessárias para o seu funciona-
mento normal: 2.5V para a alimentação dos DCM (VCCAUX), 1.2V para alimentação do
core(VCCINT) e 3.3V para a alimentação e setup LVTTL dos IO (VCCO).
Existe neste kit uma interface JTAG (U1) compatı́vel com o cabo parallel III da Xilinx,
limitado a 200 KHz na velocidade de captura de dados com o software Chipscope.
Foi escolhido o kit de desenvolvimento live design devido a este utilizar uma FPGA
com algumas caracterı́sticas muito úteis para este sistema: IOB com suporte para DDR,
dezoito tipos de sinais single ended (incluindo LVCMOS33 e LVTTL) e oito tipos de sinais
diferenciais (incluindo LVDS). Muitas destas caracterı́sticas são inferidas automaticamente
utilizando o ambiente ISE/Webpack da Xilinx, ou manualmente utilizando sı́mbolos ou
Verilog.
Este kit é alimentado por uma fonte de alimentação exterior de 5V contı́nuos (3A) de
tecnologia comutada (switching), partilhando esta tensão com a sister board (figura 1.13)
com 4 Megabytes de memória dinâmica.

Figura 1.13: Sister board com 4 Mega Bytes de DRAM


16 Introdução

Esta placa auxiliar foi projectada com o objectivo de permitir operações em quatro ban-
cos, leitura de 32 bits em simultâneo, utilização de paralelismo para operações BIST/BISR
e comunicações de dados com o PC utilizando uma segunda porta paralela (IEEE1284).
Esta placa utilizou as 34 linhas de I/O presentes nos conectores HDR1/HDR2 e 40
linhas que eram utilizadas pelos displays DS1 a DS5.

Figura 1.14: Módulo SIM 30 pinos, com 1 MegaByte

Os barramentos de dados dos quatro módulos SIM de 30 pinos (figura 1.14) estão
ligados independentemente à FPGA utilizando 32 IOs. Porém devido a estes utilizarem
sinalização TTL, foram instalados divisores resistivos (R1, R2, R6, R7, R11, R12, R16,
R17) para não se exceder os 4.4V de tensão máxima permitida pela FPGA nas suas
entradas, e colocar alguma limitação de corrente nos conflitos neste barramento entre a
memória e a FPGA (bus contention).
As dez linhas de endereços destes módulos SIM partilham os mesmos IOs da FPGA
utilizando latches transparentes (74HC373N) para adaptação, registo de sinais (e evitar o
uso de mais 26 linhas de IO).
Nesta sister board (figura 1.13) foram utilizadas latches transparentes SN74HC373 no
barramento de endereços dos quatro módulos SIM para adaptar os sinais de lógica LVTTL
da FPGA, e partilha de I/O para as dez linhas de endereços destes módulos.
No projecto desta placa foi instalado um condensador de desacoplamento por circuito
integrado, cujo valor foi calculado para uma corrente transitória de 3V/2ns e 30pF por
pino.

Utilizando as equações:

dv
T ransitory : I = C. (1.1)
dt
dt
F ilter : C = I. (1.2)
dv

foi obtido um valor de 64nF, que foi arredondado para os clássicos 100nF. Escolheram-
se condensadores de baixo ESR, com dieléctrico de poliéster e com tensão nominal de
100V.
1.4 Descrição do sistema de lógica programável 17

Figura 1.15: Vista lateral do sistema de desenvolvimento

A placa irmã ficou colocada sob a placa do kit (figura 1.15) tentando minimizar a
distância das ligações entre os pinos I/O da FPGA e os quatro módulos de memória
dinâmica.

Foi implementada na sister board uma porta paralela (tabela 1.1) com capacidades de
funcionar em modo ECP, utilizando um registo para escrita e leitura de dados (endereço
0x378), um registo de estado/status (endereço 0x379) e um registo de controlo no endereço
0x37A. O bit 5 do registo de controlo é utilizado para permitir a bidireccionalidade da
porta paralela.

Figura 1.16: DLL inpout32.dll


18 Introdução

Devido ao facto de a camada HAL (Hardware Abstraction Layer ) nos sistemas oper-
ativos Windows com tecnologia NT (W2K, XP, Vista) não permitir o acesso directo aos
recursos de hardware, foi utilizada uma biblioteca dinâmica inpout32.DLL (figura 1.16) ex-
istente na Internet [7] como alternativa à utilização de um Device Driver, ou à instalação
de um sistema operativo sem HAL (MS-DOS, Windows9x, etc.)
O ficheiro inpout32.DLL tem integrado um driver que é instalado em modo de ker-
nel nas versões de Windows com HAL, permitindo acessos directos de leitura e escrita
utilizando as funções inp32 e out32.

Tabela 1.1: Sinais presentes na porta paralela


Pino(DB25) Nome sinal Direcção Registo Inversão
1 nStrobe O controlo0 sim
2 data0 IO dados0 não
3 data1 IO dados1 não
4 data2 IO dados2 não
5 data3 IO dados3 não
6 data4 IO dados4 não
7 data5 IO dados5 não
8 data6 IO dados6 não
9 data7 IO dados7 não
10 nAck In status6 não
11 Busy IO status7 sim
12 PaperOut In status5 não
13 Select IO status4 não
14 Linefeed IO control1 sim
15 nError IO status3 não
16 nInitialize IO control2 não
17 nSelect IO control3 sim
18-25 Gnd

1.5 Roteiro das próximas secções


No capı́tulo dois é feita uma breve descrição da história do fabrico de dispositivos de
memória e são apresentados os dispositivos de memória mais utilizados na indústria de
computadores.
São descritos alguns detalhes sobre sistemas de teste para dispositivos de memória,
tentando apresentar os principais problemas que afectam a fabricação de produtos de
memória.
Nos capı́tulos três e quatro estão descritos os mecanismos BIST e BISR desenvolvidos
nesta dissertação; e no último capı́tulo são apresentadas a conclusões do trabalho realizado.
Capı́tulo 2

Dispositivos de memória: evolução


e fabrico

Neste capı́tulo é feita uma breve apresentação sobre a evolução tecnológica dos produ-
tos de memória, é descrito o percurso dos fabricantes que foram marcos nesta indústria,
são descritos os dispositivos de memória CMOS volátil utilizados em produtos CCC e são
apresentados os principais problemas que afectam os dispositivos de memória fabricados
com tecnologias CMOS inferiores a 100nm. No final deste capı́tulo, o processo de teste
de memórias é descrito e são apresentados os principais métodos de DFT utilizados em
dispositivos de memória.

2.1 Electrónica em estado sólido

A invenção da electrónica em estado sólido permitiu uma substituição gradual das


válvulas termiónicas por transı́stores de silı́cio (ou germânio) em todos os equipamentos
electrónicos. O transı́stor permitiu que na indústria de computadores fossem substituı́das
as válvulas como componentes primários das unidades de processamento central (CPU),
permitiu abandonar tecnologias de memória com muitas limitações (relés, linhas de atraso
em mercúrio, ferrites) e expandir as capacidades de memória dos computadores para di-
mensões bastante superiores às mil palavras de doze caracteres do Univac-1 [8].
Após um grande sucesso da tecnologia “solid state” de semicondutores em germânio, a
migração para a tecnologia de semicondutores em silı́cio permitiu ultrapassar as limitações
de temperatura e corrente que caracterizavam o germânio, desenvolver componentes mais
potentes e fiáveis e criar novos tipos de transı́stores e dı́odos: tirı́stores DC (SCR), tirı́stores
AC (TRIAC), transı́stores unijunção, transı́stores JFET, transı́stores MOSFET, dı́odos e
transı́stores Schottky, dı́odos AC (DIAC), dı́odos Varicap, dı́odos de efeito túnel, etc.

19
20 Dispositivos de memória: evolução e fabrico

Paralelamente ao desenvolvimento da tecnologia de semicondutores em silı́cio, foi in-


ventado o circuito integrado pelas empresas Texas Instruments (TI) e Fairchild, e começaram-
se a produzir as primeiras memórias em tecnologia bipolar (RAM, ROM, EEPROM).

2.2 Fabricantes de memórias em tecnologia CMOS

O aparecimento das primeiras memórias em tecnologia MOS (e CMOS) ocorreu nos


EUA com a Intel, aparecendo alguns meses depois os primeiros concorrentes; a Mostek,
AMD e Motorola. A entrada dos gigantes japoneses da electrónica (Toshiba, Hitachi,
Fujitsu e NEC) no mercado de memórias fez com que alguns fabricantes americanos (Intel,
AMD e Motorola) desistissem de produzir memórias para se focarem na produção de
microprocessadores para o mercado em grande expansão dos computadores pessoais (IBM
e Macintosh).
Nos anos 80, mais de 50% da cota de mercado das memórias era possuı́do pelas em-
presas japonesas Toshiba, Fujitsu, Hitachi e NEC, e a restante fatia pelas americanas TI
e Micron.
A entrada neste mercado do fabricante europeu Siemens, e dos sul-coreanos Samsung
e Hyundai provocou uma grande deflação nos preços de venda e em menos de 10 anos,
estes três fabricantes apropriaram-se de mais de metade da cota de mercado (situação em
2008), destronando os fabricantes japoneses e norte americanos.

Figura 2.1: Cota de mercado: Memórias CMOS vs Circuitos integrados


2.2 Fabricantes de memórias em tecnologia CMOS 21

2.2.1 Instabilidade e deflação de preços


A instabilidade e a deflação de preços são as principais caracterı́sticas da indústria
das DRAM e flash, onde ocorrem regularmente perı́odos com enorme crescimento de ven-
das(figura 2.1) e alguma falta de inventário, seguidos por inesperados perı́odos de es-
tagnação e excesso de inventário [9].

Esta dinâmica provocou uma autêntica lei da selva nesta indústria ocorrendo com reg-
ularidade algumas situações muito melindrosas: concertação de preços entre fabricantes,
apoio financeiro do governo Coreano, embargo da UE à Hynix, litı́gios sobre roubo de
propriedade intelectual, headhunting dos recursos humanos da concorrência, etc.
O desaparecimento dos produtos de memória da Intel e da Mostek chocou o mercado
tecnológico nos anos 80, mas desde 1994 têm ocorrido numerosas desistências e fusões; eis
uma pequena lista das ocorrências mais divulgadas:

• A Texas Instruments vendeu o sector de produção de DRAM á Micron (MTI).

• A Qimonda é criada de um spinoff da Infineon (antiga Siemens semiconductor).

• Surge a Hynix de uma fusão entre a Hyundai e a LG.

• A Elpida surge com a fusão de fábricas de DRAM da Hitachi e da NEC; e mais tarde
absorve o sector DRAM da Mitsubishi.

• Foi criado um acordo de desenvolvimento de novos produtos entre a Toshiba e Fu-


jitsu, mas ambas desistem de produzir DRAM e iniciam a produção de memórias
ferroeléctricas (FRAM) e de ciclo rápido (FCRAM).

• A intel e a ST criam a Numonyx com os seus sectores de produção flash.

• Surge a Renesas da fusão da Hitachi e Mitsubishi, na produção de SRAM, ASICS e


microprocessadores.

• A Micron e Nanya criaram uma joint venture para desenvolvimento e produção de


DRAM em tecnologias inferiores a 50nm.

• A Qimonda e a Elpida assinam um acordo para o desenvolvimento de memórias


dinâmicas utilizando tecnologia buried wordline com células 4F2 em tecnologia 40nm
e de investigação de aplicações para a tecnologia TSV.

• ProMOS de Taiwan e a Hynix assinam em Maio 2008 um acordo de tecnologia e


fabricação.
22 Dispositivos de memória: evolução e fabrico

Figura 2.2: Dispositivos de memória CMOS

2.2.2 Perspectivas de crescimento


O mercado de memórias para computadores pessoais e servidores continua a ser o sector
onde se consomem mais Giga Bytes, mas com o aumento da densidade dos dispositivos
(em 2011 está previsto o aparecimento de dispositivos single die com 8Gbit) o número de
dispositivos vendidos neste mercado poderá diminuir.
Quase todos os fabricantes estão a diversificar a oferta de dispositivos de memória
(figura 2.2), com produtos de baixo consumo, e memória gráfica (GDDR-x, XDR).
Na actual revolução digital (ou fusão CCC) está a verificar-se o aparecimento de
equipamentos que necessitam de grande número de dispositivos de memória dinâmica
e de memória não volátil:

• PDAs com acesso à Internet por Wimax, VoIP, jukebox de vı́deo e áudio digital,
recepção de DVB-H e GPS.

• Discos duros em estado sólido (SSD).

• Consolas de jogos de alta definição (1080P)

• NAS com funções de PVR (Mpeg-4, WMV-HD e H264).

• plasmas e LCDs de alta definição com gravação de vı́deo integrada.

• Sistemas de IPTV com funções de PVR, VIOD e Internet browsing com jogos em
flash e Java.

• Leitores de livros electrónicos (e-books readers).


2.2 Fabricantes de memórias em tecnologia CMOS 23

Resumo:
O mercado das DRAM é muito instável, mas existem vários produtos CCC em franca
expansão que vão consumir bastantes dispositivos de memória e, a médio prazo, poderão
trazer mais estabilidade na relação entre a oferta e a procura. A curto prazo e utilizando
os actuais processos CMOS no desenvolvimento de produtos de memória, a decisão de
incluir mecanismos eficazes de BIST/BISR nesses dispositivos é um dos factores mais
determinantes para se obter Yields elevados e manter maiores margens de lucro na venda
destes produtos.
24 Dispositivos de memória: evolução e fabrico

2.3 Arquitecturas de memória


Nas primeiras décadas da indústria informática, a dimensão da memória disponı́vel nos
computadores era muito limitada pela tecnologia utilizada (relés, válvulas, linhas de atraso
em mercúrio, ferrites e transı́stores discretos), dimensionada pelo tipo de aplicação final
(eleições, calculo de trajectórias balı́sticas, etc.) e escalável no número de armários (racks).

Com a utilização de memórias em tecnologia CMOS nos actuais computadores, o au-


mento da dimensão da memória ficou relacionada com a famosa ”lei de Moore [10]”, que
descreve a duplicação do número de transı́stores presentes nos circuitos integrados em
perı́odos de 18 ou 24 meses (figura 2.3). Esta lei tem como base a evolução dos micro-
processadores da Intel, que são os principais responsáveis pelo aumento da dimensão e
do número de blocos de memória presentes nos actuais computadores. A necessidade de
redução do bottleneck que existe entre os bancos de memória integrada no microproces-
sador (cache) e os bancos de memória externa (dinâmica), provoca que uma tecnologia
de memória dinâmica possa ser abandonada precocemente com a simples introdução de
novos chipsets north-bridge.

Figura 2.3: Lei de Moore


2.3 Arquitecturas de memória 25

2.3.1 Memórias DRAM assı́ncronas


A primeira memória DRAM comercial com estrutura 1C1T assı́ncrona foi a I1103
(1024x1) desenvolvida pela Intel e disponibilizada em 1970, mas o primeiro dispositivo de
memória DRAM assı́ncrona com linhas de endereço multiplexadas foi a Mostek MK4096
(4096x1).
Nos anos 80, a Texas Instruments possuı́a uma grande variedade de dispositivos DRAM
fabricados em tecnologia N-MOS (canal N) com gates de polisilı́cio.
O dispositivo SMJ4164 (figura 2.4) de 65536 endereços com 1 bit possuı́a uma estrutura
interna tı́pica neste tipo de memórias - dois blocos de 32K simétricos.

Figura 2.4: SMJ4164: estrutura interna

As entradas de endereços (A0..A7) são desmultiplexadas para descodificação de linhas


(row ) e descodificação de colunas que activam os respectivos sense amplifiers das células
1C1T.
26 Dispositivos de memória: evolução e fabrico

Devido a esta estrutura interna da matriz, existem restrições temporais (figura 2.5) de
acesso que têm que ser respeitadas entre as fases de desactivação, acesso a linha e acesso
a coluna.
Os parâmetros tRP(ta(c)), tRCD(tRLCL), tdis(ch) e tw(ch) definem respectivamente:
atraso do RAS para CAS, tempo de acesso aos dados pós CAS, tempo de atraso para alta
impedância, e tempo de desactivação (emphprecharge time.
Do ponto de vista de projecto as memórias dinâmicas exigem controladores de memória
complexos, mas a sua densidade e preço por bit compensam as muitas desvantagens que
possuem.

Figura 2.5: SMJ4164: ciclo de leitura

2.3.2 Memórias DRAM assı́ncronas com paginação rápida


A paginação rápida (FPM) em memórias DRAM assı́ncronas foi o primeiro passo da
actual evolução do aumento da largura de banda, que as DRAM necessitam fornecer aos
processadores mais actuais. O modo FPM consiste na supressão da necessidade de repetir
o sinal de RAS (figura 2.6) quando o endereço de linha se mantém inalterado.
2.3 Arquitecturas de memória 27

Figura 2.6: Ciclo de leitura em modo de paginação rápida

Nesta geração de memórias começaram a serem incluı́das algumas facilidades que se uti-
lizam nos actuais produtos de memória: controlador de refrescamento automático (figura
2.7), auto-refrescamento com oscilador RC integrado e reconfigurações de matriz para
modos de teste.
A utilização de DRAM-FPM expandiu-se com a introdução dos processadores de 32bits
80386/80486 da Intel no mercado de computadores PC. Foi nesta geração de computa-
dores pessoais que começou a leitura e gravação de áudio e vı́deo em formatos MPEG e
que surgiram os primeiros problemas de largura de banda da memória que limitavam a
resolução de digitalização.
28 Dispositivos de memória: evolução e fabrico

Figura 2.7: Diagrama de blocos da memória FPM HY514400

2.3.3 Memórias DRAM assı́ncronas com paginação rápida EDO


Nas memórias DRAM assı́ncronas, com paginação rápida EDO (extended data out),
existe uma latch na saı́da dos sense amplifiers que mantém a saı́da de dados nos IOs
permitindo acelerar o ciclo de precharge. Por questões de rentabilidade, as memórias FPM
utilizavam o mesmo die das EDO, porque existiam bonding pads com acesso ao datapath
anterior à latch da EDO (figura 2.8). O modo EDO era 5% mais rápido que o modo FPM.

Figura 2.8: Diagrama de blocos da memória EDO TMS4C7400


2.3 Arquitecturas de memória 29

2.3.4 Memórias DRAM assı́ncronas com paginação rápida BEDO


As memórias Burst EDO (BEDO) foram o último fôlego da utilização de dispositivos
assı́ncronos em PCs, a função burst permitia reduzir o envio de endereços de coluna porque
existia um contador de endereços (figura 2.9) para este tipo de auto-endereçamento.
Este tipo de memória não teve grande penetração no mercado porque surgiu quase em
paralelo com a SDRAM.

Figura 2.9: Diagrama de blocos de uma memória BEDO


30 Dispositivos de memória: evolução e fabrico

2.3.5 Memórias dinâmicas sı́ncronas (SDRAM)


Com a introdução das memórias dinâmicas sı́ncronas (SDRAM) iniciou-se um novo
ciclo de desenvolvimento de produtos de memória. Baseadas no paralelismo interno
(figura 2.10) e integrando um controlador implementado numa máquina de estados, estas
memórias retiraram alguma lógica dos controladores de memória e tornaram as operações
de transferências entre as DRAM e as L3 cache dos CPUs mais eficazes.

Figura 2.10: Diagrama de blocos de uma memória SDRAM

As SDRAM tinham como caracterı́sticas principais serem alimentadas por 3.3V com
sinalização LVTTL, menor consumo, a organização em quatro bancos permitia “esconder”
os tempos de acesso aos blocos individuais, bursts programáveis de 1/2/4/8 colunas por
linha, sequência de burst programável para controlo de cache fill, interrupção do burst
nas operações de leitura/escrita/precharge (figura 2.11), mascaramento de DQs ciclo a
ciclo, latência de CAS programável, controlador de refrescamento gatilhado por RAS, e
controlador de auto-refrescamento com oscilador RC interno.
Utilizando os mesmos pinos de controlo de uma memória assı́ncrona (CS,RAS,CAS,WR)
e algumas linhas de endereço, a SDRAM executa os comandos definidos pela norma
JEDEC (tabela 2.1) e alguns comandos proprietários (número de série, modos de teste,
BIST, BISR, etc.).

Tabela 2.1: Tabela de comandos da SDRAM TMS664414


Comando Estado do banco(s) CS* RAS* CAS* WR* A13 A12 A11 A10 Mnemonica
Setup All deact L L L L X X X X MRS
BS Bank precharge X L L H L BS BS X L DEAC
precharge all X L L H L X X X H DCAB
row activate SB=DEAC L L H H BS BS V V ACTV
Write at col SB=ACTV L H L L BS BS X L WRT
Write with APC at col SB=ACTV L H L L BS BS X H WRT-P
Read at col SB=ACTV L H L H BS BS X L READ
Write with APC at col SB=ACTV L H L H BS BS X H READ-P
NOP X L H H H X X X X NOOP
Inhibit X H X X X X X X X DESL
AutoRefresh ALL=DEACTV L L L H X X X X REFR
2.3 Arquitecturas de memória 31

Figura 2.11: Diagrama de estados da SDRAM TMS664414


32 Dispositivos de memória: evolução e fabrico

2.3.6 Memórias sı́ncronas DDR


Depois da invenção das SDRAM verificou-se que a falta de largura de banda, na trans-
ferência de dados da matriz para o exterior, só poderia ser resolvida a curto prazo com
a utilização de paralelismo, técnica muito utilizada pelos fabricantes de motherboards que
utilizavam dois canais de SDRAM ligados ao North Bridge do microprocessador.

A Rambus (figura 2.12) foi pioneira com a RDRAM e mais tarde a JEDEC utilizou o
mesmo princı́pio nos produtos DDR e GDDR.

Figura 2.12: Memórias com paralelismo no núcleo


2.3 Arquitecturas de memória 33

Podemos ver na tabela 2.2 a evolução das memórias DDR, utilizando o prefetch como
mecanismo para aumentar a largura de banda no interface.

Tabela 2.2: DDR, DDR2, DDR3: Comparação de caracterı́sticas


Parâmetro DDR DDR2 DDR3
Data Rate 200-400Mbps 400-800Mbps 800-1600Mpbs
System Assumption 4 slots (8 loads) 2 slots (4 loads) 2 slots (2 loads)
Vdd / Vddq 2.5V (+-0.2V) 1.8V (+-0.1V) 1.5V (+-0.075V)
Interface SSTL2 SSTL18 SSTL15
Package TSOP66, BGA60 BGA60(x4,x8), BGA84(x16) BGA78(x4,x8), BGA96(x16)
Source sync. DQS SE DQS SE/diff. DQS differential
Burst lenght (BL) 2, 4, 8 4, 8 4, 8
Prefetch 2n 4n 8n
Bank qty 4 (512Mb) 8(1Gb) 8(1Gb)
CL / tRCD / tRP (ns) 15/15/15 5/15/15 12/12/12
Reset No No Yes
ODT No Yes Yes
Driver Calibration No Offchip Self Calibration
Leveling No No Yes

Na figura 2.13 está representada a arquitectura interna de uma memória DDR, com um
bloco de prefetch 2n utilizado na leitura e o conversor série-paralelo utilizado na escrita.
O bloco de prefetch 2/4/8/16n é implementado com um multiplexador com um número
de entradas iguais ao nı́vel de prefetch e a largura (número de bits) dessas entradas vão
depender da organização da memória (x4, x8, x16).
O controlador da memória DDR gere os sinais de select deste multiplexador em con-
junto com um registo e driver que envia dados nos flancos ascendentes e descendentes do
sinal DQS.
Na escrita, o problema de largura de banda que existe na matriz de células (velocidade
ligeiramente superior a 100Mbps) é ultrapassado com a utilização de uma memória FIFO
de alta velocidade acedida com o sinal DQS, como relógio de escrita externa, e os registos
de conversão série-paralelo de n bits de largura nos IOs (DQ0,1, n) para n vezes o nı́vel
de prefetch.
A ligação da matriz de células para esta interface (datapath interno) varia entre fabri-
cantes e pode ser reconfigurada para modos de teste (testar a memória na largura máxima).
É nesta interface que as soluções BIST podem ser inseridas com a menor intrusão.

A estrutura de comandos sı́ncronos, paralelismo prefetch e dados nos flancos ascen-


dentes e descendentes do relógio, também foram adoptados nos dispositivos de memória
estática.
Os dispositivos de memória estática são utilizados em aplicações que necessitam de
uma largura de banda elevada, na escrita e leitura, e com taxas de disponibilidade que são
difı́ceis de obter com operações de refrescamento.
A separação dos barramentos de escrita e leitura é um dos factores necessários, per-
mitindo duplicar o desempenho das DDR para QDR (Quad Data Rate).
Consultando a página WWW da Cypress [11] podemos verificar a existência de memórias
estáticas sı́ncronas DDR, QDR, NoBL, DCD e concluir que actualmente as memórias
estáticas são uma espécie de ASMP (Application Specific Memory Product).
34 Dispositivos de memória: evolução e fabrico

Figura 2.13: Estrutura Prefetch 2n em DDR

Os dispositivos de memória sı́ncrona pseudo estática (PSRAM, CelularRAM, UtRAM)


utilizam as células 1T1C das memórias dinâmicas, mas integram unidades de refrescamento
internas e são utilizadas como verdadeiras memórias estáticas.
Estes dispositivos são muito utilizados em telefones móveis devido ao seu baixo con-
sumo e alta densidade.
2.3 Arquitecturas de memória 35

2.3.7 Tendências de mercado para produtos DRAM


Como podemos verificar na figura 2.14, o mercado de servidores é mais conservador,
gosta de tecnologias maduras e vai apostar em versões de baixa tensão de DDR2, em
paralelo com a introdução de DDR3.
Nos computadores de secretária (desktops), o abandono da utilização de DDR2 poderá
ocorrer em 2009, mas como foram lançadas versões de baixa tensão esse abandono poderá
ficar adiado até que o preço ou velocidade de interface assim justifiquem.

Figura 2.14: Elpida: Computadores pessoais e servidores


36 Dispositivos de memória: evolução e fabrico

Analisando a figura 2.15 podemos ver o aumento de desempenho que os novos produtos
CCC vão apresentar; a SDRAM continua a ser o cavalo de trabalho (work horse) dos
produtos com menor exigência computacional (linha branca e castanha), os dispositivos
DDR (redes SOHO) vão absorver parte das aplicações que utilizavam SDRAM e vão surgir
produtos de alto desempenho (IPTV-HDTV, visualização 3D, consolas de jogos, DVB-S2)
que irão necessitar de dispositivos de memória com grande largura de banda (DDR3, XDR,
GDDR).

Figura 2.15: Elpida: Produtos de consumo

Os produtos que utilizam memórias celulares (figura 2.16) estão a abandonar os dispos-
itivos SDRAM. As memórias LPDDR (DDR de baixa potência) a partir de 2010 poderão
alcançar uma cota de 100% do mercado.

Figura 2.16: Elpida: Telefones celulares


2.4 Teste de dispositivos de memória 37

2.4 Teste de dispositivos de memória

Com um custo de fabrico por bolacha de silı́cio quase constante, os fabricantes de cir-
cuitos integrados VLSI preferem utilizar bolachas com diâmetro elevado (300mm e 450mm)
e escolhem o processo CMOS mais vantajoso, que permita aumentar a produtividade e
reduzir os custos de produção.
Geometricamente, a utilização de processos CMOS mais reduzidos, permite aumentar
o número de circuitos integrados na bolacha de silı́cio, mas devido a alguns problemas
técnicos que existem nestes processos CMOS mais avançados, o rendimento de produção
é nulo (Yield of zero).
Nas tecnologias CMOS maiores que 200nm o Yield em produtos de memória era bas-
tante baixo (50%), mas com a utilização de geometrias inferiores a 200nm este desceu para
zero e também aumentou o número de dispositivos que não são recuperáveis por limitações
dos actuais sistemas de reparação por redundância.

Figura 2.17: Percurso de fabricação

Nos percursos de teste de dispositivos de memória para computadores (figura 2.17),


a bolacha é testada em alta e baixa temperatura (90◦ C e 0◦ C) e depois destes dois testes
é executada a reparação por laser. Depois da reparação laser, as bolachas são novamente
testadas e os dispositivos sem problemas são encapsulados ou vendidos como bare dies.
Os dispositivos encapsulados em substratos de bolas (BGA - ball grid array), ou em
pinos com plástico injectado (LOC - leads over chip) são normalmente sujeitos a operações
de envelhecimento artificial (burnin) em fornos que submetem os DUTs (Device Under
Test) a stress de tensão e de temperatura, realizando alguns testes funcionais e executando
reparações na matriz com sistemas de antifusı́veis.
O objectivo do envelhecimento artificial é eliminar a zona de mortalidade infantil na
curva em banheira (figura 2.18), enviando para os clientes os dispositivos a funcionarem
na zona de tempo de vida útil (e longe da zona de wearout) .
38 Dispositivos de memória: evolução e fabrico

As condições para acelerar o envelhecimento são o stress em tensão e temperatura;


este stress não deve introduzir novos modos de falha (danificar os dispositivos) e com
extrapolação válida para envelhecimento não acelerado.
O envelhecimento é calculado utilizando as relações de Arrhenius, para se obter os
factores de aceleração para stress de temperatura e voltagem (número de horas de uso
normal por cada hora de burnin).

Figura 2.18: Curva em banheira

Factores de aceleração (AF) em burnin:


Ea 1

− T1
T emperatura : AFt = e( K ) To s (2.1)
V oltagem : AFv = eβ(Vs −Vo ) (2.2)
T otal : AFtotal = AFt × AFv (2.3)

Onde as variáveis K, Ea , To , Ts , β, Vs , Vo são respectivamente a constante de Boltzmann


(8.617 × 10−5 eV/K), as energias de activação dos mecanismos de falhas, as temperaturas
(voltagens) de operação e de stress e a constante experimental beta.
Os mecanismos de falha mais comuns são os defeitos no óxido de silı́cio, defeitos na
poly e de contaminação.

Exemplo: utilizando as falhas no óxido como mecanismo de falha mais comum e com
energia de activação de 0.3eV, stress de temperatura 125◦ C em relação a 50◦ C e com 1V
de stress de voltagem, obtemos 56 horas (a 50◦ C) por cada hora de burnin a 125◦ C.

Depois das operações de envelhecimento teste e reparação em burnin, os dispositivos


são enviados para a área de teste final onde são testados com equipamentos ATE (figura
2.19), onde são testados a baixa e a alta temperatura e segregados em relação a seu
desempenho de consumo e velocidade de interface.
Normalmente o teste de dispositivos discretos de memória é feito com equipamento
ATE para SRAM/DRAM/flash utilizando-se os equipamentos ATE mais avançados no
teste de memórias integradas em ASICs ou em microprocessadores.
2.4 Teste de dispositivos de memória 39

Figura 2.19: Equipamento de teste VLSI Advantest T6682

A existência de vários fabricantes [12] de equipamentos ATE com linguagens de teste


proprietárias provoca grandes problemas de portabilidade de programas de teste entre
equipamentos, sendo a linguagem STIL (Standard Test Interface Language) IEEE-P1450
uma possı́vel solução para resolver este problema [13].
Além da linguagem de programação, a escolha [14] de um determinado equipamento
ATE depende de vários factores: número de IOs, qualidade dos sinais gerados (SNR, ruı́do
de fase, distorção harmónica, etc.), velocidade de amostragem, análise de dados (shmoo
plots), tempo de teste por IC e custos associados (aquisição, operação, treino, upgrade).
40 Dispositivos de memória: evolução e fabrico

2.4.1 Estratégias para teste de memórias

A produtividade de um processo é o quociente entre o número de peças produzidas e o


tempo que se gastou a produzir essas peças, correspondendo ao quociente entre o número
de dispositivos testados e o tempo de teste (na medida de produtividade de dispositivos
prontos a enviar para o cliente).
Na indústria de semicondutores, o aumento de produtividade nas áreas de teste final
é muito importante, devido à feroz concorrência entre os diversos fabricantes e erosão dos
preços.
As estratégias mais utilizadas para aumentar a produtividade na área de teste são a
redução do tempo de teste e o aumento do número de dispositivos testados em paralelo.
Estas duas estratégias podem ser realizadas adquirindo equipamentos de teste mais
velozes e que permitam testar mais dispositivos em paralelo.
Esta opção é uma solução de curto prazo porque a produção de novos produtos acelera
o processo de desactualização dos equipamentos ATE e também existe o risco de este ficar
obsoleto antes de ser depreciado na totalidade.
A redução do tempo de teste e o aumento de paralelismo podem-se concretizar uti-
lizando mecanismos de BIST. Com BIST, a ATE apenas necessita de enviar comandos
para iniciar este mecanismo e, no caso de memórias discretas, pode reduzir enormemente
o número de pinos necessários para testar o circuito integrado.
Soluções BIST são integradas com muita frequência em microprocessadores e ASICs
com memória embutida, porque seria muito difı́cil ou impossı́vel testar as actuais arqui-
tecturas de processamento paralelo existentes nestes dispositivos.
Actualmente, a integração de blocos de memória em dispositivos SOC é uma prática
comum e é normal que estes blocos possam ocupar mais de 90% da área do circuito in-
tegrado. Estes blocos são caracterizados por possuı́rem uma elevada largura de banda
(caches), estarem isolados dos pinos de saı́da do dispositivo e necessitarem de reparação.

Em 1999 a AMD (Advanced Micro Devices fabricava o microprocessador K5 que


possuı́a uma data cache de 8 Kbytes e uma instruction cache de 16 Kbyte, sem acesso
directo e sem BIST.

Figura 2.20: AMD-K5 Array Access Register


2.4 Teste de dispositivos de memória 41

O teste destas caches era realizado pela ROM BIOS do PC durante a execução de
rotinas de POST, porque a AMD colocou um registo especial ( Array Access Register ) no
microprocessador que permitia endereçar e ler estas memórias (figura 2.20) utilizando os
registos ECX, EDX e EAX.
A estratégia tester in the chip é a melhor solução para o teste dos actuais produtos
SOC, a sua estrutura interna com múltiplos microprocessadores permite que estes sejam
utilizados internamente em funções de BIST.

2.4.2 Dispositivos de memória com Auto-teste integrado


O local de integração de um sistema de BIST num dispositivo de memória discreta,
ou em ASICs com memória embebida, deve ser escolhido com os objectivos gerais do
mı́nimo die overhead, redução de tempo de teste, adaptação para permitir o teste final
com equipamentos ATE MSI/LSI e execução de Auto-teste na aplicação/produto final.

Figura 2.21: Solução SOC para ADSL

A estratégia de integração de mecanismos BIST em ASICs é normalmente baseada no


tipo e número de blocos. Vejamos o exemplo da integração de uma solução BIST em um
SOC para modems xDSL (figura 2.21) contendo Mega conversão AD e DA, circuitos PLL,
supervisão de alimentação e regulação LDO, processador e memória embutida:

• Uma única unidade que contenha controladores de loopback para os percursos analógicos
e digitais e fornecer resultados globais (SNR, tensões, BER) com o auxilio do pro-
cessador embutido, com foco no Auto-teste na aplicação final.

• Unidades de BIST individuais de PLL-BIST, ADC-BIST, DAC-BIST, CacheBIST,


com o objectivo final de aumentar a cobertura de teste e reduzir o tempo de teste
do circuito integrado em ambiente ATE.
42 Dispositivos de memória: evolução e fabrico

No caso de um RAM-BIST integrável em ASICs [15] ou em componentes discretos,


a estratégia de implementação do circuito de BIST pode ser restringida pela separação
de blocos de memória no layout do circuito integrado; normalmente estes blocos estão
separados para optimização de velocidade no die e não para simplificar o BIST.

Figura 2.22: Integração de BIST por zonas

Um, ou vários controladores de BIST devem ficar posicionados junto ao bloco a testar,
podendo tirar partido da granularidade da RAM para simplificação da implementação.
Consoante o estimulo de teste que o controlador (figura 2.22) fornece ao bloco em
teste, os sistemas de BIST são designados como determinı́sticos ou pseudo aleatórios.

Figura 2.23: Registo de deslocamento com realimentação linear

Os sistemas pseudo aleatórios têm a vantagem de não necessitarem de blocos de ROM


com vectores ou carga inicial dos vectores de teste, mas como fornecem uma cobertura de
teste muito baixa [16] não são utilizados com muita frequência.
O mecanismo mais utilizado para geração de vectores pseudo aleatórios é o linear
feedback shift register (LFSR), implementado com um registo de deslocamento (figura
2.23) cuja entrada é uma função linear do estado anterior.
A função linear utilizada é o ”OU exclusivo”(XOR ou XNOR), o estado inicial chama-
se a semente de geração, com n flip-flops existem 2n − 1 estados diferentes, porque o vector
nulo não serve para semente.
2.4 Teste de dispositivos de memória 43

Figura 2.24: Instruções do porto de acesso a testes do microprocessador AMD-K5

Os geradores LFSR são bastante utilizados em sistemas JTAG Boundary-Scan IEEE


1149.1 (figura 2.24), mas em sistemas de teste de memória o registo de assinatura com
múltiplas entradas MISR (multiple input signature register ) (figura 2.25) é mais utilizado.

Figura 2.25: Registo de assinatura com nove entradas

O registo MISR é utilizado no teste de memórias ROM onde fornece uma assinatura
no final do teste de todos os endereços, que é comparada com a assinatura de referência
obtida numa ROM sem falhas.
A utilização de MISR no teste de RAM obriga a que se escreva na memória valores
conhecidos para se obter a assinatura de referência.
Se o MISR não possuir dimensões suficientes podem ocorrer erros de mascaração (alias)
e também podemos obter falsas unidades sem falhas, se ocorrerem duas falhas iguais.
As técnicas pseudo aleatórias são úteis para compressão dos resultados de teste das
saı́das de sistemas BIST, mas muito pouco eficazes para geração de vectores de estı́mulo
devido à natureza fı́sica das falhas. Em sistemas BIST transparentes [17] que correm em
simultâneo com o normal funcionamento da memória, o uso de memórias CAM na geração
de vectores de teste é uma alternativa para geração de topologias pseudo aleatórias e
clássicas.
44 Dispositivos de memória: evolução e fabrico

Figura 2.26: Implementação tı́pica: BIST com colar e controlador

2.4.2.1 Implementações tı́picas de BIST em memórias

Na figura 2.26 está representado uma implementação tı́pica [18] de uma solução BIST
para memórias.
Podemos verificar a enorme intrusão que este sistema causa na memória:

• o datapath é desviado do colar para o controlador de BIST

• além das saı́das de Pass/Fail, done existem saı́das de comparação e datalog

• existe a necessidade de utilização de um relógio de datalog

Esta implementação pode ser integrada em um ASIC porque não existe acesso directo
aos sinais de dados, endereços e controlo da memória embutida; mas não é apropriada
para se utilizar em memórias discretas devido à intrusão que o colar causa.
O controlador de BIST pode ser realizado utilizando máquinas de estado (figura 2.27),
e é projectado para controlar o contador de endereços, gerador de dados e o controlador
de memória.
A complexidade deste controlador pode ser muito baixa, se este tiver como objectivo
realizar operações lineares de escrita e leitura, e se o vector de teste (dados a escrever) for
fornecido do exterior.
Se existir a necessidade de realizar testes com topologias utilizadas para detectar falhas
muito especı́ficas, terá de se implementar neste controlador algumas operações complexas
para geração de endereços e vectores de teste.
A principal vantagem de uma solução de BIST por máquina de estados é a simplicidade,
mas esta solução é pouco flexı́vel quando existe a necessidade de adicionar topologias de
teste para se aumentar a cobertura de teste em novos problemas do dispositivo de memória.
2.4 Teste de dispositivos de memória 45

Figura 2.27: Implementação de BIST com máquinas de estados

Com os actuais Yields de 0 unidades que caracterizam a produção de dispositivos


de memória (antes da reparação) existem numerosos mecanismos de falha que devem ser
detectados pelo BIST.
O BIST implementado com uma máquina de estados não é o mecanismo mais apropri-
ado para esta nova geração de dispositivos de memória e a alternativa mais frequentemente
utilizada é o BIST com microcódigo.
As implementações de BIST por microcódigo (figura 2.28) possuem a desvantagem de
ocuparem mais área de silı́cio que uma solução por máquina de estados, mas a cobertura
de teste para novos problemas é aumentada por software não necessitando do redesenho
das unidades BIST quando surge a necessidade de se adicionarem novos testes.
A evolução para BIST por microcódigo (BIST baseado em microprocessador) permite
implementar instruções para criação de topologias e realizar testes assı́ncronos com graus
de granularidade variável.
Existem projectos de testabilidade (tester in the chip) que integram as funções dos
equipamentos ATE na geração de estı́mulos (pattern generation) em ASICs que são colo-
cados entre o equipamento ATE e o DUT, para permitir testar novas gerações de memória
(GDDR, XDR) em equipamentos ATE, antigos e desapropriados para os novos produtos.
Os pattern generators das testadoras de memórias discretas geram as suas saı́das de
dados e endereços com instruções de microcódigo muito básicas (inc, dec, jmp, jmpIf,
cmp) e podem ser integradas nestas soluções de BIST.
Os resultados de teste são um dos factores que podem exigir uma maior complexidade
46 Dispositivos de memória: evolução e fabrico

Figura 2.28: BIST por microcódigo

no BIST, necessitando de ser muito detalhados para serem utilizados em operações de


BISR.
Como a simples flag pass or fail é insuficiente existe a necessidade de pelo menos saber
qual o endereço em falha e um sistema de memória endereçada por conteúdo (CAM) como o
que é descrito em [19] e que permite implementar BIST com capacidades de funcionamento
transparente (figura 2.29).

Figura 2.29: BIST com compressão de resultados

Neste BIST com compressão de resultados é utilizada uma memória CAM (figura 2.30)
no acumulador de sı́ndromas, enquanto que na solução BIST em espelho desenvolvida nesta
dissertação os resultados (endereços que falharam) são colocados em zonas pré-testadas
2.4 Teste de dispositivos de memória 47

da memória.

Figura 2.30: Registo de falhas com memória CAM


48 Dispositivos de memória: evolução e fabrico

2.4.3 Interface IEEE1500 em BIST para memórias


O standard IEEE std 1500 [20] é uma arquitectura de utilização flexı́vel para teste de
circuitos integrados SOC, utiliza uma linguagem própria (CTL- core test language) para
descrever as diversas capas (wrappers) de testabilidade que se podem integrar no SOC.
Foi desenvolvido com influências do standard IEEE 1149.1, mas está mais focado no
teste de blocos digitais e analógicos presentes nos actuais ASICs SOC.
Uma capa IEEE 1500 (2.31) é composta por um registo de instruções (WIR), e dois registos
de dados (WBY, WBR).

Figura 2.31: IEEE1500 wrapper


2.4 Teste de dispositivos de memória 49

As capas (2.32) devem possuir obrigatoriamente portas de dados e controlo série, e


opcionalmente em paralelo para soluções com grande largura de banda.
Os sinais presentes nas capas série (WSP) possuem os sinais: entrada série (WSI),
saı́da série (WSO), relógio (WRCK), reset (WRSTN), selecção de registo (selectWIR),
captura na capa (captureWR) e deslocamento (shiftWR).

Figura 2.32: Terminais de acesso a um wrapper

O registo WBR serve para aceder ao sinais internos do core utilizando os eventos
definidos para essas operações: shift, capture, update, transfer.
Esta interface de teste é bastante versátil para o controlo e integração de mecanismos
de teste nos actuais ASIC SOC, existindo no mercado [21] algumas soluções de BIST para
memórias embutidas (figura 2.33) utilizando este interface.
50 Dispositivos de memória: evolução e fabrico

Figura 2.33: Múltiplo em-BIST com bancos de fusı́veis

Resumo:
O BIST por microcódigo é o método mais eficaz para se obter uma cobertura mais ampla
da diversidade de falhas que afectam os actuais dispositivos de memória.
Estruturas MISR são úteis na compressão de vectores de resultados, mas quando se
necessita de uma lista de endereços que falham para configuração do BISR, os resulta-
dos do MISR são insuficientes e a utilização de uma memória de resultados é imperativa.
Guardar os resultados de teste em memórias CAM é vantajoso, porque se a CAM for
implementada em flash pode ser utilizada pelo BISR no powerup.
Capı́tulo 3

Avaliação dos mecanismos BIST


desenvolvidos

3.1 Solução de BIST por teste em espelho

Esta solução de BIST foi desenvolvida com base no extenso paralelismo que caracteriza
os actuais dispositivos de memória e sistemas de microprocessadores.
A utilização de 2, 4 e 8 canais no interior das memórias DDR (prefetch), canais de
módulos nas motherboards e o paralelismo das memórias XDR são disso exemplo.

Tirando partido da simetria que existe nestas arquitecturas paralelas, foi desenvolvida
uma solução que consiste em pequenas alterações no datapath original e na adição de um
controlador de BIST.
Foi desenvolvido um datapath do kit FPGA para um PC exterior tentando replicar a
interface com as memórias DRAM: poucos pinos de controlo, endereços multiplexados e
implementação de um contador de endereços para operações em burst.

Na tabela 3.1 estão descritos os sinais implementados para controlo do dispositivo


virtual.

Tabela 3.1: Comandos e pinos de controlo da memória simulada


Sinal Pino na ficha D Registo 0x37A Função pino FPGA
nStrobe 1 bit0 CS write strobe W16
nAutofeed 14 bit1 Inc. endereço W17
nInit 16 bit2 WE F18
nPsel 17 bit3 banco D19

O datapath simulado tenta ser uma réplica do existente em dispositivos de memória


sı́ncrona, antes dos blocos de agregação de dados DDR (FIFO e registos de saı́da).

51
52 Avaliação dos mecanismos BIST desenvolvidos

Foi desenvolvido um bloco em Verilog (anexo B) do datapath sem BIST para servir de
referência no cálculo da área no die que o BIST em espelho vai adicionar.

Este bloco foi testado utilizando o módulo de topo no Xilinx ISE, representado na
figura 3.1:

Figura 3.1: Esquema de topo usado no teste do datapath

O bloco Verilog LEDroda é utilizado para detectar e medir a frequência de strobes, e


como é obvio não é particularmente útil para medir sinais de alta-frequência, mas consegue
indicar, com alguma segurança, a presença desses sinais.
O teste de BIST em espelho foi testado simulando a resolução mı́nima de teste, em
que um bloco guarda os vectores de falha do bloco oposto.
Foram utilizadas as duas memórias estáticas presentes no kit da Altium (figura A.1)
com tRC de 10ns, possibilitando ler dados a 100M palavras por segundo, utilizando o
modo de acesso de comando por endereço (figura 1.11).
Este foi o modo de leitura utilizado no datapath normal (sem BIST); no modo de
escrita foi utilizado o modo de comando chip strobe (figura 3.2).
3.1 Solução de BIST por teste em espelho 53

Figura 3.2: Modo de escrita por controlo de chip strobe

3.1.1 Módulo DataPathSemBIST

Foi desenvolvido um módulo em Verilog (DataPathSemBIST) simulando um tı́pico


datapath que existe entre os amplificadores das células e a lógica de implementação de
transferência de dados no flanco ascendente e descendente de relógio (DDR).
Como existem várias configurações de células (8F2, 6F2, 4F2), a área da matriz de
memória não foi utilizada no cálculo de die overhead provocado pelo BIST em espelho.
O overhead foi calculado na zona do datapath utilizando-se como referência os recursos
necessários para implementar o módulo DataPathSemBIST.
São analisados vários relatórios de sı́nteses realizadas com o XST da Xilinx, o Synopsys
Design Compiler com a tecnologia AMS 0.35um e dados de sı́nteses fı́sicas realizadas com
o Cadence SOC Encounter (anexo C).
No layout de dispositivos de memória a colocação dos circuitos BIST é realizada no
centro do integrado ou na espinha entre blocos de células, podendo existir uma maior
optimização quando comparado com o estudo feito com o SOC Encounter.
O módulo DataPathSemBIST consiste em lógica combinatória que permite a escolha
de um bloco de memória e a execução de operações de leitura e escrita utilizando a porta
paralela da placa irmã.
Não foi implementado o barramento endereços por falta de linhas de E/S no kit e
porque se utilizam métodos equivalentes a leituras em burst utilizadas nas memórias
sı́ncronas.
Analisando o HDL, presente no anexo B, podemos verificar que este módulo consiste
em 3 barramentos bidireccionais, dois contadores de endereços com bursts controlados pelo
54 Avaliação dos mecanismos BIST desenvolvidos

strobe Autofeed, um multiplexador de dados (dadosR), e alguma lógica combinatória para


comando.
Este datapath é utilizado como espinha dorsal da solução BIST estudada nesta dis-
sertação e é sintetizado na FPGA utilizando 570 portas equivalentes (figura 3.3).

Figura 3.3: Resultados de referência (sı́ntese XST)


3.1 Solução de BIST por teste em espelho 55

3.1.2 BIST em espelho


O datapath de referência foi integrado no módulo DataPathComBIST (figura 3.4) em
conjunto com uma máquina de estados para execução de auto teste em espelho.

Figura 3.4: BIST em espelho

Este mecanismo de BIST foi desenvolvido para as arquitecturas paralelas utilizadas


nas memórias sı́ncronas DDR, DDR2 e DDR3.
Na figura 1.7 podemos ver a estrutura interna de uma memória DDR2 da MTI, com
oito bancos estruturados em 16384 linhas por 512 colunas, com uma largura de dados de
16 bits (x4 e prefetch 4n), o contador de refrescamento para endereçar as 16384 linhas
por banco, o bloco de controlo lógico que comanda os amplificadores de sentido (sense
amplifiers) e os comutadores (I/O gating) dos percursos de dados.
Com o objectivo de minimizar o anel (ou capa) de adaptação, esta solução de BIST
vai tirar partido dos bancos adjacentes serem espelhos uns dos outros (técnica de layout
para DRAMs).
Como este mecanismo de BIST foi analisado num sistema de 8 bits (porta paralela),
foi feita uma redução no barramento de endereços para 8 bits:

assign AD1red=AddrRAM1[7:0];
assign AD2red=AddrRAM2[7:0]; //reduç~
ao de granularidade

Funcionalmente este BIST em espelho grava os endereços de falha da memória de um


bloco oposto (ver figura 1.8) no barramento de dados do bloco local:
56 Avaliação dos mecanismos BIST desenvolvidos

5’b00111: begin // registo de falhas do BIST em espelho


BISTfail<=1; // seta a flag de falha,
RAM1cs<=0; //grava o endereço de falha no outro bloco
estado <= 5’b01000;

Na situação simulada neste kit existem 19 linhas de endereço e 16 linhas de dados e


foram utilizadas apenas as 8 linhas inferiores da memória (UB=1).
Para se implementar esta solução de BIST é necessária uma adaptação de granular-
idade. Esta adaptação é relativamente fácil de concretizar em DRAM e um pouco mais
difı́cil de implementar em ASICs.
Por questões de competitividade e eficiência de produção, os dispositivos DDR, DDR2/3
com organização X4, X8, X16 são fabricados com o mesmo die.
A organização é definida nas operações de correcção, por laser e soldadura com fio
de ouro (wire bonding), mas ficam sempre presentes modos de teste que permitem testar
dispositivos X4 em modo X16 para acelerar o teste final, como é o caso das memórias
FPM DRAM utilizadas neste trabalho.
O BIST em espelho foi implementado com uma máquina de 9 estados representada
na figura 3.5, existindo uma duplicação dos estados 2 a 9 no estado 18 para teste reverso.
Como foi explicado no primeiro capı́tulo o BIST em espelho necessita de uma área inicial
pré-testada, para guardar os possı́veis vectores de falhas em endereços que não corrompam
os resultados de auto-teste.
Foi descrito nesta dissertação que soluções de BIST mais versáteis devem ser imple-
mentadas com microcódigo, para possuı́rem maiores possibilidade na geração de vectores
de teste. A solução de BIST desenvolvida neste trabalho tem como objectivo principal o
aumento do Yield numa nova classe de produtos que tiram partido deste BIST. A arqui-
tectura desta solução BIST permite a integração de uma unidade de geração de vectores
de excitação por microcódigo, mas nos testes que se realizaram neste trabalho, os vectores
são gerados no exterior:

input [7:0] xptdata; //registo do BIST com os dados esperados


3.1 Solução de BIST por teste em espelho 57

Figura 3.5: Máquina de estados do BIST em espelho

Descrição da máquina de estados da solução BIST por espelho:

• Estado 0; quando um dos sinais STBIST1/2 é accionado a flag BISTbusy é activada


a 1 e o teste é iniciado.

• Estado 1; escolhe que bloco deve testar.

• Estado 2; setup de CS e WE.

• Estados 3 e 4; espera e verifica os resultados.

• Estado 5; verifica se o endereço máximo foi alcançado.

• Estado 6; fim de teste.

• Estados 7, 8; grava o endereço de falha em modo de espelho

• Estado 9; incrementa a memória de resultados caso esta não se tenha esgotado.

• Estados 18..; teste do sector oposto.


58 Avaliação dos mecanismos BIST desenvolvidos

Figura 3.6: Setup do Chipscope

Utilizando o Chipscope (com o setup 3.6) para analisar a máquina de estados desta
solução de BIST, podemos verificar na figura 3.7 o estado nulo antes do inı́cio do BIST e
o estado final comum a ambos os testes (figura 3.8).
3.1 Solução de BIST por teste em espelho 59

Figura 3.7: Estado inı́cial

Figura 3.8: Estado final (teste 1 ou teste 2)


60 Avaliação dos mecanismos BIST desenvolvidos

Na tabela 3.2 são apresentados os resultados de sı́ntese do datapath de referência e


desta solução de BIST em espelho, verificando-se que os resultados de die overhead são
semelhantes na sı́ntese com as ferramentas da Synopsys e da Cadence.

Tabela 3.2: Resultados de die overhead do BIST em espelho


Ferramenta utilizada Unidade Sem BIST Com BIST Overhead(%)
Xilinx XST ISE equivalent gate count 570 1622 184
Synopsys Design Compiler total cell area 22422 37291 66
Synopsys Design Compiler total area 25644 44086 72
Cadence SOC Encounter area 0,0233 0,0385 65

3.2 Conclusões
A utilização deste mecanismo de BIST permite realizar o seguinte cenário no produto
final:

• o microprocessador multicore com vários canais de memória (AMB por exemplo)


recebe uma mensagem dum módulo com detecção de erros.

• o microprocessador (mais o SO) inicia a libertação dos recursos desse módulo.

• depois da libertação realizada, o micro envia um comando de BIST a esse módulo.

• o módulo completa o teste com uma mensagem BIST completo.

• o micro analisa os dados do BIST e verifica se é possı́vel uma recuperação completa


utilizando a redundância existente.

• o micro corrige as falhas, ou evita os endereços em falha com mecanismos de pro-


tecção de memória, criando um jornal em flash ou no disco duro.

Este cenário de paralelismo é uma realidade actual e permite que a implementação de


este sistema BIST em espelho com baixo die overhead seja muto vantajosa.
Este BIST pode ser integrado no silı́cio, ou colocado no exterior do dispositivo em
barramentos AMB, NorthBridge, ou em ASICs para teste final ou teste em Burnin).
Capı́tulo 4

Apresentação de sistemas de
auto-reparação

4.1 BISR por manipulação de granularidade

No capı́tulo 13, do livro de Dean Adams [16] podemos verificar a diversidade de defeitos
que afectam as memórias fabricadas com as tecnologias mais densas.
Com a utilização de novas tecnologias CMOS na fabricação de dispositivos cada vez
mais densos, e se os actuais problemas de processo não se resolverem, a redundância
necessária para recuperar dispositivos de wafers com Yield 0 terá que aumentar na pro-
porção do aumento do número de falhas; se a indústria continuar a utilizar os mesmos
esquemas de reparação na wafer poderemos atingir em breve valores de redundância su-
periores a 50%.
Se a qualidade de fabricação não se degradar e o valor de redundância permanecer
constante (em percentagem ) significa que nos futuros dispositivos de 8 Gigabit poderá
existir mais de 400Mbit em redundância.
A utilização de mecanismos BISR iguais ou equivalentes aos apresentados nesta dis-
sertação poderá proporcionar um aumento de yield com a introdução de produtos sem
teste completo na matriz.
Não foi feito um estudo de um caso de referência (case study) para comparação com esta
técnica BISR por manipulação de granularidade, porque todos os fabricantes de DRAM
ocultam (por motivos de concorrência) o seu Yield antes da reparação na wafer, qual o
valor de redundância que o dispositivo contém e o valor de Yield depois da reparação.
Os fabricantes também mantêm sob segredo industrial o número de fusı́veis utilizados
na reparação a laser e a quantidade de antifusı́veis existentes.
Esses valores seriam interessantes para comparar a granularidade existente nas soluções
de BISR utilizadas pela indústria de DRAM e a ideia proposta nesta solução de BISR por
manipulação de granularidade.

61
62 Apresentação de sistemas de auto-reparação

Pesquisando os extensos recursos de informação da biblioteca da FEUP aparecem


muitos artigos sobre este assunto, mas vai ser utilizado como referência um artigo de
Volker Schöber e Olivier Picot da Infineon Technologies [22].
Este artigo descreve um método de BISR baseado em granularidade a nı́vel de palavra
(word oriented memory test methodology for Built-In Self-Repair ), como alternativa aos
métodos clássicos de redundância por linha e coluna (row and column) que deverão ser os
utilizados pela indústria de DRAM.
O sistema proposto, com granularidade a nı́vel de palavra, utiliza grupos de fusı́veis.
Refere que a tecnologia de fusı́veis utilizada é state of the art, mas não refere um número
concreto de fusı́veis nem de palavras para redundância, mas refere duas alternativas para
separar os bancos de fusı́veis da lógica de redundância (figuras 4.1 e 4.2).

Figura 4.1: Acesso em paralelo ao banco de fusı́veis

Figura 4.2: Acesso em série ao banco de fusı́veis

Concluindo-se que granularidade pode ser reduzida utilizando lógica de redundância


com memórias CAM, ou com registos de zonas de falha.
4.2 BISR por refrescamento adaptativo 63

As zonas de falha definem a granularidade deste sistema BISR, para permitir substituir
os elementos em falha utilizando menos recursos de redundância.
Os elementos de redundância que sobrarem podem ser utilizados em operações BISR
transparentes, ou como capacidade adicional.
O sistema BIST em espelho, descrito no capı́tulo anterior, e este BISR por manipulação
de granularidade permitem um mapeamento dinâmico da memória, que na prática se pode
revelar com a disponibilização da redundância não utilizada para reparações, como blocos
extra para o sistema operativo.

4.2 BISR por refrescamento adaptativo


O mecanismo de BISR por refrescamento adaptativo proposto neste trabalho, tem
como produto alvo as memórias pseudo estáticas (PSRAM, uTRAM).
Podemos observar no diagrama de blocos de uma memória PSRAM da Micron (figura
4.3), que existe um registo de configuração de refrescamento e que, nos datasheets da Sam-
sung de memórias sı́ncronas pseudo estáticas uTRAM, existe referência a um controlador
de refrescamento compensado em temperatura (TCSR).

Figura 4.3: Dispositivo PSRAM da Micron

Desconhecendo se o BISR que é proposto existe nestes produtos PSRAM, vai ser
descrito o componente chave deste mecanismo de BISR por refrescamento adaptativo:
unidade de medida de tempo TMU (Time Measurement Unit).
Este TMU é utilizado para caracterizar os tempos de retenção das células que falham
com as frequências normais de refrescamento.
64 Apresentação de sistemas de auto-reparação

Se existirem células que possam ser recuperadas utilizando uma frequência mais ele-
vada de refrescamento permitida pelas microunidades distribuı́das pela matriz, esse valor
será programado nos registos de refrescamento.

4.2.1 Implementação em Verilog do TMU (medida de tRET)


Esta unidade vai medir os tempos de retenção e existe a necessidade de definir a base
de tempo e o registo de contagem do TMU.

Tempo medido pelo TMU :

tempo = BaseT empo × contador (4.1)

O perı́odo de refrescamento máximo das memórias dinâmicas presentes no sistema de


desenvolvimento tREF=16ms.

Este valor especificado no datasheet possui uma grande margem de segurança devido
a uma diminuição muito elevada do tempo de retenção da célula 1C1T com o aumento da
temperatura de funcionamento.

Por esse facto foi escolhido para resolução mı́nima t=8ms (metade de tREF)

Com t=8ms, implica implementar um relógio de 1/8ms = 125Hz

Como o sistema de sı́ntese digital de relógios DCM da Xilinx não alcança tais valores,
vai ser utilizado um contador binário de 18 bits para divisão de frequência.
O DCM tem que ser programado com uma frequência de:

F = 125Hz × 218 (4.2)

F=32.768Mhz (figura 4.4)


4.2 BISR por refrescamento adaptativo 65

Figura 4.4: Programação da frequência do DCM

Utilizando as saı́das do sintetizador 4.5 e a saı́da em fase com o relógio de 50MHz de


entrada.

Figura 4.5: Programação das saı́das do DCM


66 Apresentação de sistemas de auto-reparação

Utilizando o seguinte esquema 4.6 como módulo de topo:

Figura 4.6: Módulo superior para medida de tRET

O teste é iniciado com SW1 a zero e o sistema de medida de tempo baseado num
watchdog que é incrementado ciclo a ciclo vai parar quando o conteúdo da célula se degrada
(ou no overflow do contador).
Este TMU foi idealizado para ser incluı́do no datapath depois dos comutadores dos
amplificadores de sentido (figura 4.7).

Figura 4.7: Folded DRAM sense amplifier


4.2 BISR por refrescamento adaptativo 67

A unidade de medida de tempo (TMU) de retenção foi implementada com uma máquina
de 16 estados, que podem ser descritos da seguinte forma:

• Estado 0; default e vector reset

• Estado 1e 2; inicio do tRC (random read/write cycle time)

• Estado 3 a 5; dados escritos na DRAM após tWCH=20ns

• Estado 6 a 8; fase de leitura e cálculo do tempo de retenção utilizando hidden refresh

• Estado 9; limpa contador do cão de guarda e inicia os 80ns de tRAS

• Estado 10 e 11; lê a RAM e faz o refresh da localização

• Estado 12; detecta dados degradados

• Estado 13; detecta se foi atingido o máximo do contador do TMU, ou arranca com
watchdog

• Estado 14; volta a ler e a realizar um refrescamento escondido, ou repete até ao


disparo do watchdog esperando pela violação de tRet.

• Estado 15; estado de fim de teste e fica a esperar pelo reset

Neste módulo Verilog existem 3 dispositivos embebidos com esta máquina de estados:

//Dff para amostragem de dados da RAM


always @(posedge lerEN) RAMread<= Rdados;

// gerador de base de tempo do TMU


always @(posedge DCMclk or posedge reset)

begin
if (reset)
contar <= 0;
else
contar <= contar + 1;
end

// contador de c~
ao de guarda (watchdog timer)
always @(posedge clk_TMU or posedge zeraTempo)
68 Apresentação de sistemas de auto-reparação

begin
if (zeraTempo)
watchdog <= 0;
else
if (enableDog)
watchdog <= watchdog + 1;

end

Na figura 4.8 podemos verificar a saı́da LPTdata a incrementar até a degradação do


conteúdo da posição de memória:

Figura 4.8: TMU em execução


4.2 BISR por refrescamento adaptativo 69

Figura 4.9: Chipscope: setup de sinais

Análise com o Chipscope do contador de Watchdog, no inı́cio e a meio da contagem


(figuras 4.10, 4.11)
70 Apresentação de sistemas de auto-reparação

Figura 4.10: Chipscope: TMU em execução

Figura 4.11: Chipscope: TMU em execução (t2)


4.2 BISR por refrescamento adaptativo 71

Resumo:
Pretendia-se apresentar neste trabalho um histograma com o valor de retenção das
células de alguns sectores dos dispositivos de memória dinâmica utilizados no sistema de
desenvolvimento.
Este histograma teria no eixo horizontal colunas, representando intervalos de tempo de
retenção, cuja altura seria o número de endereços que possuı́am esse valor de retenção.
Este histograma deveria tomar uma forma em sino (distribuição normal) centrado na
média de tempo retenção, representando a qualidade do óxido no dieléctrico dos conden-
sadores das células 1T1C.
Esta experiência iria ser repetida com uma temperatura superior a 90◦ C, com o ob-
jectivo de caracterizar os controladores de refrescamento compensados em temperatura
utilizados em memórias PSRAM.
Não foi possı́vel concretizar este objectivo em tempo útil, devido a caracterı́sticas das
memórias dinâmicas utilizadas no sistema de desenvolvimento.
Os dispositivos HY514400 durante o teste de tRET entravam em modo de teste, ficando
com um comportamento de uma latch.
Foram realizadas várias experiências para tentar descobrir o instante em que o conteúdo
da memória se degradou, sem resultados práticos (Módulo Verilog do controlador externo
em anexo).

Depois de consultar diversas informações técnicas dos antigos fabricantes deste tipo de
dispositivo dinâmico FPM, conclui-se que deverá existir um procedimento especı́fico para
realizar testes de retenção.
O módulo TMU para o BISR por refrescamento adaptativo foi desenvolvido para ser
integrado no datapath do dispositivo de memória e não foi possı́vel o seu teste no exterior
das memórias dinâmicas utilizadas no sistema de simulação.
Na página 4-6 do databook da Micron de 1995 existe uma nota que descreve a operação
de inicialização da memória com oito ciclos RAS para que esta possa sair do modo de teste
inicial. O dispositivo entra em modo de teste inicial no powerup e sempre que se violar o
tREF.
72 Apresentação de sistemas de auto-reparação
Capı́tulo 5

Conclusões

Esta dissertação procurou analisar os problemas que afectam a qualidade dos dispos-
itivos de memória fabricados em tecnologias CMOS e desenvolver algumas soluções de
BIST e BISR como solução para os problemas descritos neste trabalho.
Depois de uma breve apresentação sobre produtos e fabricantes de DRAM, foi feita
uma avaliação de uma solução de BIST e proposta uma solução alternativa ao uso de
redundância como BISR.
Com os objectivos de um acréscimo de área mı́nima no circuito integrado e de permitir o
teste no produto final, foram analisadas algumas ideias disponibilizadas por vários autores
para medir estes parâmetros.
Foi decidido sintetizar um datapath sem BIST e utilizar a sua área de implementação
como referência.
Nos resultados obtidos de die overhead, o valor de 184% baseado nos relatórios de
sı́ntese XST da Xilinx não deve ser real e a imprecisão deste número deve estar rela-
cionada com a utilização de unidades CLB como granularidade mı́nima de implementação
lógica.

Analisando os resultados do Synopsys design compiler e do Cadence SOC encounter,


conclui-se que o die overhead vai ser inferior a 65% se for utilizado um método Full Custom.

Desenvolvimentos futuros:
O desenvolvimento da tecnologia CMOS está a permitir um grau de integração bastante
elevado, permitindo desenvolver produtos cuja complexidade e desempenho começam a
causar problemas de cobertura de teste utilizando os convencionais equipamentos ATE.
Começa a ser impraticável não integrar soluções de BIST e BISR em ASICs nas actuais
tecnologias inferiores a 45nm, porque existem demasiados blocos lógicos isolados no interior
do SOC que necessitam de recursos internos de teste.

73
74 Conclusões

A integração de sistemas BIST e BISR em dispositivos de memória discreta pode


assegurar nı́veis competitivos de Yield. Com o paralelismo presente nos actuais sistemas de
microprocessadores, a utilização de soluções BIST e BISR, equivalentes às propostas neste
trabalho, permitem o desenvolvimento de sistemas que se auto-reparam no arranque do
sistema (after POST ), e de uma forma transparente durante o funcionamento do sistema.
Anexo A

Esquemas eléctricos

Esquemas eléctricos do sistema de lógica programável utilizado nesta dissertação.

75
76 Esquemas eléctricos

A.1 Kit Altium live design Spartan-3


A.1 Kit Altium live design Spartan-3 77
78 Esquemas eléctricos
A.1 Kit Altium live design Spartan-3 79
80 Esquemas eléctricos
A.1 Kit Altium live design Spartan-3 81
82 Esquemas eléctricos
A.1 Kit Altium live design Spartan-3 83
84 Esquemas eléctricos
A.1 Kit Altium live design Spartan-3 85
86 Esquemas eléctricos

A.2 Placa de memória dinâmica registada


A.2 Placa de memória dinâmica registada 87
88 Esquemas eléctricos
A.2 Placa de memória dinâmica registada 89
90 Esquemas eléctricos
A.2 Placa de memória dinâmica registada 91
92 Esquemas eléctricos
Anexo B

Código Verilog desenvolvido

93
94 Código Verilog desenvolvido

*****************************************************************************
module DataPathSemBIST(reset,F18rdwrRAM, D19selRAM, W17AUTOfeed,SRAM0_LB,
SRAM1_LB,SRAM0_WE, SRAM1_WE, LPTdata, RAM0data, RAM1data,AddrRAM1,AddrRAM2);
// modulo utilizado como refer^
encia para calculo de overhead

input reset,F18rdwrRAM,D19selRAM,W17AUTOfeed;

output SRAM0_LB,SRAM1_LB,SRAM0_WE,SRAM1_WE;
output [18:0] AddrRAM1,AddrRAM2;

inout [7:0] LPTdata, RAM0data, RAM1data;

reg [18:0] AddrRAM1,AddrRAM2;

wire F18rdwrRAM, D19selRAM, SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE, W17AUTOfeed;


wire [7:0] LPTdata, RAM0data, RAM1data, dadosW, dadosR, dadosRAM0, dadosRAM1;
//datapath busses

assign SRAM0_LB = ~D19selRAM;


assign SRAM1_LB = ~SRAM0_LB;
assign SRAM0_WE = ~F18rdwrRAM|SRAM0_LB;
assign SRAM1_WE = ~F18rdwrRAM|SRAM1_LB;

assign LPTdata = F18rdwrRAM?8’bZ:dadosR; // inferir IOBUF ;tristate@LPT


assign dadosW = LPTdata;

assign RAM0data = F18rdwrRAM?dadosW:8’bZ; // inferir IOBUF ;tristate@SRAM1


assign dadosRAM0 = RAM0data;

assign RAM1data = F18rdwrRAM?dadosW:8’bZ; // inferir IOBUF ;tristate@SRAM2


assign dadosRAM1 = RAM1data;

assign dadosR = SRAM1_LB?dadosRAM0:dadosRAM1; // inferir databus MUX 2:1

// contador de endereços da RAM1


always @(posedge W17AUTOfeed or posedge reset)
begin
if (reset)
AddrRAM1 = 0;
else
AddrRAM1 = AddrRAM1 + 1;
end

// contador de endereços da RAM2


always @(posedge W17AUTOfeed or posedge reset)
begin
if (reset)
AddrRAM2 = 0;
else
AddrRAM2 = AddrRAM2 + 1;
end

endmodule

****************************************************************
module DataPathComBIST(clk,reset,STBIST1,STBIST2,F18rdwrRAM, D19selRAM, W17AUTOfeed, W16strobe, xptdata,
BISTbusy,BISTdone,BISTfail, SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE, SRAM0_CS, SRAM1_CS, LPTdata, RAM0data,
RAM1data,AddrRAM1,AddrRAM2);

input clk,reset,STBIST1,STBIST2,F18rdwrRAM,D19selRAM,W17AUTOfeed,W16strobe;
input [7:0] xptdata; //registo do BIST com os dados esperados
output SRAM0_LB,SRAM1_LB,SRAM0_WE,SRAM1_WE,SRAM0_CS,SRAM1_CS,BISTbusy,BISTdone,BISTfail;
output [18:0] AddrRAM1,AddrRAM2;

inout [7:0] LPTdata, RAM0data, RAM1data;

reg [18:0] AddrRAM1,AddrRAM2;

// input clk,reset,STBIST1,STBIST2,RAMfail,AdMax0,AdMax1;
// output blocoSEL,incrAD0,incrAD1,BISTbusy,BISTdone,BISTfail,RST,RAM0we,RAM1we,RAM0cs,RAM1cs;
Código Verilog desenvolvido 95

reg blocoSEL,incrAD0,incrAD1,BISTbusy,BISTdone,BISTfail,RST,RAM0we,RAM1we,RAM0cs,RAM1cs;
reg [4:0] estado;

wire F18rdwrRAM, D19selRAM, W17AUTOfeed, W16strobe, SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE, SRAM0_CS, SRAM1_CS,
RAMfail, AdMax0, AdMax1, CounterReset,Cnt0clk,Cnt1clk,RAM_select,BIST3state,RAMallSEL;

wire [7:0] LPTdata, RAM0data, RAM1data, dadosW, dadosR, dadosRAM0, dadosRAM1, xptdata, AD1red, AD2red;
//datapath busses

assign RAMfail=~(xptdata==dadosR);
assign AdMax0=(AddrRAM1==19’b1111111111111111111);
assign AdMax1=(AddrRAM2==19’b1111111111111111111);
assign AD1red=AddrRAM1[7:0];
assign AD2red=AddrRAM2[7:0]; //reduç~
ao de granularidade
assign CounterReset=reset|RST;
assign Cnt0clk=BISTbusy?incrAD0:W17AUTOfeed;
assign Cnt1clk=BISTbusy?incrAD1:W17AUTOfeed;

// pinos de comando da SRAM


assign SRAM0_LB = ~D19selRAM&(~BISTbusy);
assign SRAM1_LB = ~SRAM0_LB&(~BISTbusy);
assign SRAM0_WE = (~F18rdwrRAM|SRAM0_LB)&RAM0we;
assign SRAM1_WE = (~F18rdwrRAM|SRAM1_LB)&RAM1we;
assign SRAM0_CS = BISTbusy?RAM0cs:~W16strobe;
assign SRAM1_CS = BISTbusy?RAM1cs:~W16strobe;

assign BIST3state=BISTbusy?1’b1:F18rdwrRAM;
assign LPTdata = BIST3state?8’bZ:dadosR; // inferir IOBUF ;tristate@LPT
assign dadosW = LPTdata;

assign RAMallSEL=BISTbusy?1’b0:F18rdwrRAM;
assign RAM0data = RAMallSEL?dadosW:8’bZ; // inferir IOBUF ;tristate@SRAM1
assign RAM0data=(BISTbusy&RAM0cs)?AD2red:8’bZ; // path de escrita dos endereços que falham
assign dadosRAM0 = RAM0data;

assign RAM1data = RAMallSEL?dadosW:8’bZ; // inferir IOBUF ;tristate@SRAM2


assign RAM1data=(BISTbusy&RAM1cs)?AD1red:8’bZ; // path de escrita dos endereços que falham
assign dadosRAM1 = RAM1data;

assign RAM_select=BISTbusy?blocoSEL:SRAM1_LB;
assign dadosR = RAM_select?dadosRAM0:dadosRAM1; // inferir databus MUX 2:1

always @(posedge Cnt0clk or posedge CounterReset) // contador de endereços da RAM1


begin
if (CounterReset)
AddrRAM1 = 0;
else
AddrRAM1 = AddrRAM1 + 1;
end

always @(posedge Cnt1clk or posedge CounterReset) // contador de endereços da RAM2


begin
if (CounterReset)
AddrRAM2 = 0;
else
AddrRAM2 = AddrRAM2 + 1;
end

// MaquinaEstadosBIST(clk,reset,STBIST1,STBIST2,RAMfail,AdMax0,AdMax1,blocoSEL,incrAD0,incrAD1,BISTbusy,BISTdone,
// BISTfail,RST,RAM0we,RAM1we,RAM0cs,RAM1cs);

always@(posedge reset or posedge clk)

begin
if (reset) begin
96 Código Verilog desenvolvido

estado<=5’b00000;
blocoSEL<=0; //0 = primeiro bloco
incrAD0<=1;
incrAD1<=1;
BISTbusy<=0;
BISTdone<=0;
BISTfail<=0;
RST<=0;
RAM0we<=1;
RAM1we<=1;
RAM0cs<=1;
RAM1cs<=1;
end

else // posedge clk


case (estado)
5’b00000: begin
if (!STBIST1||!STBIST2)
estado <= 5’b00001; //inicio do Auto-teste
else
estado <= 5’b00000;
end
5’b00001: begin
BISTbusy<=1; // teste flag
if (!STBIST1)
estado <= 5’b00010; //testa o primeiro bloco
else
estado <= 5’b10010; //testa o segundo bloco
end
5’b00010: begin
blocoSEL<=0; //0 = primeiro bloco
RAM0cs<=0; // low enable para leitura, LB1/2 a low com BISTbusy
RAM1we<=0; // bloco2 de resultados fica em modo da escrita
estado <= 5’b00011;
end
5’b00011: begin
incrAD0<=0;
estado <= 5’b00100;
end
5’b00100: begin
if (RAMfail) // esperou pelo tempo de acesso (TAA=10ns)
estado <= 5’b00111; //falhou
else
estado <= 5’b00101; //passou
end
5’b00101: begin
if (AdMax0)
estado <= 5’b00110; //endereço máximo e fim de teste
else
begin
incrAD0<=1; // incrementa endereço do bloco em teste
estado <= 5’b00011; //continua
end
end
5’b00110: begin
BISTbusy<=0;
BISTdone<=1; // fim de teste
estado <= 5’b00110; // em loop até ao reset
end
5’b00111: begin // registo de falhas do BIST em espelho
BISTfail<=1; // seta a flag de falha,
RAM1cs<=0; //grava o endereço de falha no outro bloco
estado <= 5’b01000;
end
5’b01000: begin
RAM1cs<=1; // fim de ciclo de escrita (com tW=40ns)
incrAD1<=0;
estado <= 5’b01001; //
end
5’b01001: begin
if (AdMax1)
estado <= 5’b00110; //esgotou memória de resultados (falha catastrófica)
else
begin
incrAD1<=1; // incrementa os endereços da memoria de resultados
estado <= 5’b00011; //continua
end
Código Verilog desenvolvido 97

end

5’b10010: begin
blocoSEL<=1; //1 = segundo bloco *****************************************
RAM1cs<=0; // CS0=low enable para leitura, LB1/2 a low com BISTbusy
RAM0we<=0; // bloco1 de resultados fica em modo da escrita
estado <= 5’b10011;
end
5’b10011: begin
incrAD1<=0;
estado <= 5’b10100;
end
5’b10100: begin
if (RAMfail) // esperou pelo tempo de acesso (TAA=10ns)
estado <= 5’b10111; //falhou
else
estado <= 5’b10101; //passou
end
5’b10101: begin
if (AdMax1)
estado <= 5’b00110; //endereço máximo e fim de teste
else
begin
incrAD1<=1; // incrementa endereço do bloco em teste
estado <= 5’b10011; //continua
end
end

5’b10111: begin // registo de falhas do BIST em espelho


BISTfail<=1; // seta a flag de falha,
RAM0cs<=0; //grava o endereço de falha no outro bloco
estado <= 5’b11000;
end
5’b11000: begin
RAM0cs<=1; // fim de ciclo de escrita (com tW=40ns)
incrAD0<=0;
estado <= 5’b11001; //
end
5’b11001: begin
if (AdMax0)
estado <= 5’b00110; //esgotou memória de resultados (falha catastrófica)
else
begin
incrAD0<=1; // incrementa os endereços da memoria de resultados
estado <= 5’b10011; //continua
end
end

default: begin
estado <= 5’b00000;
end
endcase
end

endmodule

***************************************************************************************
module RefreshBISR(clk, DCMclk, reset, teste, F18rd, vector, RAMdata, ras, cas, we, busy, done, LPTdata,sswitch);

input clk, DCMclk, reset, teste, F18rd, sswitch;


input [7:0] vector; // DIP switch

inout [7:0] RAMdata;

output ras, cas, we, busy, done;


output [7:0] LPTdata;

wire clk, DCMclk, clk_TMU, dogdark, passou, sswitch;


wire [7:0] vector, LPTdata, RAMdata, Rdados;

reg ras, cas, we, busy, done, enableDog, zeraTempo, lerEN;


reg [3:0] estado;
reg [17:0] contar;
98 Código Verilog desenvolvido

reg [7:0] watchdog, ValorMax, RAMread;

assign clk_TMU=contar[17]; // divide 32.768MHz por 2^18 = 125Hz <=> 8ms de resoluç~
ao do TMU

assign dogbark=(watchdog==ValorMax); // 1=Fim de contagem


assign passou=(vector==Rdados); // verificar se o conteudo da DRAM de degradou

assign LPTdata =F18rd?8’bZ:ValorMax; // ler o valor de retenç~


ao com strobe nInit

assign RAMdata =we?8’bZ:vector; // we=0 coloca o vector de teste no bus de dados para escrita
assign Rdados = RAMdata;

always@(posedge reset or posedge clk)

begin
if (reset) begin
estado<=4’b0000;
we<=0; // manter a DRAM com [d0:d7] em 3state
busy<=0;
done<=0;
zeraTempo<=0;
lerEN<=0;
ValorMax<=0;
end

else // posedge clk


case (estado)
4’b0000: begin
if (teste)
begin
ras<=1;
cas<=1;
estado <= 4’b0001; //inicio do teste
end
else
estado <= 4’b0000;
end
4’b0001: begin
busy<=1;
we<=1;
estado <= 4’b0010;
end

4’b0010: begin
ras<=0; // inicio do tRC (random read/write cycle time)
estado <= 4’b0011;
end

4’b0011: begin
we<=0;
estado <= 4’b0100;
end
4’b0100: begin
cas<=0; //tRCD=40ns (row to column delay)
estado <= 4’b0101;
end
4’b0101: begin
we<=1; // tWCH=20ns (write command hold time); dados escritos na DRAM
estado <= 4’b0110;
end

4’b0110: begin
ras<=1; // tRAS=80ns (RAS pulse width) MAX=10us *******
cas<=1; // tCAS=40ns (CAS pulse width) MAX=10us
estado <= 4’b0111;
end

4’b0111: begin // fase de leitura e calculo do tempo de retenç~


ao utilizando "hidden refresh"
ras<=0; //tCRP=20ns (CAS to RAS precharge time)
estado <= 4’b1000;
end

4’b1000: begin
cas<=0; // tRCD=20ns (RAS to CAS delay time) *****
estado <= 4’b1001;
end
Código Verilog desenvolvido 99

4’b1001: begin
zeraTempo<=1; //limpa contador do c~
ao de guarda
estado <= 4’b1010; // +40 para cumprir os 80ns de tRAS
end

4’b1010: begin
lerEN <= 1; // amostrar RAM data para o comparador
zeraTempo<=0; // c~
ao de guarda "ready"
estado <= 4’b1011; // +60 para cumprir os 80ns de tRAS
end

4’b1011: begin // ler a DRAM


lerEN <= 0; // amostragem de RAM data done
ras<=1; //tRAS=80ns
estado <= 4’b1100;
end

4’b1100: begin
cas<=1; // tOFF=20ns (output buffer turn off delay) data out =3state
if (passou)
estado <= 4’b1101;
else
estado <= 4’b1111; // valor lido <> do escrito .. dados degradados

end

4’b1101: begin
if (ValorMax==8’b11111111)
estado <= 4’b1111; // retenç~
ao máxima atingida : overload STOP
else
begin
ValorMax <= ValorMax + 1;
enableDog <=1; // enable c~ao de guarda
estado <= 4’b1110;
end
end

4’b1110: begin
if
(dogbark&sswitch) // c~
ao de guarda disparou
begin
enableDog<=0;
estado <= 4’b0110; // volta a l^
er e a realizar um refrescamento escondido
end
else
estado <= 4’b1110; // repetir até ao disparo do Dog, esperando pela violaç~
ao de tRet.
end

4’b1111: begin // falhou e fica a esperar pelo reset


busy<=0;
done<=1;
estado <= 4’b1111;
end

default: begin
estado <= 4’b0000;
end
endcase
end

always @(posedge lerEN) RAMread<= Rdados; //Dff para amostragem de dados da RAM

always @(posedge DCMclk or posedge reset) // gerador de base de tempo do TMU


begin
if (reset)
contar <= 0;
else
contar <= contar + 1;
end

always @(posedge clk_TMU or posedge zeraTempo) // contador de c~


ao de guarda (watchdog timer)
begin
if (zeraTempo)
watchdog <= 0;
100 Código Verilog desenvolvido

else
if (enableDog)
watchdog <= watchdog + 1;

end

endmodule

***********************************************************************
module LEDroda(increment, reset, saida);
// detector de actividade utilizado como ferramenta de debug
input increment, reset;
output [5:0] saida;
reg [5:0] saida;
reg [2:0] estado;

always@(posedge reset or posedge increment)


begin
if (reset) estado <= 3’b000;
else
case (estado)
3’b000: begin
estado <= 3’b001;
saida <= 6’b000001;
end
3’b001: begin
estado <= 3’b010;
saida <= 6’b000010;
end
3’b010: begin
estado <= 3’b011;
saida <= 6’b000100;
end
3’b011: begin
estado <= 3’b100;
saida <= 6’b001000;
end
3’b100: begin
estado <= 3’b101;
saida <= 6’b010000;
end
3’b101: begin
estado <= 3’b000;
saida <= 6’b100000;
end

default: begin
estado <= 3’b000;
saida <= 6’b000001;
end
endcase
end

endmodule
*************************************************************

// Engineer: Alberto Barroso


//
// Create Date: 2008
// Design Name:
// Module Name: RefreshBISR External
// Project Name:
// Target Devices:
// Tool versions:
// Description: verificaç~
ao de valores de retenç~
ao das células com
// setup para FPM
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////

module RefreshBISR(clk, DCMclk, clockAC, reset, resetAC, teste, F18rd, vector, RAMdata,
ras, cas, we, busy, done, LPTdata,RAMaddr,sswitch);
Código Verilog desenvolvido 101

input clk, DCMclk, reset, teste, F18rd, sswitch,clockAC,resetAC;


input [7:0] vector; // DIP switch

inout [7:0] RAMdata;

output ras, cas, we, busy, done;


output [7:0] LPTdata;
output [9:0] RAMaddr;

wire clk, DCMclk, clk_TMU, dogdark, passou, sswitch;


wire [7:0] vector, LPTdata, RAMdata, Rdados, vectorW;
wire [9:0] RAMaddr;

reg ras, cas, we, busy, done, enableDog, zeraTempo, lerEN, invADDR, invDATA, invFlag;
reg [4:0] estado;
reg [3:0] Icnt;
reg [17:0] contar;
reg [9:0] ACdata;
reg [7:0] watchdog, ValorMax, RAMread;

assign clk_TMU=contar[17]; // divide 32.768MHz por 2^18 = 125Hz <=> 8ms de resoluç~
ao do TMU
assign RAMaddr=invADDR?~ACdata:ACdata; // inferir um inversor programável (XOR)
assign vectorW =invDATA?~vector:vector;

assign dogbark=(watchdog==ValorMax); // 1=Fim de contagem


assign passou=(vector==Rdados); // verificar se o conteudo da DRAM de degradou

assign LPTdata =F18rd?8’bZ:ValorMax; // ler o valor de retenç~


ao com strobe nInit

assign RAMdata =we?8’bZ:vectorW; // we=0 coloca o vector de teste no bus de dados para escrita
assign Rdados = RAMdata;

always@(posedge reset or posedge clk)

begin
if (reset) begin
estado<=5’b00000;
Icnt<=0;
we<=1;
ras<=1;
cas<=1;
busy<=0;
done<=0;
zeraTempo<=0;
lerEN<=0;
ValorMax<=0;
invADDR<=0;
invDATA<=0;
invFlag<=1;
end

else // posedge clk


case (estado)
5’b00000: begin
if (teste)
begin
estado <= 5’b00001; //inicio do teste
end
else
estado <= 5’b00000;
end
5’b00001: begin
busy<=1;
estado <= 5’b10001; //Powerup of DRAM
end

5’b00010: begin
ras<=0; // inicio do tRC (random read/write cycle time)
estado <= 5’b00011;
end

5’b00011: begin
we<=0;
estado <= 5’b00100;
end
5’b00100: begin
102 Código Verilog desenvolvido

cas<=0; //tRCD=40ns (row to column delay)


estado <= 5’b00101;
end
5’b00101: begin
we<=1; // tWCH=20ns (write command hold time); dados escritos na DRAM
estado <= 5’b00110;
end

5’b00110: begin
ras<=1; // tRAS=80ns (RAS pulse width) MAX=10us *******
cas<=1; // tCAS=40ns (CAS pulse width) MAX=10us
if (invFlag)
estado <= 5’b00111;
else
estado <=5’b10000; // escreve dados opostos nos ADDR opostos
end

5’b00111: begin // fase de leitura e calculo do tempo de retenç~


ao utilizando "hidden refresh"
invADDR<=0; // endereços NI
invDATA<=0; // dados NI
ras<=0; //tCRP=20ns (CAS to RAS precharge time)
estado <= 5’b01000;
end

5’b01000: begin
cas<=0; // tRCD=20ns (RAS to CAS delay time) *****
estado <= 5’b01001;
end

5’b01001: begin
zeraTempo<=1; //limpa contador do c~
ao de guarda
estado <= 5’b01010; // +40 para cumprir os 80ns de tRAS
end

5’b01010: begin
lerEN <= 1; // amostrar RAM data para o comparador
zeraTempo<=0; // c~
ao de guarda "ready"
estado <= 5’b01011; // +60 para cumprir os 80ns de tRAS
end

5’b01011: begin // ler a DRAM


lerEN <= 0; // amostragem de RAM data done
ras<=1; //tRAS=80ns
estado <= 5’b01100;
end

5’b01100: begin
cas<=1; // tOFF=20ns (output buffer turn off delay) data out =3state
if (passou)
begin
estado <= 5’b01101;
end
else
estado <= 5’b01111; // valor lido <> do escrito .. dados degradados

end

5’b01101: begin
if (ValorMax==8’b11111111)
estado <= 5’b01111; // retenç~
ao máxima atingida : overload STOP
else
begin
ValorMax <= ValorMax + 1;
enableDog <=1; // enable c~ao de guarda
estado <= 5’b01110;
end
end

5’b01110: begin
if
(dogbark&sswitch) // c~
ao de guarda disparou
begin
enableDog<=0;
estado <= 5’b00110; // volta a l^
er e a realizar um refrescamento escondido
end
else
estado <= 5’b01110; // repetir até ao disparo do Dog, esperando pela violaç~
ao de tRet.
Código Verilog desenvolvido 103

end

5’b01111: begin // falhou e fica a esperar pelo reset


busy<=0;
done<=1;
estado <= 5’b01111;
end

5’b10000: begin
invADDR<=1; // inverte os endereços
invDATA<=0; // inverte os dados
invFlag<=1; //done
estado <= 5’b00001; // volta a escrever
end

5’b10001: begin // Powerup of DRAM ###################


we<=1;
ras<=1;
cas<=1;
estado <= 5’b10010;
end

5’b10010: begin
cas<=0; //CBR refresh
ras<=1;
estado <= 5’b10011;
end

5’b10011: begin
ras<=1; //tRP=20ns
estado <= 5’b10100;
end

5’b10100: begin
ras<=1; //tRP=40ns
estado <= 5’b10101;
end

5’b10101: begin
ras<=1; //tRP=60ns
estado <= 5’b10110;
end

5’b10110: begin
ras<=0;
estado <= 5’b10111;
end

5’b10111: begin
ras<=0; //tRAS=20ns
estado <= 5’b11000;
end

5’b11000: begin
ras<=0; //tRAS=40ns
estado <= 5’b11001;
end

5’b11001: begin
ras<=0; //tRAS=60ns
estado <= 5’b11010;
end

5’b11010: begin
ras<=0; //tRAS=80ns
estado <= 5’b11011;
Icnt<=Icnt+1;
end

5’b11011: begin
ras<=1;
if (Icnt==4’b1010)
begin
cas<=1;
estado <= 5’b00010;
end
else
104 Código Verilog desenvolvido

estado <= 5’b10011;

end

default: begin
estado <= 5’b00000;
end
endcase
end

always @(posedge lerEN) RAMread<= Rdados; //Dff para amostragem de dados da RAM

always @(posedge DCMclk or posedge reset) // gerador de base de tempo do TMU


begin
if (reset)
contar <= 0;
else
contar <= contar + 1;
end

always @(posedge clk_TMU or posedge zeraTempo) // contador de c~


ao de guarda (watchdog timer)
begin
if (zeraTempo)
watchdog <= 0;
else
if (enableDog)
watchdog <= watchdog + 1;

end

always @(posedge clockAC or posedge resetAC)


if (resetAC)
ACdata <= 0;
else
ACdata <= ACdata + 1;

endmodule
Anexo C

Módulos TOP e relatórios gerados


pelas ferramentas CAD utilizadas

105
106 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas

########################
Synopsys Design Compiler
########################

****************************************
Report : area
Design : DataPathSemBIST
Version: Y-2006.06
Date : Thu Jun 26 11:29:06 2008
****************************************

Library(s) Used:

c35_CORELIB (File: /home/cdsmgr/cad/libs/ams/ams_v3.70/synopsys/c35_3.3V/c35_CORELIB.db)

Number of ports: 70
Number of nets: 134
Number of cells: 94
Number of references: 10

Combinational area: 10665.199219


Noncombinational area: 11757.203125
Net Interconnect area: 3222.000000

Total cell area: 22422.400391


Total area: 25644.400391

****************************************

module DataPathSemBIST_DW01_inc_1 ( A, SUM );


input [18:0] A;
output [18:0] SUM;
wire \carry[18] , \carry[17] , \carry[16] , \carry[15] , \carry[14] ,
\carry[13] , \carry[12] , \carry[11] , \carry[10] , \carry[9] ,
\carry[8] , \carry[7] , \carry[6] , \carry[5] , \carry[4] ,
\carry[3] , \carry[2] ;

ADD22 U1_1_17 ( .A(A[17]), .B(\carry[17] ), .CO(\carry[18] ), .S(SUM[17]) );


ADD22 U1_1_16 ( .A(A[16]), .B(\carry[16] ), .CO(\carry[17] ), .S(SUM[16]) );
ADD22 U1_1_15 ( .A(A[15]), .B(\carry[15] ), .CO(\carry[16] ), .S(SUM[15]) );
ADD22 U1_1_14 ( .A(A[14]), .B(\carry[14] ), .CO(\carry[15] ), .S(SUM[14]) );
ADD22 U1_1_13 ( .A(A[13]), .B(\carry[13] ), .CO(\carry[14] ), .S(SUM[13]) );
ADD22 U1_1_12 ( .A(A[12]), .B(\carry[12] ), .CO(\carry[13] ), .S(SUM[12]) );
ADD22 U1_1_11 ( .A(A[11]), .B(\carry[11] ), .CO(\carry[12] ), .S(SUM[11]) );
ADD22 U1_1_10 ( .A(A[10]), .B(\carry[10] ), .CO(\carry[11] ), .S(SUM[10]) );
ADD22 U1_1_9 ( .A(A[9]), .B(\carry[9] ), .CO(\carry[10] ), .S(SUM[9]) );
ADD22 U1_1_8 ( .A(A[8]), .B(\carry[8] ), .CO(\carry[9] ), .S(SUM[8]) );
ADD22 U1_1_7 ( .A(A[7]), .B(\carry[7] ), .CO(\carry[8] ), .S(SUM[7]) );
ADD22 U1_1_6 ( .A(A[6]), .B(\carry[6] ), .CO(\carry[7] ), .S(SUM[6]) );
ADD22 U1_1_5 ( .A(A[5]), .B(\carry[5] ), .CO(\carry[6] ), .S(SUM[5]) );
ADD22 U1_1_4 ( .A(A[4]), .B(\carry[4] ), .CO(\carry[5] ), .S(SUM[4]) );
ADD22 U1_1_3 ( .A(A[3]), .B(\carry[3] ), .CO(\carry[4] ), .S(SUM[3]) );
ADD22 U1_1_2 ( .A(A[2]), .B(\carry[2] ), .CO(\carry[3] ), .S(SUM[2]) );
ADD22 U1_1_1 ( .A(A[1]), .B(A[0]), .CO(\carry[2] ), .S(SUM[1]) );
XOR20 U1 ( .A(\carry[18] ), .B(A[18]), .Q(SUM[18]) );
CLKIN0 U2 ( .A(A[0]), .Q(SUM[0]) );
endmodule

module DataPathSemBIST_DW01_inc_0 ( A, SUM );


input [18:0] A;
output [18:0] SUM;
wire \carry[18] , \carry[17] , \carry[16] , \carry[15] , \carry[14] ,
\carry[13] , \carry[12] , \carry[11] , \carry[10] , \carry[9] ,
\carry[8] , \carry[7] , \carry[6] , \carry[5] , \carry[4] ,
\carry[3] , \carry[2] ;

ADD22 U1_1_17 ( .A(A[17]), .B(\carry[17] ), .CO(\carry[18] ), .S(SUM[17]) );


ADD22 U1_1_16 ( .A(A[16]), .B(\carry[16] ), .CO(\carry[17] ), .S(SUM[16]) );
ADD22 U1_1_15 ( .A(A[15]), .B(\carry[15] ), .CO(\carry[16] ), .S(SUM[15]) );
ADD22 U1_1_14 ( .A(A[14]), .B(\carry[14] ), .CO(\carry[15] ), .S(SUM[14]) );
ADD22 U1_1_13 ( .A(A[13]), .B(\carry[13] ), .CO(\carry[14] ), .S(SUM[13]) );
ADD22 U1_1_12 ( .A(A[12]), .B(\carry[12] ), .CO(\carry[13] ), .S(SUM[12]) );
ADD22 U1_1_11 ( .A(A[11]), .B(\carry[11] ), .CO(\carry[12] ), .S(SUM[11]) );
ADD22 U1_1_10 ( .A(A[10]), .B(\carry[10] ), .CO(\carry[11] ), .S(SUM[10]) );
ADD22 U1_1_9 ( .A(A[9]), .B(\carry[9] ), .CO(\carry[10] ), .S(SUM[9]) );
ADD22 U1_1_8 ( .A(A[8]), .B(\carry[8] ), .CO(\carry[9] ), .S(SUM[8]) );
Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 107

ADD22 U1_1_7 ( .A(A[7]), .B(\carry[7] ), .CO(\carry[8] ), .S(SUM[7]) );


ADD22 U1_1_6 ( .A(A[6]), .B(\carry[6] ), .CO(\carry[7] ), .S(SUM[6]) );
ADD22 U1_1_5 ( .A(A[5]), .B(\carry[5] ), .CO(\carry[6] ), .S(SUM[5]) );
ADD22 U1_1_4 ( .A(A[4]), .B(\carry[4] ), .CO(\carry[5] ), .S(SUM[4]) );
ADD22 U1_1_3 ( .A(A[3]), .B(\carry[3] ), .CO(\carry[4] ), .S(SUM[3]) );
ADD22 U1_1_2 ( .A(A[2]), .B(\carry[2] ), .CO(\carry[3] ), .S(SUM[2]) );
ADD22 U1_1_1 ( .A(A[1]), .B(A[0]), .CO(\carry[2] ), .S(SUM[1]) );
XOR20 U1 ( .A(\carry[18] ), .B(A[18]), .Q(SUM[18]) );
CLKIN0 U2 ( .A(A[0]), .Q(SUM[0]) );
endmodule

module DataPathSemBIST ( reset, F18rdwrRAM, D19selRAM, W17AUTOfeed, SRAM0_LB,


SRAM1_LB, SRAM0_WE, SRAM1_WE, LPTdata, RAM0data, RAM1data, AddrRAM1,
AddrRAM2 );
inout [7:0] LPTdata;
inout [7:0] RAM0data;
inout [7:0] RAM1data;
output [18:0] AddrRAM1;
output [18:0] AddrRAM2;
input reset, F18rdwrRAM, D19selRAM, W17AUTOfeed;
output SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE;
wire N7, N56, N57, N58, N59, N60, N61, N62, N63, N64, N65, N66, N67, N68,
N69, N70, N71, N72, N73, N74, N75, N76, N77, N78, N79, N80, N81, N82,
N83, N84, N85, N86, N87, N88, N89, N90, N91, N92, N93, n49, n50, n51,
n52, n53, n54, n55, n56, n57, n58, n59, n60, n61, n62, n63, n64, n65,
n103, n106, n107, n108, n109, n110, n111, n112, n113;
assign N7 = F18rdwrRAM;

DFC3 \AddrRAM1_reg[0] ( .D(N56), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[0]) );


DFC3 \AddrRAM1_reg[1] ( .D(N57), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[1]) );
DFC3 \AddrRAM1_reg[2] ( .D(N58), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[2]) );
DFC3 \AddrRAM1_reg[3] ( .D(N59), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[3]) );
DFC3 \AddrRAM1_reg[4] ( .D(N60), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[4]) );
DFC3 \AddrRAM1_reg[5] ( .D(N61), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[5]) );
DFC3 \AddrRAM1_reg[6] ( .D(N62), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[6]) );
DFC3 \AddrRAM1_reg[7] ( .D(N63), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[7]) );
DFC3 \AddrRAM1_reg[8] ( .D(N64), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[8]) );
DFC3 \AddrRAM1_reg[9] ( .D(N65), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM1[9]) );
DFC3 \AddrRAM1_reg[10] ( .D(N66), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[10]) );
DFC3 \AddrRAM1_reg[11] ( .D(N67), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[11]) );
DFC3 \AddrRAM1_reg[12] ( .D(N68), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[12]) );
DFC3 \AddrRAM1_reg[13] ( .D(N69), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[13]) );
DFC3 \AddrRAM1_reg[14] ( .D(N70), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[14]) );
DFC3 \AddrRAM1_reg[15] ( .D(N71), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[15]) );
DFC3 \AddrRAM1_reg[16] ( .D(N72), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[16]) );
DFC3 \AddrRAM1_reg[17] ( .D(N73), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[17]) );
DFC3 \AddrRAM1_reg[18] ( .D(N74), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM1[18]) );
DFC3 \AddrRAM2_reg[0] ( .D(N75), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[0]) );
DFC3 \AddrRAM2_reg[1] ( .D(N76), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[1]) );
DFC3 \AddrRAM2_reg[2] ( .D(N77), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[2]) );
DFC3 \AddrRAM2_reg[3] ( .D(N78), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[3]) );
DFC3 \AddrRAM2_reg[4] ( .D(N79), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[4]) );
DFC3 \AddrRAM2_reg[5] ( .D(N80), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[5]) );
DFC3 \AddrRAM2_reg[6] ( .D(N81), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[6]) );
DFC3 \AddrRAM2_reg[7] ( .D(N82), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[7]) );
DFC3 \AddrRAM2_reg[8] ( .D(N83), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[8]) );
DFC3 \AddrRAM2_reg[9] ( .D(N84), .C(W17AUTOfeed), .RN(n103), .Q(AddrRAM2[9]) );
DFC3 \AddrRAM2_reg[10] ( .D(N85), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[10]) );
DFC3 \AddrRAM2_reg[11] ( .D(N86), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[11]) );
DFC3 \AddrRAM2_reg[12] ( .D(N87), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[12]) );
DFC3 \AddrRAM2_reg[13] ( .D(N88), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[13]) );
DFC3 \AddrRAM2_reg[14] ( .D(N89), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[14]) );
108 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas

DFC3 \AddrRAM2_reg[15] ( .D(N90), .C(W17AUTOfeed), .RN(n103), .Q(


AddrRAM2[15]) );
DFC3 \AddrRAM2_reg[16] ( .D(N91), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[16]) );
DFC3 \AddrRAM2_reg[17] ( .D(N92), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[17]) );
DFC3 \AddrRAM2_reg[18] ( .D(N93), .C(W17AUTOfeed), .RN(n103), .Q(
AddrRAM2[18]) );
DataPathSemBIST_DW01_inc_0 add_70 ( .A(AddrRAM2), .SUM({N93, N92, N91, N90,
N89, N88, N87, N86, N85, N84, N83, N82, N81, N80, N79, N78, N77, N76,
N75}) );
DataPathSemBIST_DW01_inc_1 add_61 ( .A(AddrRAM1), .SUM({N74, N73, N72, N71,
N70, N69, N68, N67, N66, N65, N64, N63, N62, N61, N60, N59, N58, N57,
N56}) );
BUFE2 \RAM1data_tri[0] ( .A(n65), .E(N7), .Q(RAM1data[0]) );
BUFE2 \RAM1data_tri[1] ( .A(n64), .E(N7), .Q(RAM1data[1]) );
BUFE2 \RAM1data_tri[2] ( .A(n63), .E(N7), .Q(RAM1data[2]) );
BUFE2 \RAM1data_tri[3] ( .A(n62), .E(N7), .Q(RAM1data[3]) );
BUFE2 \RAM1data_tri[4] ( .A(n61), .E(N7), .Q(RAM1data[4]) );
BUFE2 \RAM1data_tri[5] ( .A(n60), .E(N7), .Q(RAM1data[5]) );
BUFE2 \RAM1data_tri[6] ( .A(n59), .E(N7), .Q(RAM1data[6]) );
BUFE2 \RAM1data_tri[7] ( .A(n58), .E(N7), .Q(RAM1data[7]) );
BUFE2 \RAM0data_tri[0] ( .A(n65), .E(N7), .Q(RAM0data[0]) );
BUFE2 \RAM0data_tri[1] ( .A(n64), .E(N7), .Q(RAM0data[1]) );
BUFE2 \RAM0data_tri[2] ( .A(n63), .E(N7), .Q(RAM0data[2]) );
BUFE2 \RAM0data_tri[3] ( .A(n62), .E(N7), .Q(RAM0data[3]) );
BUFE2 \RAM0data_tri[4] ( .A(n61), .E(N7), .Q(RAM0data[4]) );
BUFE2 \RAM0data_tri[5] ( .A(n60), .E(N7), .Q(RAM0data[5]) );
BUFE2 \RAM0data_tri[6] ( .A(n59), .E(N7), .Q(RAM0data[6]) );
BUFE2 \RAM0data_tri[7] ( .A(n58), .E(N7), .Q(RAM0data[7]) );
BUFE2 \LPTdata_tri[0] ( .A(n57), .E(n50), .Q(LPTdata[0]) );
BUFE2 \LPTdata_tri[1] ( .A(n56), .E(n50), .Q(LPTdata[1]) );
BUFE2 \LPTdata_tri[2] ( .A(n55), .E(n50), .Q(LPTdata[2]) );
BUFE2 \LPTdata_tri[3] ( .A(n54), .E(n50), .Q(LPTdata[3]) );
BUFE2 \LPTdata_tri[4] ( .A(n53), .E(n50), .Q(LPTdata[4]) );
BUFE2 \LPTdata_tri[5] ( .A(n52), .E(n50), .Q(LPTdata[5]) );
BUFE2 \LPTdata_tri[6] ( .A(n51), .E(n50), .Q(LPTdata[6]) );
BUFE2 \LPTdata_tri[7] ( .A(n49), .E(n50), .Q(LPTdata[7]) );
INV3 U41 ( .A(N7), .Q(n50) );
INV6 U42 ( .A(reset), .Q(n103) );
BUF2 U43 ( .A(D19selRAM), .Q(SRAM1_LB) );
CLKIN0 U44 ( .A(n106), .Q(n65) );
NAND20 U45 ( .A(LPTdata[0]), .B(N7), .Q(n106) );
CLKIN0 U46 ( .A(n107), .Q(n64) );
NAND20 U47 ( .A(LPTdata[1]), .B(N7), .Q(n107) );
CLKIN0 U48 ( .A(n108), .Q(n63) );
NAND20 U49 ( .A(LPTdata[2]), .B(N7), .Q(n108) );
CLKIN0 U50 ( .A(n109), .Q(n62) );
NAND20 U51 ( .A(LPTdata[3]), .B(N7), .Q(n109) );
CLKIN0 U52 ( .A(n110), .Q(n61) );
NAND20 U53 ( .A(LPTdata[4]), .B(N7), .Q(n110) );
CLKIN0 U54 ( .A(n111), .Q(n60) );
NAND20 U55 ( .A(LPTdata[5]), .B(N7), .Q(n111) );
CLKIN0 U56 ( .A(n112), .Q(n59) );
NAND20 U57 ( .A(LPTdata[6]), .B(N7), .Q(n112) );
CLKIN0 U58 ( .A(n113), .Q(n58) );
NAND20 U59 ( .A(LPTdata[7]), .B(N7), .Q(n113) );
MUX21 U60 ( .A(RAM1data[0]), .B(RAM0data[0]), .S(D19selRAM), .Q(n57) );
MUX21 U61 ( .A(RAM1data[1]), .B(RAM0data[1]), .S(D19selRAM), .Q(n56) );
MUX21 U62 ( .A(RAM1data[2]), .B(RAM0data[2]), .S(D19selRAM), .Q(n55) );
MUX21 U63 ( .A(RAM1data[3]), .B(RAM0data[3]), .S(D19selRAM), .Q(n54) );
MUX21 U64 ( .A(RAM1data[4]), .B(RAM0data[4]), .S(D19selRAM), .Q(n53) );
MUX21 U65 ( .A(RAM1data[5]), .B(RAM0data[5]), .S(D19selRAM), .Q(n52) );
MUX21 U66 ( .A(RAM1data[6]), .B(RAM0data[6]), .S(D19selRAM), .Q(n51) );
MUX21 U67 ( .A(RAM1data[7]), .B(RAM0data[7]), .S(D19selRAM), .Q(n49) );
NAND20 U68 ( .A(N7), .B(SRAM0_LB), .Q(SRAM1_WE) );
NAND20 U69 ( .A(D19selRAM), .B(N7), .Q(SRAM0_WE) );
CLKIN0 U70 ( .A(D19selRAM), .Q(SRAM0_LB) );
endmodule

########################
Cadence SOC Encounter
########################
DataPathSemBIST:

@(#)CDS: First Encounter v05.20-p002_1 (32bit) 12/09/2005 23:25 (Linux 2.4)


@(#)CDS: NanoRoute v05.20-p006 NR051206-1452/USR35-UB (database version 2.30, 31) {superthreading v1.4}
Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 109

@(#)CDS: CeltIC BID_CNDC52_V05_20_P009_1 Dec 7 2005 14:31:08 (lnx86_gcc3_ia32)


@(#)CDS: CTE v05.20-p007_1
--- Starting "First Encounter v05.20-p002_1" on Thu Jun 26 12:28:29 (mem=37.7M) ---
--- Running on i02cp2106 (i686 w/Linux 2.6.18-8.el5) ---

*** Starting "NanoPlace(TM) placement v0.545.4.4 (mem=123.8M)" ...


options: glbDetour reduceNode obstruct2 obstruct4 spreadOut multiOuterRow moveTermZ spacingTable
pinAndObsSpacing multiVoidRow noPinGuide honorNetRTLayer wideBlockageSpacing MSLayer saveMemory
Options: ignoreSpare pinGuide gp=mq-medium dp=medium
#std cell=154 #block=0 (0 floating + 0 preplaced) #ioInst=4 #net=168 #term=526
#term/net=3.13, #fixedIo=4, #floatIo=0, #fixedPin=0, #floatPin=70
Total standard cell length = 1.7920 (mm), area = 0.0233 (mm^2)
Average module density = 0.885.
Density for the design = 0.885.
= stdcell_area 1232 (22422 um^2) / alloc_area 1392 (25334 um^2).
*Fixed term percentage = 11.041%
*Fixed term center of gravity = (0 0) in coreBox (81200 80600, 250300 236600)
*Internal placement parameters: 0.050 | 6 | 0x000005

########################
Synopsys Design Compiler
########################

****************************************
Report : area
Design : DataPathComBIST
Version: Y-2006.06
Date : Thu Jun 26 12:03:36 2008
****************************************

Library(s) Used:

c35_CORELIB (File: /home/cdsmgr/cad/libs/ams/ams_v3.70/synopsys/c35_3.3V/c35_CORELIB.db)

Number of ports: 87
Number of nets: 307
Number of cells: 246
Number of references: 33

Combinational area: 20511.384766


Noncombinational area: 16780.404297
Net Interconnect area: 6795.000000

Total cell area: 37291.800781


Total area: 44086.800781

***************************************************************************

module DataPathComBIST_DW01_inc_1 ( A, SUM );


input [18:0] A;
output [18:0] SUM;
wire \carry[18] , \carry[17] , \carry[16] , \carry[15] , \carry[14] ,
\carry[13] , \carry[12] , \carry[11] , \carry[10] , \carry[9] ,
\carry[8] , \carry[7] , \carry[6] , \carry[5] , \carry[4] ,
\carry[3] , \carry[2] ;

ADD22 U1_1_17 ( .A(A[17]), .B(\carry[17] ), .CO(\carry[18] ), .S(SUM[17]) );


ADD22 U1_1_16 ( .A(A[16]), .B(\carry[16] ), .CO(\carry[17] ), .S(SUM[16]) );
ADD22 U1_1_15 ( .A(A[15]), .B(\carry[15] ), .CO(\carry[16] ), .S(SUM[15]) );
ADD22 U1_1_14 ( .A(A[14]), .B(\carry[14] ), .CO(\carry[15] ), .S(SUM[14]) );
ADD22 U1_1_13 ( .A(A[13]), .B(\carry[13] ), .CO(\carry[14] ), .S(SUM[13]) );
ADD22 U1_1_12 ( .A(A[12]), .B(\carry[12] ), .CO(\carry[13] ), .S(SUM[12]) );
ADD22 U1_1_11 ( .A(A[11]), .B(\carry[11] ), .CO(\carry[12] ), .S(SUM[11]) );
ADD22 U1_1_10 ( .A(A[10]), .B(\carry[10] ), .CO(\carry[11] ), .S(SUM[10]) );
ADD22 U1_1_9 ( .A(A[9]), .B(\carry[9] ), .CO(\carry[10] ), .S(SUM[9]) );
ADD22 U1_1_8 ( .A(A[8]), .B(\carry[8] ), .CO(\carry[9] ), .S(SUM[8]) );
ADD22 U1_1_7 ( .A(A[7]), .B(\carry[7] ), .CO(\carry[8] ), .S(SUM[7]) );
ADD22 U1_1_6 ( .A(A[6]), .B(\carry[6] ), .CO(\carry[7] ), .S(SUM[6]) );
ADD22 U1_1_5 ( .A(A[5]), .B(\carry[5] ), .CO(\carry[6] ), .S(SUM[5]) );
ADD22 U1_1_4 ( .A(A[4]), .B(\carry[4] ), .CO(\carry[5] ), .S(SUM[4]) );
ADD22 U1_1_3 ( .A(A[3]), .B(\carry[3] ), .CO(\carry[4] ), .S(SUM[3]) );
ADD22 U1_1_2 ( .A(A[2]), .B(\carry[2] ), .CO(\carry[3] ), .S(SUM[2]) );
ADD22 U1_1_1 ( .A(A[1]), .B(A[0]), .CO(\carry[2] ), .S(SUM[1]) );
XOR20 U1 ( .A(\carry[18] ), .B(A[18]), .Q(SUM[18]) );
CLKIN0 U2 ( .A(A[0]), .Q(SUM[0]) );
endmodule
110 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas

module DataPathComBIST_DW01_inc_0 ( A, SUM );


input [18:0] A;
output [18:0] SUM;
wire \carry[18] , \carry[17] , \carry[16] , \carry[15] , \carry[14] ,
\carry[13] , \carry[12] , \carry[11] , \carry[10] , \carry[9] ,
\carry[8] , \carry[7] , \carry[6] , \carry[5] , \carry[4] ,
\carry[3] , \carry[2] ;

ADD22 U1_1_17 ( .A(A[17]), .B(\carry[17] ), .CO(\carry[18] ), .S(SUM[17]) );


ADD22 U1_1_16 ( .A(A[16]), .B(\carry[16] ), .CO(\carry[17] ), .S(SUM[16]) );
ADD22 U1_1_15 ( .A(A[15]), .B(\carry[15] ), .CO(\carry[16] ), .S(SUM[15]) );
ADD22 U1_1_14 ( .A(A[14]), .B(\carry[14] ), .CO(\carry[15] ), .S(SUM[14]) );
ADD22 U1_1_13 ( .A(A[13]), .B(\carry[13] ), .CO(\carry[14] ), .S(SUM[13]) );
ADD22 U1_1_12 ( .A(A[12]), .B(\carry[12] ), .CO(\carry[13] ), .S(SUM[12]) );
ADD22 U1_1_11 ( .A(A[11]), .B(\carry[11] ), .CO(\carry[12] ), .S(SUM[11]) );
ADD22 U1_1_10 ( .A(A[10]), .B(\carry[10] ), .CO(\carry[11] ), .S(SUM[10]) );
ADD22 U1_1_9 ( .A(A[9]), .B(\carry[9] ), .CO(\carry[10] ), .S(SUM[9]) );
ADD22 U1_1_8 ( .A(A[8]), .B(\carry[8] ), .CO(\carry[9] ), .S(SUM[8]) );
ADD22 U1_1_7 ( .A(A[7]), .B(\carry[7] ), .CO(\carry[8] ), .S(SUM[7]) );
ADD22 U1_1_6 ( .A(A[6]), .B(\carry[6] ), .CO(\carry[7] ), .S(SUM[6]) );
ADD22 U1_1_5 ( .A(A[5]), .B(\carry[5] ), .CO(\carry[6] ), .S(SUM[5]) );
ADD22 U1_1_4 ( .A(A[4]), .B(\carry[4] ), .CO(\carry[5] ), .S(SUM[4]) );
ADD22 U1_1_3 ( .A(A[3]), .B(\carry[3] ), .CO(\carry[4] ), .S(SUM[3]) );
ADD22 U1_1_2 ( .A(A[2]), .B(\carry[2] ), .CO(\carry[3] ), .S(SUM[2]) );
ADD22 U1_1_1 ( .A(A[1]), .B(A[0]), .CO(\carry[2] ), .S(SUM[1]) );
XOR20 U1 ( .A(\carry[18] ), .B(A[18]), .Q(SUM[18]) );
CLKIN0 U2 ( .A(A[0]), .Q(SUM[0]) );
endmodule

module DataPathComBIST ( clk, reset, STBIST1, STBIST2, F18rdwrRAM, D19selRAM,


W17AUTOfeed, W16strobe, xptdata, BISTbusy, BISTdone, BISTfail,
SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE, SRAM0_CS, SRAM1_CS, LPTdata,
RAM0data, RAM1data, AddrRAM1, AddrRAM2 );
input [7:0] xptdata;
inout [7:0] LPTdata;
inout [7:0] RAM0data;
inout [7:0] RAM1data;
output [18:0] AddrRAM1;
output [18:0] AddrRAM2;
input clk, reset, STBIST1, STBIST2, F18rdwrRAM, D19selRAM, W17AUTOfeed,
W16strobe;
output BISTbusy, BISTdone, BISTfail, SRAM0_LB, SRAM1_LB, SRAM0_WE, SRAM1_WE,
SRAM0_CS, SRAM1_CS;
wire n268, Cnt0clk, Cnt1clk, RAM0cs, RAM1cs, N104, N105, N106, N107, N108,
N109, N110, N111, N112, N113, N114, N115, N116, N117, N118, N119,
N120, N121, N122, N123, N124, N125, N126, N127, N128, N129, N130,
N131, N132, N133, N134, N135, N136, N137, N138, N139, N140, N141,
N158, N159, N160, N161, N162, N163, N164, N165, N166, N167, N168,
N169, N170, N171, N172, N173, N174, N175, N176, N177, n62, n63, n64,
n66, n67, n68, n69, n70, n71, n74, n75, n76, n77, n79, n80, n81, n82,
n83, n84, n87, n88, n89, n90, n91, n92, n93, n94, n95, n96, n97, n98,
n99, n100, n101, n102, n103, n104, n105, n106, n107, n108, n109, n110,
n111, n112, n113, n114, n115, n116, n117, n118, n119, n120, n121,
n122, n123, n124, n125, n126, n127, n128, n129, n130, n131, n133,
n134, n135, n136, n137, n138, n139, n140, n141, n142, n143, n144,
n145, n146, n147, n148, n149, n150, n151, n152, n153, n154, n155,
n156, n157, n158, n159, n160, n161, n162, n163, n164, n165, n166,
n167, n168, n169, n170, n173, n176, n177, n178, n179, n180, n181,
n182, n183, n184, n185, n186, n187, n190, n191, n192, n193, n194,
n195, n196, n197, n198, n199, n200, n201, n202, n203, n204, n205,
n206, n207, n208, n209, n210, n211, n212, n213, n214, n237, n246,
n247, n248, n249, n250, n251, n252, n253, n256, n264, n266;
wire [4:0] estado;

DFC3 \estado_reg[0] ( .D(N158), .C(clk), .RN(n237), .Q(estado[0]), .QN(n246) );


DFC3 \AddrRAM1_reg[0] ( .D(N104), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[0])
);
DFC3 \AddrRAM1_reg[1] ( .D(N105), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[1])
);
DFC3 \AddrRAM1_reg[2] ( .D(N106), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[2])
);
DFC3 \AddrRAM1_reg[3] ( .D(N107), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[3])
);
DFC3 \AddrRAM1_reg[4] ( .D(N108), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[4])
);
Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 111

DFC3 \AddrRAM1_reg[5] ( .D(N109), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[5])


);
DFC3 \AddrRAM1_reg[6] ( .D(N110), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[6]),
.QN(n252) );
DFC3 \AddrRAM1_reg[7] ( .D(N111), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[7]),
.QN(n248) );
DFC3 \AddrRAM1_reg[8] ( .D(N112), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[8]),
.QN(n63) );
DFC3 \AddrRAM1_reg[9] ( .D(N113), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[9]),
.QN(n64) );
DFC3 \AddrRAM1_reg[10] ( .D(N114), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[10])
);
DFC3 \AddrRAM1_reg[11] ( .D(N115), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[11]),
.QN(n66) );
DFC3 \AddrRAM1_reg[12] ( .D(N116), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[12]),
.QN(n67) );
DFC3 \AddrRAM1_reg[13] ( .D(N117), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[13]),
.QN(n68) );
DFC3 \AddrRAM1_reg[14] ( .D(N118), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[14]),
.QN(n69) );
DFC3 \AddrRAM1_reg[15] ( .D(N119), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[15]),
.QN(n70) );
DFC3 \AddrRAM1_reg[16] ( .D(N120), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[16]),
.QN(n71) );
DFC3 \AddrRAM1_reg[17] ( .D(N121), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[17])
);
DFC3 \AddrRAM1_reg[18] ( .D(N122), .C(Cnt0clk), .RN(n237), .Q(AddrRAM1[18])
);
DFC3 \AddrRAM2_reg[0] ( .D(N123), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[0])
);
DFC3 \AddrRAM2_reg[1] ( .D(N124), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[1])
);
DFC3 \AddrRAM2_reg[2] ( .D(N125), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[2])
);
DFC3 \AddrRAM2_reg[3] ( .D(N126), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[3])
);
DFC3 \AddrRAM2_reg[4] ( .D(N127), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[4])
);
DFC3 \AddrRAM2_reg[5] ( .D(N128), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[5])
);
DFC3 \AddrRAM2_reg[6] ( .D(N129), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[6]),
.QN(n251) );
DFC3 \AddrRAM2_reg[7] ( .D(N130), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[7]),
.QN(n247) );
DFC3 \AddrRAM2_reg[8] ( .D(N131), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[8]),
.QN(n76) );
DFC3 \AddrRAM2_reg[9] ( .D(N132), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[9]),
.QN(n77) );
DFC3 \AddrRAM2_reg[10] ( .D(N133), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[10])
);
DFC3 \AddrRAM2_reg[11] ( .D(N134), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[11]),
.QN(n79) );
DFC3 \AddrRAM2_reg[12] ( .D(N135), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[12]),
.QN(n80) );
DFC3 \AddrRAM2_reg[13] ( .D(N136), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[13]),
.QN(n81) );
DFC3 \AddrRAM2_reg[14] ( .D(N137), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[14]),
.QN(n82) );
DFC3 \AddrRAM2_reg[15] ( .D(N138), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[15]),
.QN(n83) );
DFC3 \AddrRAM2_reg[16] ( .D(N139), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[16]),
.QN(n84) );
DFC3 \AddrRAM2_reg[17] ( .D(N140), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[17])
);
DFC3 \AddrRAM2_reg[18] ( .D(N141), .C(Cnt1clk), .RN(n237), .Q(AddrRAM2[18])
);
DFC3 \estado_reg[4] ( .D(N162), .C(clk), .RN(n237), .Q(estado[4]), .QN(n250) );
DFC3 \estado_reg[2] ( .D(N160), .C(clk), .RN(n237), .Q(estado[2]), .QN(n249) );
DFC3 \estado_reg[3] ( .D(N161), .C(clk), .RN(n237), .Q(estado[3]) );
OAI212 U7 ( .A(W16strobe), .B(BISTbusy), .C(n90), .Q(SRAM1_CS) );
OAI212 U11 ( .A(W16strobe), .B(BISTbusy), .C(n92), .Q(SRAM0_CS) );
OAI222 U58 ( .A(n122), .B(n134), .C(n124), .D(n135), .Q(n129) );
OAI222 U144 ( .A(RAM0data[3]), .B(n192), .C(RAM1data[3]), .D(n264), .Q(n148)
);
OAI212 U153 ( .A(n102), .B(n88), .C(n89), .Q(n193) );
OAI222 U155 ( .A(n102), .B(n75), .C(BISTbusy), .D(n194), .Q(Cnt1clk) );
OAI222 U156 ( .A(n102), .B(n62), .C(BISTbusy), .D(n194), .Q(Cnt0clk) );
112 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas

DataPathComBIST_DW01_inc_0 add_95 ( .A(AddrRAM2), .SUM({N141, N140, N139,


N138, N137, N136, N135, N134, N133, N132, N131, N130, N129, N128, N127,
N126, N125, N124, N123}) );
DataPathComBIST_DW01_inc_1 add_86 ( .A(AddrRAM1), .SUM({N122, N121, N120,
N119, N118, N117, N116, N115, N114, N113, N112, N111, N110, N109, N108,
N107, N106, N105, N104}) );
DFEP1 incrAD0_reg ( .D(N170), .E(N169), .C(clk), .SN(n237), .QN(n62) );
DFEP1 incrAD1_reg ( .D(N176), .E(N175), .C(clk), .SN(n237), .QN(n75) );
BUFE2 \RAM0data_tri2[0] ( .A(AddrRAM2[0]), .E(n204), .Q(RAM0data[0]) );
BUFE2 \RAM0data_tri2[1] ( .A(AddrRAM2[1]), .E(n204), .Q(RAM0data[1]) );
BUFE2 \RAM0data_tri2[2] ( .A(AddrRAM2[2]), .E(n204), .Q(RAM0data[2]) );
BUFE2 \RAM0data_tri2[3] ( .A(AddrRAM2[3]), .E(n204), .Q(RAM0data[3]) );
BUFE2 \RAM0data_tri2[4] ( .A(AddrRAM2[4]), .E(n204), .Q(RAM0data[4]) );
BUFE2 \RAM0data_tri2[5] ( .A(AddrRAM2[5]), .E(n204), .Q(RAM0data[5]) );
BUFE2 \RAM0data_tri2[6] ( .A(AddrRAM2[6]), .E(n204), .Q(RAM0data[6]) );
BUFE2 \RAM0data_tri2[7] ( .A(AddrRAM2[7]), .E(n204), .Q(RAM0data[7]) );
BUFE2 \RAM0data_tri[0] ( .A(n213), .E(n206), .Q(RAM0data[0]) );
BUFE2 \RAM0data_tri[1] ( .A(n212), .E(n206), .Q(RAM0data[1]) );
BUFE2 \RAM0data_tri[2] ( .A(n211), .E(n206), .Q(RAM0data[2]) );
BUFE2 \RAM0data_tri[3] ( .A(n210), .E(n206), .Q(RAM0data[3]) );
BUFE2 \RAM0data_tri[4] ( .A(n209), .E(n206), .Q(RAM0data[4]) );
BUFE2 \RAM0data_tri[5] ( .A(n208), .E(n206), .Q(RAM0data[5]) );
BUFE2 \RAM0data_tri[6] ( .A(n207), .E(n206), .Q(RAM0data[6]) );
BUFE2 \RAM0data_tri[7] ( .A(n205), .E(n206), .Q(RAM0data[7]) );
BUFE2 \RAM1data_tri2[0] ( .A(AddrRAM1[0]), .E(n214), .Q(RAM1data[0]) );
BUFE2 \RAM1data_tri2[1] ( .A(AddrRAM1[1]), .E(n214), .Q(RAM1data[1]) );
BUFE2 \RAM1data_tri2[2] ( .A(AddrRAM1[2]), .E(n214), .Q(RAM1data[2]) );
BUFE2 \RAM1data_tri2[3] ( .A(AddrRAM1[3]), .E(n214), .Q(RAM1data[3]) );
BUFE2 \RAM1data_tri2[4] ( .A(AddrRAM1[4]), .E(n214), .Q(RAM1data[4]) );
BUFE2 \RAM1data_tri2[5] ( .A(AddrRAM1[5]), .E(n214), .Q(RAM1data[5]) );
BUFE2 \RAM1data_tri2[6] ( .A(AddrRAM1[6]), .E(n214), .Q(RAM1data[6]) );
BUFE2 \RAM1data_tri2[7] ( .A(AddrRAM1[7]), .E(n214), .Q(RAM1data[7]) );
BUFE2 \RAM1data_tri[0] ( .A(n213), .E(n206), .Q(RAM1data[0]) );
BUFE2 \RAM1data_tri[1] ( .A(n212), .E(n206), .Q(RAM1data[1]) );
BUFE2 \RAM1data_tri[2] ( .A(n211), .E(n206), .Q(RAM1data[2]) );
BUFE2 \RAM1data_tri[3] ( .A(n210), .E(n206), .Q(RAM1data[3]) );
BUFE2 \RAM1data_tri[4] ( .A(n209), .E(n206), .Q(RAM1data[4]) );
BUFE2 \RAM1data_tri[5] ( .A(n208), .E(n206), .Q(RAM1data[5]) );
BUFE2 \RAM1data_tri[6] ( .A(n207), .E(n206), .Q(RAM1data[6]) );
BUFE2 \RAM1data_tri[7] ( .A(n205), .E(n206), .Q(RAM1data[7]) );
BUFE2 \LPTdata_tri[0] ( .A(n203), .E(n196), .Q(LPTdata[0]) );
BUFE2 \LPTdata_tri[1] ( .A(n202), .E(n196), .Q(LPTdata[1]) );
BUFE2 \LPTdata_tri[2] ( .A(n201), .E(n196), .Q(LPTdata[2]) );
BUFE2 \LPTdata_tri[3] ( .A(n200), .E(n196), .Q(LPTdata[3]) );
BUFE2 \LPTdata_tri[4] ( .A(n199), .E(n196), .Q(LPTdata[4]) );
BUFE2 \LPTdata_tri[5] ( .A(n198), .E(n196), .Q(LPTdata[5]) );
BUFE2 \LPTdata_tri[6] ( .A(n197), .E(n196), .Q(LPTdata[6]) );
BUFE2 \LPTdata_tri[7] ( .A(n195), .E(n196), .Q(LPTdata[7]) );
DFEP1 RAM0cs_reg ( .D(N167), .E(N166), .C(clk), .SN(n237), .Q(RAM0cs) );
DFEP1 RAM1cs_reg ( .D(N174), .E(N173), .C(clk), .SN(n237), .Q(RAM1cs) );
DFEC1 blocoSEL_reg ( .D(N177), .E(N165), .C(clk), .RN(n237), .QN(n88) );
DFEP1 RAM0we_reg ( .D(n256), .E(N177), .C(clk), .SN(n237), .QN(n87) );
DFEP1 RAM1we_reg ( .D(n256), .E(N168), .C(clk), .SN(n237), .QN(n74) );
DFEC1 BISTdone_reg ( .D(n253), .E(N171), .C(clk), .RN(n237), .Q(BISTdone) );
DFEC1 BISTfail_reg ( .D(n253), .E(N172), .C(clk), .RN(n237), .Q(BISTfail) );
DFEC3 BISTbusy_reg ( .D(N164), .E(N163), .C(clk), .RN(n237), .Q(n268), .QN(
n102) );
DFC1 \estado_reg[1] ( .D(N159), .C(clk), .RN(n237), .Q(estado[1]), .QN(n177) );
TIE1 U163 ( .Q(n253) );
TIE0 U164 ( .Q(n256) );
XNR21 U165 ( .A(n155), .B(xptdata[6]), .Q(n150) );
NOR40 U166 ( .A(n149), .B(n150), .C(n151), .D(n152), .Q(n139) );
OAI222 U167 ( .A(RAM0data[6]), .B(n192), .C(RAM1data[6]), .D(n264), .Q(n155)
);
OAI221 U168 ( .A(RAM0data[1]), .B(n192), .C(RAM1data[1]), .D(n264), .Q(n146)
);
XNR21 U169 ( .A(n156), .B(xptdata[7]), .Q(n149) );
OAI222 U170 ( .A(RAM0data[7]), .B(n192), .C(RAM1data[7]), .D(n264), .Q(n156)
);
XNR21 U171 ( .A(n146), .B(xptdata[1]), .Q(n143) );
NAND41 U172 ( .A(n137), .B(n134), .C(n136), .D(n135), .Q(N159) );
BUF6 U173 ( .A(n193), .Q(n264) );
XNR21 U174 ( .A(n147), .B(xptdata[2]), .Q(n142) );
OAI222 U175 ( .A(RAM0data[2]), .B(n192), .C(RAM1data[2]), .D(n264), .Q(n147)
);
CLKIN2 U176 ( .A(n264), .Q(n192) );
INV0 U177 ( .A(n89), .Q(SRAM1_LB) );
Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 113

INV0 U178 ( .A(n156), .Q(n195) );


INV0 U179 ( .A(n155), .Q(n197) );
INV0 U180 ( .A(n154), .Q(n198) );
INV0 U181 ( .A(n153), .Q(n199) );
INV0 U182 ( .A(n148), .Q(n200) );
INV0 U183 ( .A(n147), .Q(n201) );
INV0 U184 ( .A(n146), .Q(n202) );
INV0 U185 ( .A(n145), .Q(n203) );
OAI220 U186 ( .A(RAM0data[0]), .B(n192), .C(RAM1data[0]), .D(n264), .Q(n145)
);
OAI220 U187 ( .A(RAM0data[5]), .B(n192), .C(RAM1data[5]), .D(n264), .Q(n154)
);
OAI220 U188 ( .A(RAM0data[4]), .B(n192), .C(RAM1data[4]), .D(n264), .Q(n153)
);
BUF2 U189 ( .A(estado[0]), .Q(n266) );
NAND31 U190 ( .A(n177), .B(n249), .C(estado[3]), .Q(n161) );
NAND21 U191 ( .A(F18rdwrRAM), .B(n102), .Q(n94) );
AOI210 U192 ( .A(F18rdwrRAM), .B(n89), .C(n74), .Q(SRAM1_WE) );
INV3 U193 ( .A(n136), .Q(N165) );
NOR21 U194 ( .A(n191), .B(n246), .Q(n126) );
NOR21 U195 ( .A(N168), .B(N177), .Q(n136) );
INV3 U196 ( .A(n135), .Q(N170) );
INV3 U197 ( .A(n134), .Q(N176) );
INV3 U198 ( .A(n107), .Q(N177) );
NAND22 U199 ( .A(n103), .B(n104), .Q(N175) );
NAND31 U200 ( .A(n125), .B(n106), .C(n112), .Q(N161) );
INV3 U201 ( .A(N172), .Q(n125) );
INV3 U202 ( .A(N167), .Q(n112) );
INV3 U203 ( .A(n159), .Q(n119) );
AOI2111 U204 ( .A(n119), .B(n266), .C(N171), .D(n138), .Q(n137) );
AOI211 U205 ( .A(n139), .B(n140), .C(n133), .Q(n138) );
NOR40 U206 ( .A(n141), .B(n142), .C(n143), .D(n144), .Q(n140) );
AOI211 U207 ( .A(n190), .B(n158), .C(n120), .Q(n133) );
AOI211 U208 ( .A(n190), .B(n126), .C(n123), .Q(n135) );
AOI311 U209 ( .A(n173), .B(n250), .C(n266), .D(n121), .Q(n134) );
INV3 U210 ( .A(n161), .Q(n173) );
NAND31 U211 ( .A(n246), .B(n249), .C(n127), .Q(n107) );
AOI211 U212 ( .A(N170), .B(n124), .C(N167), .Q(n108) );
AOI211 U213 ( .A(N176), .B(n122), .C(N174), .Q(n103) );
NAND41 U214 ( .A(n133), .B(n108), .C(n160), .D(n103), .Q(N158) );
AOI211 U215 ( .A(N164), .B(n114), .C(N165), .Q(n160) );
NOR31 U216 ( .A(n246), .B(n250), .C(n161), .Q(n123) );
INV3 U217 ( .A(n178), .Q(n191) );
INV3 U218 ( .A(n190), .Q(n176) );
NAND22 U219 ( .A(n108), .B(n109), .Q(N169) );
INV3 U220 ( .A(n128), .Q(N160) );
NOR40 U221 ( .A(n129), .B(n130), .C(n131), .D(N171), .Q(n128) );
NAND22 U222 ( .A(n109), .B(n104), .Q(n131) );
INV3 U223 ( .A(n133), .Q(n130) );
NAND31 U224 ( .A(n127), .B(n249), .C(n266), .Q(n104) );
NAND41 U225 ( .A(n107), .B(n104), .C(n110), .D(n112), .Q(n118) );
NOR31 U226 ( .A(n250), .B(n266), .C(n161), .Q(N167) );
NAND31 U227 ( .A(n177), .B(n249), .C(n178), .Q(n159) );
INV3 U228 ( .A(n113), .Q(N163) );
AOI211 U229 ( .A(n114), .B(N164), .C(N171), .Q(n113) );
NOR21 U230 ( .A(n191), .B(n266), .Q(n158) );
NOR21 U231 ( .A(n159), .B(n266), .Q(N164) );
NAND31 U232 ( .A(n105), .B(n106), .C(n107), .Q(N173) );
NAND22 U233 ( .A(n110), .B(n105), .Q(N172) );
NAND31 U234 ( .A(n110), .B(n111), .C(n112), .Q(N166) );
INV3 U235 ( .A(N174), .Q(n106) );
INV3 U236 ( .A(n111), .Q(N168) );
INV3 U237 ( .A(n94), .Q(n206) );
INV3 U238 ( .A(n92), .Q(n204) );
INV3 U239 ( .A(n90), .Q(n214) );
XNR21 U240 ( .A(n153), .B(xptdata[4]), .Q(n152) );
XNR21 U241 ( .A(n154), .B(xptdata[5]), .Q(n151) );
BUF2 U242 ( .A(n268), .Q(BISTbusy) );
XNR21 U243 ( .A(n148), .B(xptdata[3]), .Q(n141) );
XNR21 U244 ( .A(n145), .B(xptdata[0]), .Q(n144) );
NAND22 U245 ( .A(D19selRAM), .B(n102), .Q(n89) );
NOR31 U246 ( .A(n177), .B(estado[3]), .C(n250), .Q(n127) );
NOR40 U247 ( .A(n176), .B(n250), .C(n266), .D(estado[3]), .Q(n120) );
NOR40 U248 ( .A(n246), .B(n176), .C(n250), .D(estado[3]), .Q(n121) );
NOR21 U249 ( .A(estado[3]), .B(estado[4]), .Q(n178) );
NOR21 U250 ( .A(n249), .B(estado[1]), .Q(n190) );
NOR31 U251 ( .A(n266), .B(estado[4]), .C(n161), .Q(N174) );
114 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas

NAND31 U252 ( .A(estado[1]), .B(n249), .C(n126), .Q(n109) );


NAND31 U253 ( .A(estado[1]), .B(n249), .C(n158), .Q(n111) );
NAND31 U254 ( .A(estado[2]), .B(n127), .C(n266), .Q(n110) );
NAND31 U255 ( .A(estado[2]), .B(estado[1]), .C(n126), .Q(n105) );
NAND31 U256 ( .A(n115), .B(n116), .C(n117), .Q(N162) );
AOI221 U257 ( .A(n121), .B(n122), .C(n123), .D(n124), .Q(n115) );
AOI311 U258 ( .A(n119), .B(n266), .C(STBIST1), .D(n120), .Q(n116) );
INV3 U259 ( .A(n118), .Q(n117) );
INV3 U260 ( .A(n157), .Q(N171) );
NAND31 U261 ( .A(estado[2]), .B(estado[1]), .C(n158), .Q(n157) );
NAND22 U262 ( .A(STBIST2), .B(STBIST1), .Q(n114) );
NOR21 U263 ( .A(BISTbusy), .B(F18rdwrRAM), .Q(n196) );
INV8 U264 ( .A(reset), .Q(n237) );
NAND41 U265 ( .A(n179), .B(n180), .C(n181), .D(n182), .Q(n124) );
INV3 U266 ( .A(n185), .Q(n180) );
NOR40 U267 ( .A(n184), .B(n71), .C(n69), .D(n70), .Q(n181) );
NOR40 U268 ( .A(n66), .B(n183), .C(n67), .D(n68), .Q(n182) );
NAND41 U269 ( .A(n162), .B(n163), .C(n164), .D(n165), .Q(n122) );
INV3 U270 ( .A(n168), .Q(n163) );
NOR40 U271 ( .A(n167), .B(n84), .C(n82), .D(n83), .Q(n164) );
NOR40 U272 ( .A(n79), .B(n166), .C(n80), .D(n81), .Q(n165) );
NAND41 U273 ( .A(AddrRAM2[3]), .B(n169), .C(AddrRAM2[4]), .D(AddrRAM2[5]),
.Q(n168) );
INV3 U274 ( .A(n170), .Q(n169) );
NAND22 U275 ( .A(AddrRAM2[2]), .B(AddrRAM2[1]), .Q(n170) );
NAND41 U276 ( .A(AddrRAM1[3]), .B(n186), .C(AddrRAM1[4]), .D(AddrRAM1[5]),
.Q(n185) );
INV3 U277 ( .A(n187), .Q(n186) );
NAND22 U278 ( .A(AddrRAM1[2]), .B(AddrRAM1[1]), .Q(n187) );
NOR40 U279 ( .A(n251), .B(n247), .C(n76), .D(n77), .Q(n162) );
NOR40 U280 ( .A(n252), .B(n248), .C(n63), .D(n64), .Q(n179) );
AOI211 U281 ( .A(F18rdwrRAM), .B(n91), .C(n87), .Q(SRAM0_WE) );
INV3 U282 ( .A(SRAM0_LB), .Q(n91) );
NOR21 U283 ( .A(BISTbusy), .B(D19selRAM), .Q(SRAM0_LB) );
NOR21 U284 ( .A(n93), .B(n94), .Q(n205) );
INV3 U285 ( .A(LPTdata[7]), .Q(n93) );
NOR21 U286 ( .A(n95), .B(n94), .Q(n207) );
INV3 U287 ( .A(LPTdata[6]), .Q(n95) );
NOR21 U288 ( .A(n96), .B(n94), .Q(n208) );
INV3 U289 ( .A(LPTdata[5]), .Q(n96) );
NOR21 U290 ( .A(n97), .B(n94), .Q(n209) );
INV3 U291 ( .A(LPTdata[4]), .Q(n97) );
NOR21 U292 ( .A(n98), .B(n94), .Q(n210) );
INV3 U293 ( .A(LPTdata[3]), .Q(n98) );
NOR21 U294 ( .A(n99), .B(n94), .Q(n211) );
INV3 U295 ( .A(LPTdata[2]), .Q(n99) );
NOR21 U296 ( .A(n100), .B(n94), .Q(n212) );
INV3 U297 ( .A(LPTdata[1]), .Q(n100) );
NOR21 U298 ( .A(n101), .B(n94), .Q(n213) );
INV3 U299 ( .A(LPTdata[0]), .Q(n101) );
NAND22 U300 ( .A(AddrRAM2[10]), .B(AddrRAM2[0]), .Q(n166) );
NAND22 U301 ( .A(AddrRAM1[10]), .B(AddrRAM1[0]), .Q(n183) );
NAND22 U302 ( .A(RAM0cs), .B(BISTbusy), .Q(n92) );
NAND22 U303 ( .A(RAM1cs), .B(BISTbusy), .Q(n90) );
NAND22 U304 ( .A(AddrRAM2[18]), .B(AddrRAM2[17]), .Q(n167) );
NAND22 U305 ( .A(AddrRAM1[18]), .B(AddrRAM1[17]), .Q(n184) );
INV3 U306 ( .A(W17AUTOfeed), .Q(n194) );
endmodule

########################
Cadence SOC Encounter
########################
DataPathComBIST:

*** Starting "NanoPlace(TM) placement v0.545.4.4 (mem=123.8M)" ...


options: glbDetour reduceNode obstruct2 obstruct4 spreadOut multiOuterRow moveTermZ spacingTable
pinAndObsSpacing multiVoidRow noPinGuide honorNetRTLayer wideBlockageSpacing MSLayer saveMemory
Options: ignoreSpare pinGuide gp=mq-medium dp=medium
#std cell=314 #block=0 (0 floating + 0 preplaced) #ioInst=4 #net=341 #term=1096 #term/net=3.21,
#fixedIo=4, #floatIo=0, #fixedPin=0, #floatPin=87
Total standard cell length = 2.9582 (mm), area = 0.0385 (mm^2)
Average module density = 0.877.
Density for the design = 0.877.
= stdcell_area 2049 (37292 um^2) / alloc_area 2336 (42515 um^2).
*Fixed term percentage = 7.184%
*Fixed term center of gravity = (0 0) in coreBox (81200 80600, 292150 288600)
*Internal placement parameters: 0.050 | 7 | 0x000015
Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas 115
116 Módulos TOP e relatórios gerados pelas ferramentas CAD utilizadas
Anexo D

Programa em linguagem C para


comunicações IEEE1284

117
118 Programa em linguagem C para comunicações IEEE1284

/**************************************************/
/*** Alberto Barroso MIEEC FEUP 2008 ***/
/*** comunicaç~
ao por porta paralela ***/
/*** Windows 9x, NT,W2K,XP ***/
/*** ***/
/*** Código baseado na libraria inpout32.dll; ***/
/*** mais detalhes em: ***/
/*** http://www.logix4u.net/inpout32.htm ***/
/*** ***/
/*** Copyright (C) 2006, Douglas Beattie Jr. ***/
/*** ***/
/*** <beattidp@ieee.org> ***/
/*** http://www.hytherion.com/beattidp/ ***/
/*** ***/
/**************************************************/
/* Last change: ARFB 2008.06.07 */
/*******************************************************/
/* */
/* Builds with Microsoft’s Visual C v6.0 Compiler */
/* */
/* Compile as Visual Studio Project, */
/* */
/* Create new ’blank’ project, add this file, */
/* Press F7 to build, ctrl+F5 to run. */
/* */
/*******************************************************/

#include <stdio.h>
#include <conio.h>
#include <windows.h>

/*******************************************************/
/* */
/* Be sure to change PPORT_BASE (Port Base address) */
/* accordingly if your LPT port is addressed */
/* elsewhere. */
/* */
/*******************************************************/

#define PPORT_BASE ((short) 0x378) //LPT1=0x378; LPT0=0x3BC; LPT2=0x278

/* Definitions in the build of inpout32.dll are:


* short _stdcall Inp32(short PortAddress);
* void _stdcall Out32(short PortAddress, short data);
*/

/* prototype (function typedef) for DLL function Inp32: */

typedef short (_stdcall *inpfuncPtr)(short portaddr);


typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);

// Prototypes for Test functions

void write2RAM0(short dados);


void write2RAM1(short dados);
short ReadRAM0(void);
short ReadRAM1(void);
void ReadBISTstatus(short statusdata);
void test_read8(void);
void test_write(void);
void test_write_datum(short datum);

/* After successful initialization, these 2 variables


will contain function pointers.
*/
inpfuncPtr inp32fp;
oupfuncPtr oup32fp;

/* Wrapper functions for the function pointers


- call these functions to perform I/O.
*/
Programa em linguagem C para comunicações IEEE1284 119

short Inp32 (short portaddr)


{
return (inp32fp)(portaddr);
}

void Out32 (short portaddr, short datum)


{
(oup32fp)(portaddr,datum);
}

int ii;
short x;

int main(void)
{
HINSTANCE hLib;

//short x;
//int i;

/* Load the library */


hLib = LoadLibrary("inpout32.dll");

if (hLib == NULL) {
fprintf(stderr,"LoadLibrary Failed.\n");
return -1;
}

/* get the address of the function */

inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

if (inp32fp == NULL) {
fprintf(stderr,"GetProcAddress for Inp32 Failed.\n");
return -1;
}

oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

if (oup32fp == NULL) {
fprintf(stderr,"GetProcAddress for Oup32 Failed.\n");
return -1;
}

printf(" ******** INITIALIZATION SUCCESSFUL ********** \n");

/* ************************ test execution *************/

/***** Read 8 bytes at I/O base address */


test_read8();

// for (ii=1; ii<262145; ii++) write2RAM1(ii);


while (!kbhit())

{
//Out32(PPORT_BASE+2,0x4);
//printf("Programmed 0\n");
//getch();
//Out32(PPORT_BASE+2,0x0c);
//printf("Programmed 1\n");
//getch();

x=ReadRAM1();
printf("Port read = %04X\n",x);
}

/* printf("Port read = %04X\n",Inp32(0x379)); */

/***** Write 0x75 to data register and verify */


test_write();
120 Programa em linguagem C para comunicações IEEE1284

/***** One more time, different value */


test_write_datum(0xAA);

/***** Reset CTRL bits */


Out32(PPORT_BASE+2,0x04); // leave nInitialize(pin16)=1; LPTx data PC to FPGA

/* finished - unload library and exit */


FreeLibrary(hLib);
printf("Test complete \n");
return 0;
}

/*************************************************************************************/
/***************************** Functions and Procedures ******************************/
/*************************************************************************************/

void write2RAM0(short dados)


{
Out32(PPORT_BASE, dados);
Out32(PPORT_BASE+2,0x05); // nInitialize(pin16)=1, CS* low
Out32(PPORT_BASE+2,0x04); // nInitialize(pin16)=1, CS* high
Out32(PPORT_BASE+2,0x06); // incaddr=High; inc address counter in the rising edge
}
/* ________________________________________________________________________________________ */

void write2RAM1(short dados)


{
Out32(PPORT_BASE, dados);
Out32(PPORT_BASE+2,0x0D); // nInitialize(pin16)=1, CS* low
Out32(PPORT_BASE+2,0x0C); // nInitialize(pin16)=1, CS* high
Out32(PPORT_BASE+2,0x0E); // incaddr=High; inc address counter in the rising edge
}
/* ________________________________________________________________________________________ */

short ReadRAM0(void)
{
short rdata;
Out32(PPORT_BASE+2,0x21); // activate bi-directional, RAM_CS=0, incaddr=low
rdata = Inp32(PPORT_BASE);
Out32(PPORT_BASE+2,0x23); // incaddr=High; inc address counter in the rising edge
return rdata;
}
/* ________________________________________________________________________________________ */

short ReadRAM1(void)
{
short rdata;
Out32(PPORT_BASE+2,0x29); // activate bi-directional, RAM_CS=0, incaddr=low
rdata = Inp32(PPORT_BASE);
Out32(PPORT_BASE+2,0x2B); // incaddr=High; inc address counter in the rising edge
return rdata;
}
/* ________________________________________________________________________________________ */

void ReadBISTstatus(short statusdata)


{
Out32(PPORT_BASE+2,0x04); // leave nInitialize(pin16)=1; LPTx data PC to FPGA
statusdata = Inp32(PPORT_BASE+1);
}
/* ________________________________________________________________________________________ */
Programa em linguagem C para comunicações IEEE1284 121

/*
TEST: Read inputs of 8 registers from PORT_BASE address
*/
void test_read8(void) {

short x;
short i;

/* Try to read 0x378..0x37F, LPT1: */

for (i=PPORT_BASE; (i<(PPORT_BASE+8)); i++) {

x = Inp32(i);

printf("Port read (%04X)= %04X\n",i,x);


}

/*
TEST: Write constant 0x77 to PORT_BASE (Data register)
*/
void test_write(void) {
short x;
short i;

/***** Set ctrl bits */


Out32(PPORT_BASE+2,0x04); // nInitialize=1; HCT245dir=1 (drive to FPGA)

/***** Write the data register */

i=PPORT_BASE;
x=0x33;

/***** Write the data register */


while (!kbhit())
{
Out32(i,x);

printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);


}
/***** And read back to verify */
x = Inp32(i);
printf("Port read (%04X)= %04X\n",i,x);

/***** Set all bits high */


x=0xFF;
Out32(i,x);

/***** Now, set bi-directional and read again */


Out32(PPORT_BASE+2,0x20); // Activate bi-directional

x = Inp32(i);
printf("Set Input, read (%04X)= %04X\n",i,x);

Out32(PPORT_BASE+2,0x00); // Set Output-only again


x = Inp32(i);
printf("Reset Ouput, read (%04X)= %04X\n",i,x);

/*
TEST: Write data from parameter
*/
void test_write_datum(short datum) {
short x;
short i;

i=PPORT_BASE;
x = datum;
122 Programa em linguagem C para comunicações IEEE1284

/***** Write the data register */


Out32(i,x);

printf("Port write to 0x%X, datum=0x%2X\n" ,i ,x);

/***** And read back to verify */


x = Inp32(i);
printf("Port read (%04X)= %04X\n",i,x);
}
Referências

[1] Gary S. May and Simon M. Sze. Fundamentals of Semiconductor Fabrication. Wiley,
1st edition, 2003.

[2] CPU Ukraine. Cpu collector from ukraine, June 2008. http://www.cpu-ukraine.
com/.

[3] Kanad Chakraborty. Bisramgen: A silicon compiler for built-in self-repairable


random-access memories, May 1997. Ph.D. dissertation, University of Michigan,
United States.

[4] Xilinx. Chipscope pro tool, June 2008. http://www.xilinx.com/ise/optional_


prod/cspro.htm.

[5] Synopsys. Rtl synthesis, June 2008. http://www.synopsys.com/products/logic/


design_compiler.html.

[6] Cadence. Soc encounter rtl-to-gdsii system, June 2008. http://www.cadence.com/


products/digital_ic/soc_encounter/.

[7] logix4u. inpout32, June 2008. http://www.logix4u.net/inpout32.htm.

[8] The free encyclopedia Wikipedia. Univac i, June 2008. http://en.wikipedia.org/


wiki/UNIVAC_I.

[9] Ashok K. Sharma. Semiconductor Memories: Technology, Testing and Reliability.


IEEE Press, New York, 2nd edition, 2005.

[10] Gordon E. Moore. Moore’s law, June 2008. http://www.intel.com/museum/


archives/history_docs/mooreslaw.htm.

[11] Cypress Semiconductor. Sram, June 2008. http://www.cypress.com.

[12] The Semiconductor Test Consortium. Stc, June 2008. http://www.semitest.org.

[13] Alexander Miczo. Digital Logic Testing and Simulation. Wiley, 2nd edition, 2003.

[14] Ian A. Grout. Integrated Circuit Test Engineering, Modern Techniques. Springer, 1st
edition, 2006.

[15] Chang Huang, Wu. A programmable bist core for embedded dram. IEEE Design and
Test of Computers, pages 59–70, March 1999.

[16] R.Dean Adams. High Performance Memory Testing. Kluwer Academic Publishers,
1st edition, 2002.

123
124 REFERÊNCIAS

[17] A. Steininger K. Thaller. A transparent online memory test for simultaneous detection
of functional faults and soft errors in memories. IEEE Transactions on Reliability,
pages 413–422, Dezembro 2003.

[18] Dimitris Gizopoulos. Advances in Electronic Testing, challenges and methodologies.


Springer, 1st edition, 2006.

[19] Ruey-Shing Tzeng Jin-Fu Li and Cheng-Wen Wu. Diagnostic data compression tech-
niques for embedded memories with built-in self-test. Journal of electronic testing,
pages 516–527, August 2002.

[20] IEEE. Ieee std 1500 - standard for embedded core test, June 2008. http://grouper.
ieee.org/groups/1500/.

[21] Emerging Memory Technologies Inc. em-bist, June 2008. http://www.


emergingmemory.com.

[22] Volker Schober and Olivier Picot. Memory built-in self-repair. Infineon, pages 103–
114, June 2005.

Вам также может понравиться