1. DFT概述:什么是DFT,为什么需要DFT,DFT在芯片设计流程中的位置

1.1 什么是DFT?说白了就是给芯片装个“体检系统”

DFT,全称是Design for Test,可测性设计。

我经常跟刚入行的同事这么解释:你设计了一颗芯片,功能再牛,性能再强,如果造出来没法测试,那就是一堆废硅片。

DFT的核心思想,就是在芯片设计阶段,就提前植入一些专门的测试电路。这些电路平时不影响芯片正常工作,但在测试模式下,它们能帮你快速定位芯片内部到底哪里出了问题。

举个例子你就明白了:

  • 正常模式:芯片跑你的算法、处理你的数据,DFT电路“隐身”。
  • 测试模式:DFT电路接管,把芯片内部的寄存器连成一条长长的“扫描链”,像串糖葫芦一样。你从外面灌入测试向量,看输出对不对,就能判断内部有没有制造缺陷。

核心要点:DFT不是“事后补丁”,而是“事前布局”。

我见过太多项目,流片回来才发现没法测试,只能拿探针一个个点焊盘测,那效率……嗯,不提也罢。

1.2 为什么需要DFT?三个血泪教训告诉你

你可能会问:芯片设计已经够复杂了,为什么还要额外加一堆测试电路?这不是增加面积和功耗吗?

没错,DFT确实会带来开销。但跟它解决的问题相比,这点代价完全值得。我总结三个核心原因:

原因一:制造缺陷是躲不掉的

芯片制造不是100%完美的。光刻对准偏差、金属线桥接、氧化层针孔、离子注入浓度偏差……这些缺陷在纳米级工艺下非常普遍。

我记得有一次,一颗28nm的芯片,功能仿真全过,流片回来100颗样品,有12颗跑不到目标频率。后来用DFT的扫描链一查,发现是某条关键路径上的一个与非门驱动能力偏弱。如果没有DFT,你根本不知道问题出在哪。

原因二:测试成本决定芯片利润

一颗芯片的测试成本,可能占到总成本的10%~30%。

没有DFT的芯片,测试只能靠功能测试——也就是跑一遍正常功能,看结果对不对。但功能测试覆盖率极低,很多内部节点根本测不到。而且功能测试向量动辄几百万条,测试时间长得吓人。

有了DFT,你可以用ATPG(自动测试向量生成)工具,自动生成高覆盖率的测试向量。测试时间从几小时缩短到几分钟,测试成本直线下降。

我的经验:一个成熟的DFT方案,能把测试成本降低50%以上。我做过一个项目,导入full scan后,测试时间从45分钟降到了8分钟,良率还提升了3个百分点。

原因三:良率分析离不开DFT

芯片流片回来,良率只有70%?你得知道那30%到底坏在哪。

DFT提供了“诊断”能力。通过分析测试失败的扫描链数据,你可以精确定位到某个标准单元、某条金属线。然后反馈给工艺团队,调整工艺参数,下一批良率就能提上去。

没有DFT,你只能对着黑盒子干瞪眼。

1.3 DFT在芯片设计流程中的位置

很多新人以为DFT是后端的事情,或者测试部门的事情。其实不对。

DFT贯穿整个芯片设计流程。我习惯把它分成四个阶段:

设计阶段 DFT工作内容 我的提醒
架构设计阶段 确定DFT策略:选哪种扫描方式?要不要BIST?测试接口用JTAG还是IEEE 1687? 这一步千万别省,后面改架构代价巨大
RTL设计阶段 插入DFT相关的RTL代码:比如测试模式控制逻辑、扫描链使能信号 我习惯在RTL里就把测试模式信号留好,省得后面综合时手忙脚乱
综合与DFT插入阶段 用EDA工具自动插入扫描链、BIST控制器、边界扫描单元 这是DFT工程师的主战场,工具脚本要写扎实
测试向量生成与验证阶段 运行ATPG生成测试向量,做仿真验证,确保测试覆盖率达标 覆盖率不到95%以上,我一般不敢签字放行

注意:DFT不是一次性的工作。在芯片设计流程中,DFT需要反复迭代。

我曾经遇到一个项目,综合后扫描链时序不满足,不得不回头修改RTL。所以我的建议是:DFT要尽早介入,越早越好

1.4 一个简单的DFT结构示例

光说不练假把式。我写个最简单的DFT结构,让你感受一下:

// 一个带扫描功能的D触发器
module scan_dff (
    input  clk,
    input  rst_n,
    input  data_in,    // 正常数据输入
    input  scan_in,    // 扫描数据输入
    input  scan_en,    // 扫描使能:1=扫描模式,0=正常模式
    output reg q
);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            q <= 1'b0;
        else if (scan_en)
            q <= scan_in;   // 扫描模式下,数据从扫描链传入
        else
            q <= data_in;   // 正常模式下,数据从功能路径传入
    end

endmodule

你看,这个电路只多了一个MUX(通过scan_en选择输入源),就能让寄存器在正常模式和扫描模式之间切换。

成千上万个这样的寄存器首尾相连,就构成了一条扫描链。测试时,你把测试向量从扫描链的输入端灌进去,跑几个时钟周期,再从输出端读出来,跟预期值比对——这就是DFT最基础的工作原理。

1.5 小结

这一章我们聊了:

  • DFT是什么:在芯片设计阶段植入测试电路,让芯片变得“可测”。
  • 为什么需要DFT:应对制造缺陷、降低测试成本、支持良率分析。
  • DFT在流程中的位置:从架构到RTL到综合到测试向量生成,贯穿始终。

下一章,我会带你深入扫描链设计的细节。到时候咱们聊聊:扫描链到底怎么插?时序怎么收敛?覆盖率怎么算?

嗯,这些都是实战中天天要面对的问题。