测试策略制定:DFT基础、扫描链与边界扫描、BIST原理
各位好,欢迎来到第二章。上一章我们聊了测试的宏观成本与策略选择,这一章咱们要扎进具体的技术细节里了。
DFT,可测性设计。说白了,就是你在设计芯片的时候,就得想着以后怎么测它。别等芯片都做出来了,才发现有些内部节点根本没法观测,那可就抓瞎了。我早年吃过这个亏,一个挺复杂的数字模块,流片回来发现有个内部状态机死活测不到,最后只能靠猜,那叫一个痛苦。
所以,DFT不是可选项,是必选项。今天咱们就把它最核心的三个支柱讲透:扫描链、边界扫描、还有BIST。
2.1 DFT的核心思想:可控性与可观测性
DFT的终极目标就两个词:可控性和可观测性。
- 可控性:你能不能通过芯片的引脚,把一个特定的逻辑值(0或1)施加到芯片内部的任何一个节点上?
- 可观测性:你能不能通过芯片的引脚,观察到芯片内部任何一个节点的逻辑状态?
你想想看,一个普通的时序电路,内部有几百个触发器。你想让其中一个触发器在某个时刻变成1,你得写一段复杂的测试向量,通过组合逻辑一层层传进去。这工作量,想想都头大。DFT就是给你开个“后门”,让你能直接访问这些内部节点。
核心原则:好的DFT设计,能让测试向量生成时间从几周缩短到几小时。这不是夸张,是我在多个项目里验证过的。
2.2 扫描链(Scan Chain)—— 最经典的DFT技术
扫描链是DFT的基石。它的思路很巧妙:把芯片里所有的触发器(Flip-Flop)都替换成一种特殊的“扫描触发器”。
2.2.1 扫描触发器的工作原理
普通的触发器只有一个数据输入端D。扫描触发器有两个数据输入端:一个正常的D,一个扫描输入SI。它还有一个扫描使能信号SE。
- 正常模式(SE=0):触发器正常工作,数据从D端输入。
- 扫描模式(SE=1):触发器从SI端输入数据。多个触发器的SI和SO(扫描输出)首尾相连,就形成了一条长长的移位寄存器链——这就是扫描链。
我习惯把扫描链想象成一条“数据高速公路”。测试时,我们把所有触发器串起来,然后通过芯片的测试引脚,把一串测试数据“灌”进去,就像往一个水管里注水。等数据都到位了,切回正常模式跑一个时钟周期,再切回扫描模式,把结果“挤”出来看。
个人经验:扫描链的设计有个关键点——扫描使能信号SE的时序。SE信号在芯片内部要像时钟一样被对待,它的扇出很大,必须做平衡树处理。我曾经在一个项目里忽略了SE的时序,结果扫描链在高速下根本没法用,最后只能降频测试,教训深刻。
2.2.2 扫描链的插入流程
在实际项目中,扫描链的插入通常由EDA工具自动完成。但作为测试工程师,你得理解它的流程,才能跟设计团队有效沟通。
- RTL代码准备:设计人员提交综合后的网表。
- 定义测试协议:指定测试时钟、测试复位、扫描使能等测试引脚。
- 扫描链配置:决定分几条链,每条链包含哪些触发器。链太长,测试时间久;链太多,测试引脚不够用。这是个权衡。
- 工具自动插入:EDA工具(如Synopsys的DFT Compiler)自动替换触发器并连接成链。
- ATPG生成:自动测试向量生成工具根据扫描链结构,生成测试向量。
- 仿真验证:在仿真环境里跑一遍生成的测试向量,确保功能正确。
2.2.3 扫描链的常见问题与避坑
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 扫描链断路 | 测试向量灌不进去,输出全是X | 检查网表连接,确认SI/SO没有悬空或短路 |
| 时序违规 | 扫描链在目标频率下测试失败 | 优化SE信号的时钟树,或降低扫描测试频率 |
| 链长度不均 | 某条链特别长,拖慢整体测试时间 | 重新分配触发器,平衡各链长度 |
| X态传播 | 未知状态在扫描链里传播,导致测试结果不可信 | 在关键路径上插入观测点,或使用X态屏蔽技术 |
注意:扫描链不是万能的。它主要针对固定型故障(Stuck-at Fault)和跳变延迟故障(Transition Delay Fault)。对于更复杂的故障模型,比如小延迟缺陷,扫描链的覆盖率可能不够,需要结合其他测试方法。
2.3 边界扫描(Boundary Scan)—— 板级测试的救星
边界扫描,也叫JTAG(Joint Test Action Group),是IEEE 1149.1标准。它的诞生背景很有意思:随着芯片封装越来越密,BGA、QFN这些封装,引脚都在芯片底下,探针根本够不着。板级焊接测试怎么做?
边界扫描的思路是:在每个芯片的I/O引脚和内部逻辑之间,都插入一个边界扫描单元(BSC)。这些BSC也串成一条链,通过专用的测试引脚(TDI, TDO, TMS, TCK)来访问。
2.3.1 边界扫描的四大测试引脚
- TCK (Test Clock):测试时钟,独立于系统时钟。
- TMS (Test Mode Select):测试模式选择,控制JTAG状态机的跳转。
- TDI (Test Data In):测试数据输入,数据从这里串行灌入。
- TDO (Test Data Out):测试数据输出,数据从这里串行读出。
有了这四根线,你就可以通过一个简单的USB-JTAG调试器,控制整个板子上所有支持JTAG的芯片。你可以让某个芯片的引脚输出一个固定电平,然后读另一个芯片的引脚状态,从而判断焊接是否短路或断路。
我常用的场景:板子刚贴片回来,上电前先用边界扫描扫一遍。如果发现有引脚短路,就不用冒险上电了,直接返修。这能省下大量排查时间。
2.3.2 边界扫描的指令集
JTAG标准定义了几条强制指令和可选指令。最常用的是这三条:
| 指令 | 操作码 | 功能描述 |
|---|---|---|
| BYPASS | 111...1 | 旁路当前芯片,TDI直接连到TDO,用于快速穿过不关心的芯片 |
| SAMPLE/PRELOAD | 000...0 | 采样引脚状态(不中断系统功能),或预加载数据到边界扫描单元 |
| EXTEST | 000...1 | 外部测试模式,通过边界扫描单元驱动引脚输出,检测板级互连 |
EXTEST指令是边界扫描的精髓。执行它时,芯片内部逻辑与引脚断开,引脚完全由边界扫描单元控制。你可以让芯片A的某个引脚输出0,然后检查芯片B的对应引脚是否读到0。如果读到1,说明这两根线之间可能有短路。
2.4 BIST(内建自测试)—— 让芯片自己测自己
BIST,就是芯片内部集成一个测试电路,上电后自己跑一遍测试,然后告诉你“我好不好”。这在存储器测试里用得最多,因为存储器结构规整,非常适合用BIST。
2.4.1 存储器BIST(MBIST)的原理
MBIST的核心是一个有限状态机,它按照特定的算法(如March算法)对存储器进行读写操作,然后比较读出的数据与期望值。
一个典型的March算法流程是这样的:
- 把所有地址单元写0。
- 从最低地址到最高地址,读0,写1。
- 从最高地址到最低地址,读1,写0。
- 重复步骤2和3,但方向相反。
这个算法能检测出存储单元之间的耦合故障、地址译码故障等多种缺陷。
关键点:MBIST的测试时间取决于存储器大小和算法复杂度。一个1Mb的SRAM,用March C-算法跑一遍,大概需要几毫秒。这个时间在量产测试里是可以接受的。
2.4.2 逻辑BIST(LBIST)
逻辑BIST比MBIST复杂得多。它需要生成随机或伪随机的测试向量,然后施加到内部逻辑上,再用一个多输入签名寄存器(MISR)来压缩输出结果,最后得到一个“签名”。如果签名与预期一致,说明逻辑没问题。
LBIST的挑战在于:随机向量很难覆盖到所有故障点,尤其是那些需要特定序列才能激活的故障。所以,LBIST通常作为扫描链测试的补充,而不是替代。
注意:BIST虽然方便,但它会消耗芯片面积和功耗。一个复杂的LBIST模块,可能占芯片面积的5%-10%。在成本敏感的消费类芯片里,这个代价可能太高了。我一般只在汽车电子或航空航天这类对可靠性要求极高的芯片里,才会全面部署LBIST。
2.5 本章知识体系总览
为了让你更直观地理解这三者之间的关系,我画了一张图。你可以看到,扫描链和BIST主要针对芯片内部逻辑和存储器,而边界扫描则专注于芯片之间的板级互连。它们共同构成了一个完整的测试策略。