第4章 DFT设计基础:Scan Chain原理、BIST与JTAG标准
各位工程师,咱们今天聊聊DFT。说实话,我刚入行那会儿,觉得DFT就是个“事后补救”的手段——设计都做完了,再加点测试逻辑进去。后来吃过几次亏才明白,DFT做不好,芯片量产就是一场噩梦。
DFT的核心目标就一个:让芯片变得可测。你想想看,一颗芯片几千万个晶体管,封装完就一个小黑盒子,你怎么知道里面有没有坏?靠的就是DFT插进去的这些“测试机关”。
4.1 Scan Chain原理——把时序电路变成组合电路来测
先说说最基础的Scan Chain。为什么需要它?因为时序电路太难测了。组合逻辑你给一组输入,输出就定了,好判断。但时序电路有状态,你得先让电路跑到某个状态,再给输入,再等几个时钟,才能看到结果。测试成本太高。
Scan Chain的思路很巧妙:把所有的触发器(Flip-Flop)串成一条链。正常工作时,每个FF各干各的。测试模式下,它们变成一条移位寄存器链。
具体怎么做?每个FF旁边加一个MUX,选择正常数据输入还是扫描输入。测试时,你把测试向量从扫描输入(Scan In)一脚一脚推进去,等所有FF都装好了数据,再切回正常模式跑一个时钟,把结果抓到FF里。最后再切回扫描模式,把结果从扫描输出(Scan Out)一脚一脚吐出来。
核心要点:
- 每个FF变成可控制的节点
- 测试向量可以“注入”到任意状态
- 内部状态可以“读出”来检查
我在项目中遇到过一条Scan Chain串了8000多个FF。当时ATE测试机频率只有20MHz,推进一个向量就要0.4毫秒。你算算,测100万个向量要多久?400秒!所以后来我学乖了,Scan Chain不是越长越好,要平衡测试时间和芯片面积。
个人经验:Scan Chain的分段设计很重要。我一般建议每段不超过2000个FF。太长的话,测试时间指数级增长,而且链上任何一个FF坏了,整条链都废了。
4.2 BIST(内建自测试)——让芯片自己测自己
Scan Chain需要外部ATE机台来推向量、收结果。那BIST呢?说白了,就是在芯片内部搭一个“小测试机”。
BIST最典型的应用是Memory BIST。SRAM、DRAM这些存储器,面积大、密度高,最容易出制造缺陷。而且存储器结构规整,很适合用算法来测。
Memory BIST的架构很简单:
- 一个控制器(BIST Controller)
- 一个地址生成器
- 一个数据生成器
- 一个比较器
测试时,控制器让地址生成器遍历所有地址,数据生成器按特定算法(比如March C-)写入数据,然后读回来比较。如果发现不一致,就报错。
// March C- 算法伪代码
// 这是业界最常用的Memory BIST算法
Step 1: 按地址递增,写0 (w0)
Step 2: 按地址递增,读0 (r0),写1 (w1)
Step 3: 按地址递增,读1 (r1),写0 (w0)
Step 4: 按地址递减,读0 (r0),写1 (w1)
Step 5: 按地址递减,读1 (r1),写0 (w0)
Step 6: 按地址递减,读0 (r0)
嗯,这里要注意:BIST不是万能的。它只能测存储器内部的固定故障和转换故障。对于存储器和周边逻辑的接口问题,BIST就无能为力了。我遇到过一颗芯片,Memory BIST全过,但系统跑起来就死机。最后查出来是地址线在顶层连错了——BIST根本测不到那个层次。
避坑指南:我曾经在一个项目里,为了省面积,把BIST控制器和功能逻辑共用了一部分时钟树。结果测试模式下时钟抖动太大,BIST老是误报。后来花了三周才定位到问题。所以,BIST的时钟域一定要独立,至少要做时钟隔离。
4.3 JTAG/IEEE 1149.1标准——芯片的“调试后门”
JTAG,全称是Joint Test Action Group。这个标准最初是为了解决PCB板级测试问题——板子焊好了,你怎么知道每个芯片的引脚都连对了?
JTAG的核心是边界扫描(Boundary Scan)。它在每个I/O引脚旁边加一个边界扫描单元(BSC),这些BSC串成一条链。测试时,你可以通过这条链来控制每个引脚的电平,或者读取每个引脚的状态。
JTAG的硬件接口只有5根线:
| 信号 | 功能 |
|---|---|
| TCK | 测试时钟 |
| TMS | 测试模式选择 |
| TDI | 测试数据输入 |
| TDO | 测试数据输出 |
| TRST(可选) | 测试复位 |
JTAG的协议基于一个有限状态机——TAP控制器。它有16个状态,通过TMS信号在TCK的上升沿驱动状态跳转。你想想看,就一根TMS线,通过时序就能控制16个状态,设计得确实巧妙。
实际项目中,JTAG的用途远不止板级测试。我常用的场景包括:
- 芯片调试:通过JTAG访问内部寄存器,观察状态
- Flash编程:通过JTAG把固件烧进芯片
- Scan Chain控制:很多芯片的Scan Chain就是通过JTAG来访问的
- BIST触发:通过JTAG指令来启动BIST测试
实用技巧:JTAG的指令寄存器长度可以自定义。我一般建议至少支持以下指令:
- BYPASS(必须支持)——旁路模式,用于链上不参与测试的芯片
- SAMPLE/PRELOAD——采样当前引脚状态
- EXTEST——外部测试,控制引脚输出
- INTEST——内部测试,测试芯片内部逻辑
- IDCODE——读取芯片ID
说到IDCODE,这个挺有意思。每个芯片厂商都有一个唯一的JEDEC ID。比如TI是0x08,Intel是0x89。加上厂商自定义的版本号和部件号,组合成一个32位的IDCODE。测试时,ATE机台先读IDCODE,确认芯片型号对了,再往下测。这招能避免把A芯片的测试程序跑在B芯片上——我见过有人犯过这种低级错误。
个人建议:设计JTAG时,一定要考虑多芯片级联的情况。板子上可能串了3-4颗芯片,每颗都有自己的JTAG链。如果某颗芯片的BYPASS指令没实现好,整条链都跑不通。我习惯在RTL阶段就做JTAG链的仿真验证,别等到流片回来再查。
4.4 三种DFT技术的协同
实际项目中,这三种技术不是孤立的。它们经常配合使用:
- JTAG作为统一访问接口,控制Scan Chain和BIST
- Scan Chain负责逻辑测试,覆盖标准单元
- BIST负责存储器测试,覆盖SRAM/ROM
举个例子。一颗SoC芯片,上电后先通过JTAG读IDCODE确认身份。然后通过JTAG指令启动Memory BIST,跑一遍March C-算法,确认所有SRAM都没问题。接着通过JTAG把Scan Chain的测试向量灌进去,跑逻辑测试。最后通过JTAG读测试结果,判断芯片好坏。
你看,JTAG就像个“总开关”,把各种测试资源串起来了。这也是为什么IEEE 1149.1标准能活30年——它提供了一个统一的测试框架。
最后提醒一句:DFT不是设计完了再加的。我见过太多项目,RTL写完了才想起来加Scan Chain,结果发现关键节点没引出测试点,或者时钟域没处理好,改得死去活来。正确的做法是:在架构设计阶段就把DFT需求考虑进去。比如,哪些寄存器需要可测,哪些存储器需要BIST,JTAG的指令集怎么定义——这些都要提前想好。
好了,DFT基础就聊到这儿。下一章咱们讲ATPG(自动测试向量生成),那才是真正考验DFT设计质量的时候。你想想看,Scan Chain搭好了,但ATE机台能不能高效地生成测试向量?覆盖率能不能做到99%以上?这些都有门道。