一、DFT概述:什么是DFT?为什么需要DFT?DFT在芯片设计流程中的位置
1.1 什么是DFT?——说白了就是给芯片装个“体检系统”
DFT,全称是Design for Test,可测试性设计。
我经常跟新入行的同事这么解释:DFT就是在芯片正常功能之外,额外加一套专门用来“体检”的电路。你想想看,一颗芯片里有几亿甚至上百亿个晶体管,流片回来后你怎么知道它是不是好的?靠肉眼?不可能。靠功能测试?太慢,而且覆盖不全。
DFT就是解决这个问题的。它让芯片在测试模式下,能快速、高效地被检查出有没有制造缺陷。
核心定义:DFT是一种设计方法学,通过在芯片中植入测试结构,使得芯片在制造完成后能够被高效、低成本地测试,从而筛选出良品与次品。
我个人习惯把DFT比作“芯片的体检系统”:
- 扫描链(Scan Chain) —— 相当于抽血化验,把内部寄存器的状态串行读出来
- 边界扫描(Boundary Scan) —— 相当于X光,检查芯片引脚和内部逻辑的连接
- 内建自测试(BIST) —— 相当于跑步机,让存储器或逻辑自己跑自己测
1.2 为什么需要DFT?——没有DFT的芯片就像“盲盒”
你可能会问:我不加DFT,直接拿功能测试来测行不行?
嗯,理论上可以。但实际项目中,我见过太多血的教训了。
我曾经接手过一个项目:前端设计团队为了赶进度,把DFT结构砍掉了大半,说“功能仿真都过了,没问题”。结果流片回来,10颗芯片里有8颗功能异常。更惨的是,因为没加扫描链,我们根本定位不到是哪里的问题。最后只能靠探针台手动扎点,花了三个月才找到两个关键的短路点。从那以后,我再也不敢省DFT了。
为什么DFT不可或缺?说白了有三大原因:
- 制造缺陷是客观存在的 —— 晶圆制造过程中的颗粒污染、光刻偏差、金属桥接等,都会导致芯片失效。这不是设计能避免的。
- 功能测试覆盖不全 —— 一个复杂的SoC,功能测试向量可能几百万条,但依然只能覆盖不到70%的故障。而DFT的扫描测试,用几千条向量就能达到95%以上的覆盖率。
- 定位故障需要可观测性 —— 芯片坏了,你得知道坏在哪。没有DFT,就像黑箱操作,只能猜。有了扫描链,你可以把内部寄存器的值一个个读出来,精准定位。
我的经验:一个成熟的芯片项目,DFT相关的设计工作量通常占整个数字设计工作量的15%~25%。别觉得多,这钱花得值。一次流片失败的成本,够你做十次DFT了。
1.3 DFT在芯片设计流程中的位置——贯穿前后端的关键环节
DFT不是最后才加的,也不是一开始就做的。它贯穿整个芯片设计流程。
我习惯把DFT的介入点分成三个阶段:
| 设计阶段 | DFT工作内容 | 我的建议 |
|---|---|---|
| RTL设计阶段 | 确定DFT架构、插入测试控制信号、规划扫描链 | 尽早介入,跟功能设计同步进行 |
| 综合阶段 | 扫描链插入、ATPG向量生成、覆盖率分析 | 这里最容易出问题,要仔细检查 |
| 后端物理设计阶段 | 扫描链重排、时钟树综合、时序收敛 | 跟后端工程师多沟通,别让DFT成为时序瓶颈 |
具体来说,在标准的芯片设计流程中,DFT的位置是这样的:
需求定义 → 架构设计 → RTL编码
↓
DFT架构规划 ←—— 这里开始介入
↓
功能仿真验证
↓
逻辑综合 + DFT插入 ←—— 核心环节
↓
形式验证(功能 vs DFT)
↓
后端物理设计(布局布线)
↓
DFT时序收敛
↓
ATPG向量生成 ←—— 输出测试向量
↓
流片(Tape-out)
↓
芯片测试(ATE测试) ←—— 使用DFT向量
关键节点:在综合阶段,DFT工程师需要完成扫描链的插入和ATPG(自动测试向量生成)的初步验证。这一步如果没做好,后面后端跑得再漂亮也没用。我见过一个项目,综合时扫描链没做时序检查,结果后端修了两个月才把扫描时钟树搞定。
1.4 一个简单的DFT示例——扫描链长什么样?
光说理论太枯燥,我给你看个最简单的扫描链结构。
假设我们有一个普通的D触发器,正常模式下它就是个寄存器。但在扫描模式下,它变成了一个移位寄存器的一级:
// 普通D触发器
module dff (
input clk, rst_n,
input d,
output reg q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) q <= 1'b0;
else q <= d;
end
endmodule
// 带扫描功能的D触发器(DFT版本)
module scan_dff (
input clk, rst_n,
input d, // 功能数据输入
input si, // 扫描输入
input se, // 扫描使能(1:扫描模式, 0:功能模式)
output reg q,
output so // 扫描输出(通常直接连q)
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) q <= 1'b0;
else begin
if (se) q <= si; // 扫描模式:串行移位
else q <= d; // 功能模式:正常数据
end
end
assign so = q;
endmodule
你看,改动其实很小。就是在每个触发器上加了一个多路选择器,由se信号控制。当se=1时,所有触发器首尾相连,形成一个长长的移位寄存器——这就是扫描链。
实际项目中:现代EDA工具(如Synopsys的DFT Compiler、Cadence的Genus)会自动帮你完成扫描触发器的替换和链的连接。但你要理解背后的原理,否则出了问题根本不知道从哪里下手。我刚开始做DFT时,就遇到过扫描链断链的问题,折腾了两天才发现是某个手工例化的触发器没有扫描端口。
1.5 小结——DFT不是负担,是保险
说了这么多,其实就想表达一个意思:DFT不是给设计添麻烦的,它是给芯片上保险的。
你想想看,一颗芯片从设计到流片,动辄几百万甚至上千万的成本。如果没有DFT,你拿到的就是一堆“盲盒”——好坏全靠运气。而有了DFT,你可以在ATE测试机上用几分钟就跑完几百万个故障的测试,精准地挑出良品。
嗯,这就是DFT的价值。后面的章节,我会带你一步步深入,从扫描链设计到ATPG向量生成,再到存储器BIST和边界扫描,把DFT的每个环节都讲透。
准备好了吗?我们开始吧。