DFT(Design for Testability可测性设计)
在芯片设计时预先插入测试结构,以便后期能有效测试芯片有没有坏。
芯片一旦制造出来,你不能打开看内部电路对不对,只能从外部“输入→输出”测试。
但芯片内部很复杂,很多逻辑你根本测不到,所以我们提前设计“可测性结构”。
常用技术:
- Scan Chain(扫描链)
- BIST(内建自测电路)
- Test Point Insertion(插入测试点)
一、fault model
“Fault model(故障模型)” 是芯片测试(DFT)**和**数字系统设计中非常核心的概念之一。
它的本质是:用抽象的方法模拟电路在制造或运行过程中可能出现的典型故障,方便我们设计测试用例来检测这些故障。
现代芯片结构复杂,不可能穷举所有电路状态来检测是否有错误。 所以我们要 “预设”一组常见的故障模式,然后针对这些模式来设计测试。
这就像体检时,我们先预设常见疾病,做对应项目,而不是把身体拆开来看。
常见的 Fault Models(故障模型)有:
模型名称 | 简称 | 模拟的故障类型 | 举例 |
---|---|---|---|
Stuck-at Fault | SAF | 节点永久卡住在 0 或 1(制造缺陷) | 某个导线断了,总是 0,不随输入变 |
Transition Fault | TF | 节点电平变化太慢(时序缺陷) | 电压没能在时钟周期内翻转,功能错 |
Bridging Fault | BF | 两根导线意外连在一起 | 信号线短路,两条线输出一样 |
Open Fault | OF | 节点悬空(焊接缺陷) | 某个连线没焊好,不导通 |
Delay Fault | DF | 路径延迟过大导致时序失败 | 电路逻辑对但输出太慢 |
Stuck-open Fault | SOF | CMOS 中的晶体管没完全导通或断开 | 在模拟电路和异步电路中较常见 |
Fault Model 的用途?
在 DFT(Design for Testability)中,我们用 fault models 来:
- 设计测试向量(Test Patterns);
- 进行自动故障模拟(Fault Simulation);
- 评估测试覆盖率(Fault Coverage);
- 优化扫描链和测试结构设计。
二、MBIST 内建存储器自测试
Memory Built-In Self Test(内建存储器自测试)
MBIST 是专门用于自动测试芯片内部存储器(如 SRAM、ROM、Cache)是否存在故障的一种内建自测试机制。
现代芯片(SoC、微处理器、ASIC)中常包含大量嵌入式存储器,比如:
- 寄存器堆
- L1/L2 缓存
- 控制表
- 数据缓冲区
这些 RAM/ROM 区域由于面积大、工艺敏感,非常容易出错(bitflip、开短路、耦合等)。
但你又无法像测试逻辑那样“输入输出都能看”,所以必须 内建一个小电路帮我们测试它们,这就是 MBIST。
MBIST 通常包含以下模块:
模块 | 作用 |
---|---|
BIST Controller | 控制测试流程启动、停止 |
Address Generator | 自动生成地址序列,遍历整个 memory |
Data Generator | 自动生成测试数据模式(如 10101010、0000、1111 等) |
Comparator | 比较写入值和读出值是否一致 |
Status Register | 记录测试是否通过,哪一位出错等信息 |
MBIST 通常内建这些内存测试算法:
名称 | 说明 |
---|---|
March C / March C- | 最常用,遍历内存时使用读写操作组合 |
March B / March A | 更复杂,能检测更多类型的耦合故障 |
Checkerboard / GalPat | 检测特定位相互影响的问题 |
Walking 1/0 | 检查每一位是否能独立翻转 |
这些算法可以发现:
- Stuck-at fault(卡住)
- Transition fault(翻转错误)
- Coupling fault(某个位影响另一个位)
三、SCAN扫描测试结构
SCAN 是一种将芯片内部的触发器(Flip-Flops)连接成一条或多条“扫描链”,以便通过外部端口读写内部状态,从而实现结构级测试的方法。
为什么要用 SCAN?
- 芯片内部的触发器、逻辑路径平时是“看不到、碰不到”的;
- 如果只有外部引脚做测试,覆盖率很低;
- 有了 SCAN,我们可以:
- 控制每个触发器的输入(可控性 controllability)
- 观察每个触发器的输出(可观测性 observability)
具体怎么实现
核心做法:给每个 D 触发器前面加一个 2:1 多路选择器(MUX)
让它可以在“功能模式”与“测试模式”之间切换输入来源。
Scan Chain 的工作流程(3个阶段)
步骤1:RTL 级插入 scan-ready DFF
你在设计时,用带有 scan_in / scan_enable 的特殊触发器:
module scan_dff (
input clk,
input scan_enable,
input d, scan_in,
output reg q
);
always @(posedge clk) begin
q <= scan_enable ? scan_in : d;
end
endmodule
步骤2:综合(Synthesis)支持 scan insertion
- 工具如 Synopsys Design Compiler / Cadence Genus 可自动插入 scan;
- 支持“scan_def”或“scan_chain setup”语法;
步骤3:DFT 工具连接扫描链
- 使用 DFT 插件(如 DFTAdvisor)连接所有 scan_dff;
- 决定使用几条链(单链 or 多链);
- 自动生成 scan_in / scan_out 的 pin 映射。
步骤4:生成 ATPG 向量
- 使用 TetraMAX / FastScan 等工具;
- 针对 stuck-at fault / transition fault 生成测试向量;
- 输出 scan 向量文件(.vec、.stil),用于芯片测试或仿真。
BIST
USER RANDOM LOGIC
memory macro
io pad
other hard macro(analog/phy)
fault model 抽象缺陷行为,构造对应的缺陷测试方法