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

大家好,我是你们的DFT讲师。今天咱们聊聊DFT最基础的东西——它到底是什么,为什么非做不可,以及它在整个芯片设计里到底站在哪个位置。

说实话,我刚入行那会儿,对DFT的理解也很模糊。总觉得“设计”就是画电路、写代码,测试那是测试工程师的事。直到有一次,我负责的一块芯片流片回来,功能仿真全过,结果上ATE(自动测试设备)一跑,良率直接崩了……嗯,从那以后,我再也不敢小看DFT了。

1.1 什么是DFT?

DFT,全称是Design for Test,中文叫“可测试性设计”。

说白了,就是你在设计芯片的时候,不光要考虑它能不能正常工作,还得考虑它能不能被高效地测试。你想想看,一颗芯片里动辄几亿个晶体管,焊盘就那么几十个、几百个。你怎么知道里面哪个晶体管坏了?哪个连线短路了?

DFT就是干这个的——在芯片内部“埋”一些额外的电路,让测试设备能通过有限的引脚,访问到芯片内部的每一个角落。

核心思想: 设计阶段就为测试铺好路,而不是等芯片做出来再想办法测。

常见的DFT技术包括:

  • 扫描链(Scan Chain):把普通寄存器串成一条链,测试时可以把数据“灌”进去,再“读”出来。
  • 边界扫描(Boundary Scan / JTAG):在芯片的输入输出引脚上增加测试单元,方便板级测试。
  • 内建自测试(BIST):让芯片自己测试自己,比如Memory BIST,专门测SRAM。
  • 测试压缩(Test Compression):减少测试数据量,缩短测试时间。

我个人习惯把DFT比作“给芯片装了个体检系统”。你平时体检,医生不可能把你全身切开来看,而是通过心电图、抽血、B超这些手段来检查。DFT就是芯片的“心电图”和“B超”。

1.2 为什么需要DFT?

这个问题,我当年也问过我的导师。他的回答很简单:“你不做DFT,流片回来你怎么知道芯片是好的?”

听起来像废话,但细想一下,这里头门道很深。

原因一:芯片制造不是100%完美的

晶圆制造过程中,会有颗粒污染、光刻偏差、掺杂浓度不均等问题。一颗12英寸的晶圆上,可能有几百颗die,总会有几颗是坏的。DFT能帮你把这些坏芯片挑出来,别让它们流到客户手里。

原因二:测试成本占了芯片总成本的大头

你可能不知道,一颗芯片的测试成本,有时候能占到总成本的30%~40%。尤其是先进工艺,测试时间越长,成本越高。DFT做得好,测试时间就能从几秒压缩到零点几秒。我见过一个项目,因为DFT没做好,测试时间长了3倍,最后不得不重新改版——那叫一个惨。

原因三:定位故障需要“可观测性”和“可控制性”

芯片内部是一个黑盒子。没有DFT,你只能测引脚上的信号。但有了扫描链,你可以把任意一个寄存器的值读出来,也可以把任意一个寄存器的值写进去。这就是可观测性和可控制性。

避坑指南: 我曾经在一个项目中,因为漏加了一条扫描链的测试时钟,导致整个芯片的测试覆盖率只有60%。最后不得不手动加测试点,多花了两周时间。所以,DFT一定要在设计初期就规划好,别等到后端再补。

原因四:良率提升和故障分析

DFT不仅能告诉你芯片是好是坏,还能告诉你哪里坏了。通过诊断工具,你可以定位到具体的某个寄存器、某条连线。这对工艺改进和良率提升至关重要。

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

芯片设计流程,一般分为前端设计和后端设计。DFT横跨这两个阶段,但它的“主场”在前端。

我画个简单的流程给你看:

阶段 主要工作 DFT相关任务
架构设计 确定芯片规格、模块划分 确定DFT策略(扫描链数量、BIST方案)
RTL编码 写Verilog/VHDL代码 插入DFT相关的RTL代码(如JTAG控制器)
综合 将RTL转为门级网表 插入扫描链、BIST控制器、测试压缩逻辑
形式验证 验证网表与RTL功能一致 验证DFT逻辑的正确性
ATPG 生成测试向量 运行ATPG工具,生成测试pattern
后端设计 布局布线、时钟树综合 确保DFT时钟和测试模式下的时序收敛
流片 送交晶圆厂 交付测试向量和测试程序
测试 ATE测试、良率分析 运行测试向量,分析测试结果

你看,DFT从架构阶段就开始介入,一直贯穿到测试阶段。它不是某个时间点“加”进去的,而是整个流程中并行推进的一条线。

注意: 很多新手工程师容易犯一个错误——等到综合阶段才想起来做DFT。这时候RTL已经写完了,很多可测试性设计的机会已经错过了。比如,某些内部节点无法被扫描链覆盖,只能靠增加测试点来补救,但测试点会增加面积和功耗。所以,我建议你在写RTL的时候,脑子里就要有DFT这根弦。

1.4 一个简单的例子:扫描链的插入

光说不练假把式。咱们看一个最简单的扫描链插入例子。

假设你有一段RTL代码,里面有三个寄存器:

module example (
  input clk,
  input rst_n,
  input [7:0] data_in,
  output reg [7:0] data_out
);

reg [7:0] reg1, reg2, reg3;

always @(posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    reg1 <= 8'h0;
    reg2 <= 8'h0;
    reg3 <= 8'h0;
  end else begin
    reg1 <= data_in;
    reg2 <= reg1;
    reg3 <= reg2;
  end
end

assign data_out = reg3;

endmodule

在正常模式下,这三个寄存器是串联的流水线。但在测试模式下,我们需要把它们串成一条扫描链。DFT工具会自动做这件事,它会:

  1. 把每个寄存器替换成带扫描功能的寄存器(scan flip-flop)。
  2. 在测试模式下,把reg1的输入接到scan_in,reg1的输出接到reg2的scan_in,以此类推。
  3. 最后reg3的输出接到scan_out。

这样,测试时你就可以通过scan_in灌入一串数据,然后通过scan_out读出来,检查每个寄存器的值是否正确。

小技巧: 我习惯在RTL里预留一个测试模式信号(比如test_mode),这样在仿真时就可以方便地切换功能模式和测试模式,提前验证DFT逻辑是否正确。

1.5 总结

好了,咱们今天聊了DFT的三大核心问题:

  • 什么是DFT——给芯片装“体检系统”,让测试变得可行且高效。
  • 为什么需要DFT——制造缺陷、测试成本、故障定位、良率提升,缺了它都不行。
  • DFT在流程中的位置——从架构到测试,贯穿始终,不是事后补救。

下一章,咱们会深入聊聊扫描链的具体实现,包括扫描触发器的结构、扫描使能信号的控制,以及如何避免常见的扫描链设计陷阱。到时候我会分享一个我踩过的坑——因为扫描使能信号没处理好,导致芯片在测试模式下直接死机……嗯,那故事可有意思了。

今天就到这儿。记住一句话:好的DFT设计,是芯片成功的一半。