一、DFT概述:从零认识可测试性设计
大家好,我是你们的DFT讲师。今天咱们聊聊DFT——这个在芯片设计里经常被新人忽略、但老工程师不敢马虎的环节。
先问大家一个问题:你辛辛苦苦设计了一颗芯片,流片回来,怎么知道它能不能正常工作?
嗯,你可能会说「上电跑程序啊」。但问题是——如果芯片压根不工作,你怎么知道是逻辑错了、时序没满足、还是某个晶体管短路了?
这就是DFT要解决的核心问题。
1.1 什么是DFT?
DFT,全称 Design for Test,中文叫「可测试性设计」。说白了,就是在芯片设计阶段,就提前把「测试接口」和「测试模式」做进去。
我打个比方:你盖一栋楼,DFT就相当于在每层楼都预留了检修口、水管阀门、电表箱。平时用不上,但一旦出问题,维修师傅不用砸墙就能找到故障点。
芯片也是一样。一颗芯片内部有几千万甚至上百亿个晶体管,封装之后你连一根内部信号线都摸不到。如果没有DFT,测试人员只能干瞪眼。
DFT的核心思想:在设计阶段就为测试做好准备,而不是等芯片做出来再想办法测。
1.2 为什么需要DFT?
我刚开始做芯片那会儿,带我的老工程师说过一句话,我到现在都记得:「没有DFT的芯片,就像没有仪表盘的飞机——你敢飞,我不敢坐。」
具体来说,DFT有三大价值:
- 降低测试成本:ATE测试机台是按秒收费的。DFT做得好,测试时间从几秒压缩到零点几秒,一颗芯片省几毛钱,百万颗就是几十万。
- 提高故障覆盖率:没有DFT,你可能只能测到芯片外部引脚的功能。有了扫描链和BIST,内部节点、存储单元都能测到。
- 加速良率分析:流片回来发现良率低,DFT数据能帮你快速定位是哪个工艺角、哪个模块出了问题。
我的经验:有一次项目赶进度,老板说「这次先不做DFT,流片回来再补测」。结果芯片回来,功能完全不对,但因为没有扫描链,我们花了三周才定位到一个组合逻辑的竞争冒险问题。从那以后,我坚持每个项目都必须有DFT方案,哪怕只是最基础的扫描链。
1.3 DFT在芯片设计流程中的位置
DFT不是最后才加的,它贯穿整个设计流程。我习惯把它分成三个阶段:
| 设计阶段 | DFT工作内容 | 输出产物 |
|---|---|---|
| 前端设计(RTL) | 插入测试点、规划扫描链、集成BIST控制器 | 带DFT的RTL代码 |
| 综合阶段 | 扫描链重排、时钟门控处理、测试模式时序约束 | 网表 + DFT约束文件 |
| 后端实现 | 扫描链物理布局、测试时钟树综合、ATE测试向量生成 | 测试向量 + 测试程序 |
你想想看,如果等到后端布局布线完了才想加DFT,那基本等于重做。所以我的建议是:RTL阶段就把DFT结构规划好,后面只是实现和优化的问题。
下面这张图是我自己整理的DFT在芯片设计流程中的位置,你看一眼就明白了:
1.4 常见的DFT技术
DFT不是单一技术,而是一套组合拳。我工作中最常用的有三种,给你逐个讲讲。
1.4.1 扫描链(Scan Chain)
扫描链是DFT的基石,也是我最先学会的技术。它的原理其实很简单:
正常模式下,每个触发器(Flip-Flop)负责存储一个状态。测试模式下,我们把所有触发器串成一条链,像一串珍珠一样。然后通过一个专用的测试时钟,把测试数据「扫」进去,再「扫」出来。
这样做的好处是:你可以直接控制芯片内部任何一个节点的状态,也能读出任何一个节点的值。
扫描链的核心指标:扫描覆盖率(Scan Coverage)。我一般要求做到98%以上,低于95%的项目我会要求重新插入扫描链。
举个例子,一个简单的扫描链配置代码大概长这样:
// 扫描链模式选择信号
assign scan_mode = test_mode_enable;
// 扫描链输入输出
always @(posedge scan_clk or negedge scan_rstn) begin
if (!scan_rstn)
scan_out <= 1'b0;
else if (scan_mode)
scan_out <= scan_in; // 扫描模式下,数据从scan_in传到scan_out
else
scan_out <= functional_data; // 正常模式下,走功能路径
end
嗯,这里要注意:扫描链的时钟和功能时钟通常是分开的。我见过不少新手把扫描时钟和功能时钟混在一起,结果测试时时序乱套。
1.4.2 内建自测试(BIST)
BIST,全称 Built-In Self Test。说白了,就是让芯片自己测自己。
这个技术特别适合测试存储器(SRAM、ROM、Flash)。因为存储器单元密集,用扫描链去测的话,测试向量会大得吓人,ATE测试时间也受不了。
BIST的工作原理是:芯片内部集成一个测试控制器,它自动生成测试图案(比如March算法),写入存储器,再读出来比对。如果发现不一致,就报错。
我的经验:有一次做一颗AI加速芯片,里面嵌了128块SRAM。如果用扫描链测,测试向量要几十GB。后来改用BIST,测试时间从5秒降到了0.3秒,而且覆盖率还更高。从那以后,只要芯片里有大容量存储器,我必上BIST。
1.4.3 JTAG(IEEE 1149.1)
JTAG,你可能更熟悉它的另一个名字——边界扫描(Boundary Scan)。
JTAG最初是为了解决PCB板级测试问题而设计的。它通过4根线(TCK、TMS、TDI、TDO)就能访问芯片内部的所有引脚状态。
在DFT领域,JTAG有两个主要用途:
- 边界扫描测试:检测芯片引脚和PCB焊盘之间的连接是否正常。比如有没有虚焊、短路。
- 调试接口:很多芯片的调试功能(比如断点、单步执行)都是通过JTAG实现的。
JTAG的指令集是标准化的,但每个芯片厂商可以自定义私有指令。我建议你至少熟悉以下几条标准指令:
| 指令名称 | 指令码 | 功能描述 |
|---|---|---|
| BYPASS | 1111 | 旁路模式,用于多芯片链式连接 |
| SAMPLE/PRELOAD | 0010 | 采样引脚状态或预加载数据 |
| EXTEST | 0000 | 外部测试,检测芯片间互连 |
| INTEST | 0011 | 内部测试,检测芯片内部逻辑 |
注意:JTAG的TCK频率不能太高,一般建议不超过50MHz。我曾经在一个项目里把TCK设到了100MHz,结果边界扫描出来的数据全是乱的——信号反射太严重了。
小结
好了,这一章的内容就到这里。我们聊了DFT是什么、为什么需要它、它在设计流程中的位置,以及三种最常用的DFT技术。
我个人觉得,DFT就像芯片的「体检系统」。没有它,芯片就是黑盒子,出了问题只能靠猜。有了它,你就能像医生一样,通过扫描、B超、心电图来精准定位病灶。
下一章,我会带你手把手搭建第一个扫描链测试环境。到时候咱们直接上代码,不玩虚的。