一、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在芯片设计流程中的位置,你看一眼就明白了:

DFT在芯片设计流程中的位置 需求定义 功能规格 + DFT需求 RTL设计 插入测试点/扫描链 逻辑综合 扫描链重排/约束 后端实现 布局布线 + DFT物理实现 DFT规划 确定测试策略、选择技术 DFT实现 扫描链插入、BIST集成 DFT验证 测试向量生成、覆盖率分析 ATE测试 芯片测试、良率分析 ← 设计流程与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超、心电图来精准定位病灶。

下一章,我会带你手把手搭建第一个扫描链测试环境。到时候咱们直接上代码,不玩虚的。

可可精品资料库