一、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不可或缺?说白了有三大原因:

  1. 制造缺陷是客观存在的 —— 晶圆制造过程中的颗粒污染、光刻偏差、金属桥接等,都会导致芯片失效。这不是设计能避免的。
  2. 功能测试覆盖不全 —— 一个复杂的SoC,功能测试向量可能几百万条,但依然只能覆盖不到70%的故障。而DFT的扫描测试,用几千条向量就能达到95%以上的覆盖率。
  3. 定位故障需要可观测性 —— 芯片坏了,你得知道坏在哪。没有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的每个环节都讲透。

准备好了吗?我们开始吧。