引言
功能验证回答的是「设计是否符合规格」,可测性设计(DFT)回答的是「这颗芯片造出来有没有坏」。这两件事经常被混为一谈,但它们的数学基础完全不同:验证要证明逻辑正确,测试要在几十亿个晶体管里找出物理缺陷。测试面对的是一个信息论问题——用有限的外部引脚、有限的测试时间,判断一颗黑盒芯片内部是否存在制造缺陷。
DFT 的工程价值极高:测试成本在先进工艺里可以占到芯片总成本的 20%~40%,测试时间直接决定产线吞吐。而 DFT 做得不好会导致「测试逃逸」——坏芯片流到客户手里,代价是召回、赔偿与信誉损失。更糟的是,DFT 电路本身如果引入功能问题(如扫描链影响时序),会造成「测试通过但功能失效」。
DFT 必须从 RTL 阶段就介入,而不是流片前补丁。扫描链插入会改变时序(增加多路选择器)、影响功耗(测试模式全翻转)、占用面积(通常 5%~15%),这些都需要在设计早期预留。本文按「故障模型 → 扫描 → ATPG → 压缩 → 低功耗测试 → BIST → 边界扫描 → 成本」展开。流程位置见 芯片设计流程与 EDA 工具链 ,与功能验证的边界见 SystemVerilog 验证与 testbench ,测试峰值功耗的问题则与低功耗设计紧密相关。
目录
- 测试与验证的分野
- 故障模型与覆盖率度量
- 扫描链:把时序电路变成组合电路
- 扫描插入与 DFT DRC 规则
- ATPG:自动测试向量生成
- 测试压缩与测试时间控制
- 低功耗测试与峰值功耗
- 逻辑内建自测试 LBIST
- 边界扫描与 JTAG
- 存储器测试与 MBIST
- 良率、逃逸率与测试成本
- DFT 的工程流程与签核
1. 测试与验证的分野
两者的目标、方法和产出完全不同:
| 维度 | 功能验证 | 可测性设计与测试 |
|---|---|---|
| 目标 | 设计符合规格 | 芯片无制造缺陷 |
| 对象 | RTL / 网表 | 硅片 |
| 手段 | 仿真、形式验证、UVM | 扫描链、ATPG、BIST |
| 度量 | 功能覆盖率 | 故障覆盖率 |
| 输入 | 测试激励(随机/定向) | 测试向量(ATPG 生成) |
| 何时做 | 设计阶段 | 设计阶段插入、生产阶段执行 |
| 失败含义 | 设计 bug | 制造缺陷(或测试本身有问题) |
关键区别是「缺陷的来源」:验证找的是设计错误(人写错了逻辑),测试找的是制造缺陷(光刻缺陷、颗粒污染、金属短路、栅氧击穿)。制造缺陷是随机分布的,无法用功能场景穷举,必须用结构化的方法。
测试的两个指标:故障覆盖率(fault coverage) 衡量测试向量能检出多少种故障;缺陷逃逸率(DPPM,Defects Per Million) 衡量出厂芯片里还有多少坏片。前者是设计指标,后者是质量指标,通常要求 DPPM < 100(即百万片里少于 100 片坏片)。
2. 故障模型与覆盖率度量
物理缺陷太多太复杂,无法逐一建模,所以用故障模型抽象。最经典的是固定故障模型(stuck-at fault):假设某条信号线永远固定为 0(stuck-at-0)或 1(stuck-at-1)。
| 故障模型 | 建模对象 | 检测手段 | 典型覆盖率 |
|---|---|---|---|
| stuck-at | 短路/开路导致的固定值 | 扫描 + ATPG | 99%+ |
| transition(TDF) | 延迟缺陷、慢路径 | 双拍向量(launch/capture) | 90%~95% |
| path delay | 特定路径延迟超限 | 路径敏化向量 | 视路径数 |
| bridging | 相邻线短路 | 特殊向量模式 | 视工艺 |
| IDDQ | 静态电流异常 | 测静态电流 | 辅助手段 |
| cell-aware | 单元内部缺陷 | 单元级故障模型 | 95%~99% |
为什么 stuck-at 覆盖率能做到 99%+ 却仍会漏缺陷? 因为实际缺陷不只是固定值。例如一个「电阻性短路」可能只在特定电压温度下表现,stuck-at 模型检不出。因此先进工艺里需要组合多种故障模型:stuck-at 打底、transition 抓延迟缺陷、cell-aware 抓单元内部缺陷、IDDQ 辅助。
覆盖率的分母与分子:
故障覆盖率 = 可测故障中能检出的数量 / 可测故障总数
(不可测故障如未连接的线、冗余逻辑要剔除)
典型目标:
数字逻辑 stuck-at ≥ 99%
transition ≥ 90%
存储器 ≥ 99%
模拟/混合信号:用功能测试 + 结构测试组合
测试覆盖率与逃逸率的经验关系(经验值,随工艺变化):
stuck-at 覆盖率 99.0% → DPPM ≈ 1000
99.5% → DPPM ≈ 300
99.9% → DPPM ≈ 50
这解释了为什么覆盖率的目标不是 99% 而是 99.9%——最后 0.9% 的收益是 20 倍的质量差距。但也意味着收益递减:从 99% 到 99.9% 需要大量额外的向量与设计工作。
3. 扫描链:把时序电路变成组合电路
ATPG 的难点在于时序电路的状态不可控、不可观:要测试一个深藏在 10 级流水线里的组合逻辑,需要先把前面所有触发器的状态设好,再观察后面触发器的值,这在外部引脚上做不到。
扫描设计(scan design) 的解决方案极其巧妙:把每个触发器替换成扫描触发器(scan flip-flop),它前面加一个 2 选 1 多路选择器,可以在「功能模式」和「扫描模式」之间切换。
// 扫描触发器:功能模式走 D,扫描模式走 SI
always @(posedge clk)
if (scan_en) q <= si; // 移位
else q <= d; // 功能
把所有扫描触发器串成一条或多条扫描链,就有了一个「移位寄存器」:
扫描模式(scan_en = 1):SI → [FF1] → [FF2] → ... → [FFn] → SO
经过 n 个周期,可以把任意模式移入,把内部状态移出
测试流程(每个向量):
1. Shift in :把测试模式串行移入扫描链(n 周期)
2. Capture :scan_en = 0,功能时钟打一拍,组合逻辑结果被捕获
3. Shift out:把结果串行移出(n 周期),同时移入下一个向量
扫描设计的威力在于「可控 + 可观」:任何内部触发器的值都可以设定(可控),任何内部触发器的值都可以读出(可观)。于是 ATPG 只需要处理「触发器之间的组合逻辑」,这是一个纯组合问题,复杂度从指数级降到可管理。
代价:
- 面积:每个触发器多一个 MUX,约 10%~20% 的触发器面积增加,全芯片 5%~15%。
- 时序:MUX 插在触发器的 D 端,增加了数据路径延迟(通常几十 ps)。在关键路径上可能需要优化。
- 功耗:扫描移位时所有触发器同时翻转,功耗远高于功能模式。
- 引脚:需要额外的 scan_en、scan_in、scan_out 引脚(可以复用功能引脚)。
部分扫描(partial scan) 只把一部分触发器做成扫描,用于时序开销敏感的场景,代价是 ATPG 复杂度上升(剩下的是时序电路)。全扫描(full scan) 是主流,覆盖率与向量质量都最好。
4. 扫描插入与 DFT DRC 规则
扫描链的插入由 EDA 工具自动完成(如 Synopsys DFT Compiler、Cadence Modus、Mentor Tessent),但需要设计满足一系列可测性规则(DFT DRC),否则工具无法插入或插入后测试无效。
常见 DRC 规则与违反后果:
| 规则 | 要求 | 违反后果 |
|---|---|---|
| 时钟可控 | 每个时钟能被测试模式控制或旁路 | 无法 capture |
| 异步复位可控 | 复位在测试模式可禁用 | 状态被强制复位,capture 失效 |
| 无组合环 | 组合逻辑不能有反馈环 | ATPG 无法求解 |
| 无黑盒 | 不能有未建模的模块 | 该部分不可测 |
| 三态总线可控 | 三态使能可控制 | 总线冲突导致测试失败 |
| 时钟门控可旁路 | ICG 在测试模式可强制开启 | 部分触发器收不到时钟 |
| 无 latch 或 latch 可测 | 锁存器需特殊处理 | 时序不可控 |
| 常数线可识别 | 综合产生的常数线要标记 | 影响覆盖率统计 |
时钟与复位的处理是 DRC 的重点。典型做法是在测试模式下用旁路逻辑:
// 测试模式下的时钟与复位旁路
wire test_mode; // 来自 DFT 控制器
wire func_clk, test_clk;
wire gated_clk = test_mode ? test_clk : func_clk; // 测试用干净时钟
// 复位在测试模式被禁用,避免 capture 阶段被复位
wire rst_n_gated = test_mode ? 1'b1 : func_rst_n;
// 时钟门控在测试模式强制开启,保证所有触发器都能收到时钟
wire icg_en = test_mode ? 1'b1 : func_en;
ICG 的测试处理是常见坑:功能模式下 ICG 会关闭部分时钟,测试模式下如果某些触发器收不到时钟,它们的值就不可控也不可观。标准做法是加一个「test enable」输入到 ICG,测试模式下强制开启(标准单元库通常提供带 TE 引脚的 ICG)。
扫描链的组织:
链数选择:链数太少 → 移位时间长;链数太多 → 占用引脚与布线资源
经验:每条链 1000~5000 个触发器,链数 8~64
链的均衡:各链长度尽量一致,测试时间由最长链决定
锁存器顺序:同一链内的触发器要能用同一个时钟移位(同域)
链的顺序由工具自动排序以最小化布线长度(scan reorder)
5. ATPG:自动测试向量生成
ATPG(Automatic Test Pattern Generation) 的任务是:为每个故障生成一个测试向量,使得该故障在输出端可观测。
基本方法有两大类:
D 算法(D-algorithm):用符号 D(正常为 1、故障为 0)和 D’(反之)在电路中传播。流程是:
1. 激活(activate):在故障点产生 D 或 D'(设置必要的输入)
2. 敏化(sensitize):把故障效应传播到某个输出(沿途设置旁路输入)
3. 一致性检查(justify):把沿途设置的所有输入值反向推导到可控制的引脚
PODEM / FAN:D 算法的改进,用「目标导向 + 回溯」代替穷举,效率高得多,是现代 ATPG 的基础。
# 典型 ATPG 流程(以 Tessent 为例的伪命令)
set_faults -model stuck_at # 设置故障模型
add_faults -all # 添加所有故障
set_atpg -abort_limit 10 # 每个故障的回溯上限
run_atpg -auto_compression # 运行 ATPG + 自动压缩
report_faults -summary # 报告覆盖率
# 输出示例:Pattern count = 12,450, Fault coverage = 99.42%
ATPG 无法覆盖的情况:
- 冗余逻辑:某些故障在逻辑上无法观测(如被常数掩盖),这些是「不可测故障」,要从分母剔除。
- ATPG 放弃(abort):回溯超过上限,标记为 aborted,会拉低覆盖率。可通过增加回溯上限或改进设计解决。
- 未建模模块:黑盒、模拟模块、存储器(需要 BIST 单独处理)。
X 值的传播是 ATPG 的核心难题:未初始化的寄存器、存储器输出、多时钟域的未同步逻辑都会产生 X。X 会污染输出响应,使故障不可观测,还会降低压缩率。DFT 流程里有专门的一步X 掩蔽与 X 阻塞(X-blocking),在压缩前把 X 源隔离。
6. 测试压缩与测试时间控制
现代芯片有几十万到几百万个触发器,扫描链移位一次要几十万周期。如果每个测试向量都要完整移位,测试时间会长到不可接受。测试压缩是必需的技术。
压缩的基本原理:利用「测试向量里绝大多数位是无关位(X/don’t care)」这个事实,用少量的外部通道驱动大量的内部扫描链。
| 技术 | 原理 | 压缩比 |
|---|---|---|
| 组合压缩(XOR 网络) | 多链共享输入,输出用 XOR 折叠 | 10x~50x |
| 序列压缩(LFSR 重播种) | 用 LFSR 生成向量,只存种子 | 50x~200x |
| 广播(broadcast) | 多链共享同一激励 | 视结构 |
| 组合 + 序列混合 | 主流方案 | 100x~400x |
未压缩:1000 条扫描链 → 需要 1000 个扫描输入引脚(不可能)
压缩后:1000 条链 → 8 个输入通道 + 8 个输出通道 → 压缩比 125x
测试向量数不变,但外部通道数大幅减少
压缩的代价与陷阱:
- X 值会破坏压缩:XOR 网络里一个 X 会污染整组输出。必须先把 X 阻塞掉。
- 压缩比与覆盖率权衡:高压缩比可能让某些故障变得不可测,覆盖率下降 0.1%~0.5%。需要迭代调整。
- 诊断能力下降:压缩后故障定位变难,量产时的失效分析需要额外的诊断向量。
测试时间计算:
测试时间 = 向量数 × (移位周期数 + capture 周期数) / 测试频率
≈ 向量数 × 最长链长度 / 测试频率
例:向量 12,000 条,最长链 3,000 个 FF,测试频率 50MHz
时间 = 12000 × 3000 / 50e6 = 0.72 秒/芯片
100 万片 → 200 小时(单测试机)
0.72 秒听起来不长,但在量产中每片 0.7 秒意味着需要多台测试机并行。测试时间直接换算成测试成本,所以压缩与多链并行是必备的。
7. 低功耗测试与峰值功耗
扫描测试时的功耗是功能模式的好几倍,原因是:
- 移位阶段:所有触发器同时翻转(功能模式下平均只有 5%
15% 翻转),动态功耗可以到功能的 510 倍。 - capture 阶段:所有触发器在同一个时钟沿同时捕获新值,瞬时电流冲击最大。
- 测试频率:为省时间通常用高频测试,进一步放大功耗。
后果:
- IR drop 导致误判:电源电压瞬间跌落,逻辑变慢,捕获到错误值 → 良品被判为坏品(overkill),损失良率。
- 热损伤:持续高功耗可能损伤芯片或探针卡。
- 测试不稳定:同一芯片在不同温度下结果不同。
缓解手段:
| 手段 | 做法 | 效果 |
|---|---|---|
| 低功耗 ATPG | 生成的向量减少同时翻转 | 功耗降 30%~50% |
| 移位时钟降频 | 移位用低速时钟,capture 用全速 | 简单有效 |
| 扫描链分段 | 只激活部分链 | 功耗降 50%+ |
| 时钟门控测试 | 分组移位,错开翻转 | 视分组 |
| 填充无关位 | 用 0/1 填充减少翻转 | 降 20%~40% |
| 电源加固 | 增加去耦电容、电源网络加宽 | 治标 |
低功耗 ATPG 的核心思想:在填充无关位(X-filling)时,优先选择「与上一拍相同」的值,让相邻周期的翻转最少。这不会降低覆盖率(因为 X 位本来就是无关的),是「免费的」功耗优化。
X-filling 策略对比(同一向量的移位序列):
随机填充:0 1 0 1 0 1 0 1 → 每拍全翻转,功耗最大
0 填充 :0 0 0 0 0 0 0 0 → 翻转少但可能偏置
低功耗填充:按相邻位最小翻转选择 → 翻转最少,功耗最低
测试模式的峰值功耗是电源网络设计的最坏情况,必须在电源规划阶段就考虑,而不是等到功耗签核时才发现,这也是低功耗设计里峰值功耗分析要专门覆盖的场景。
8. 逻辑内建自测试 LBIST
BIST(Built-In Self-Test) 把测试激励生成与响应分析都放到芯片内部:
LBIST 结构:
[PRPG] ──→ [ 被测逻辑 ] ──→ [MISR]
伪随机 (扫描链) 多输入
模式生成器 签名寄存器
PRPG:LFSR 生成伪随机向量,替代外部激励
MISR:把输出压缩成一个「签名」,测试结束读签名比对
优点:
- 不依赖外部测试设备:可以在系统内运行(上电自检、定期自检),适合安全关键场景(汽车、医疗)。
- 测试时间短:片上生成向量,不受外部通道带宽限制。
- 可覆盖外部难以测试的部分:如芯片内部的 PLL、存储器。
缺点:
- 覆盖率受限:伪随机向量对某些故障(如难测故障、冗余逻辑附近)命中率低,需要加权随机或混合模式(PRPG + 少量确定性向量)补足。
- 面积开销:PRPG + MISR + 控制器约占 1%~5% 面积。
- 签名混淆(aliasing):MISR 压缩会丢失信息,理论上存在「故障但签名正确」的概率(约 2^-n,n 是 MISR 位数,通常可忽略)。
- X 值问题:同压缩一样,X 会污染 MISR 签名,必须先阻塞。
LBIST 与扫描测试的分工:量产测试用扫描 + ATPG(覆盖率最高、诊断能力最强),系统内自检用 LBIST(无需设备、可重复运行)。两者通常共用扫描链硬件。
9. 边界扫描与 JTAG
边界扫描(boundary scan) 解决的是板级互连测试问题:芯片焊到 PCB 上以后,如何测试芯片之间、芯片与连接器之间的连线是否开路/短路?传统方法用探针床,但 BGA 封装和密集布线让探针不可行。
IEEE 1149.1(JTAG) 定义了标准方案:在每个 I/O 引脚旁放一个边界扫描单元(BSC),把所有 BSC 串成一条扫描链,通过 4~5 根引脚(TCK、TMS、TDI、TDO、可选 TRST)控制。
JTAG 的 TAP 控制器状态机(16 个状态):
Test-Logic-Reset → Run-Test/Idle → Select-DR → Capture-DR → Shift-DR → Update-DR
→ Select-IR → Capture-IR → Shift-IR → Update-IR
必需指令:BYPASS(1 位旁路)、EXTEST(外部测试)、SAMPLE/PRELOAD、IDCODE
可选指令:INTEST、RUNBIST、CLAMP、HIGHZ 等
JTAG 的用途远不止板级测试:
| 用途 | 说明 |
|---|---|
| 板级互连测试 | EXTEST 驱动输出、采样输入 |
| 芯片内部测试 | 通过 JTAG 访问内部扫描链(需额外指令) |
| 调试 | CPU 的 JTAG 调试端口(如 RISC-V 的 Debug Module) |
| 编程/配置 | FPGA 配置、Flash 烧写 |
| 边界扫描链诊断 | 定位 PCB 上的开路/短路 |
RISC-V 的调试接口基于 JTAG:一个 Debug Module(DM) 通过 DMI(Debug Module Interface)连接 TAP,支持 halt/resume、读写寄存器、读写内存、硬件断点。这部分与 RISC-V 工具链与裸机开发 里的 OpenOCD 调试直接相关。
JTAG 的安全风险:JTAG 能读写内存、halt CPU,是攻击者的理想入口。量产芯片通常在生产测试后永久禁用 JTAG(熔丝烧断),或加认证机制(如 RISC-V 的 Debug Authentication)。
10. 存储器测试与 MBIST
片上存储器(SRAM、ROM、寄存器堆)通常占芯片面积的 40%~60%,且不能直接用扫描链测试——把 SRAM 的每一位都做成可扫描会使面积翻倍。
MBIST(Memory BIST) 用专门的测试算法与硬件:
| 算法 | 覆盖故障 | 复杂度 |
|---|---|---|
| March C- | stuck-at、transition、部分耦合 | O(10N) |
| March SS | stuck-at、transition、耦合、地址译码 | O(22N) |
| Checkerboard | 相邻单元耦合 | O(4N) |
| GALPAT | 全耦合(最彻底) | O(4N²),太慢 |
| Walking 1/0 | 地址译码、耦合 | O(2N²),慢 |
March C- 序列(↑ 升序,↓ 降序,r/w 读写):
⇕(w0) 全写 0 → ↑(r0,w1) → ↑(r1,w0) → ↓(r0,w1) → ↓(r1,w0) → ⇕(r0) 全读 0
复杂度 10N(N 是存储单元数),能覆盖 stuck-at 与 transition
MBIST 的架构:一个 MBIST 控制器(可用一个控制器分时测试多个存储器,或每个存储器一个)产生地址、数据、控制信号,读回的数据与期望值比对,结果汇总成一个 pass/fail 信号。
// MBIST 控制器的核心状态机(简化)
localparam S_IDLE=0, S_W0=1, S_R0W1=2, S_R1W0=3, S_RD=4, S_DONE=5;
// 每个状态的地址递增/递减,读回数据与期望比对,不符则置 fail
always @(posedge clk) begin
case (state)
S_W0: begin mem_we <= 1; mem_data <= 0; if (addr == LAST) state <= S_R0W1; end
S_R0W1: begin mem_we <= 1; mem_data <= 1;
if (mem_rdata != 0) fail <= 1; // 检查
if (addr == LAST) state <= S_R1W0; end
// ... 其余状态类似
endcase
end
存储器的冗余修复(repair):大容量 SRAM 通常会预留冗余行/列,测试发现坏单元后用熔丝或 eFuse 切换到冗余单元。MBIST + BISR(Built-In Self-Repair) 是先进工艺的标准配置——没有修复能力,SRAM 良率会低到不可接受。
存储器测试的挑战:容量大导致测试时间长(March C- 对 1Mb SRAM 需要约 1000 万周期)、功耗高(全速测试时 SRAM 电流大)、以及多存储器并行测试的调度问题。
11. 良率、逃逸率与测试成本
DFT 的最终目标是在可接受的成本下把逃逸率压到目标值。三者是互相牵制的:
测试成本 = 测试机时间成本 + 探针卡/测试板成本 + 设计成本(DFT 面积 + 人力)
逃逸率 ∝ f(故障覆盖率, 故障模型完备性, 测试条件覆盖)
良率损失 = 测试 overkill(好片被判坏)+ 真实缺陷
测试成本的构成(先进工艺经验值):测试机时间 40%~60%(与测试时间成正比)、探针卡与高频测试板 10%~20%、DFT 面积开销 5%~15%(扫描 + BIST + 压缩)、DFT 设计人力 10%~20%、失效分析 5%~10%。
降低测试成本的手段:
- 并行测试(multi-site):一台测试机同时测多颗芯片,摊薄固定成本。需要芯片测试时间短且引脚数少。
- 压缩与多链:直接缩短测试时间。
- 测试项裁剪:通过「测试项有效性分析」找出对逃逸率贡献小的测试项(如某些 IDDQ 项),裁掉以省时间。
- 自适应测试:根据前序测试结果动态跳过后续测试(如良率高的批次少测几项)。
- 片上时钟生成:用芯片内部的 PLL 产生高速测试时钟,不受测试机频率限制。
良率与 DFT 的关系:DFT 不仅测缺陷,还提升良率——通过冗余修复(SRAM)、通过「部分好的芯片降级出售」(如 8 核里 2 核坏,降级为 6 核型号)。这些「良率工程」手段的前提是 DFT 能准确定位缺陷。
12. DFT 的工程流程与签核
DFT 不是一个阶段,而是贯穿整个流程的并行轨道:
RTL 阶段:
- 制定 DFT 架构(扫描链数、压缩方案、BIST 覆盖范围)
- 编写 DFT 规则检查(DRC)脚本,纳入 CI
- 插入测试模式下的时钟/复位旁路逻辑
- 预留测试引脚(scan_en、scan_in/out、JTAG)
综合阶段:
- scan-ready 综合(综合时就考虑扫描,避免后期改时序)
- 插入扫描链(DFT Compiler / Modus / Tessent)
- DFT DRC 全量检查(必须零违例)
- ATPG 首次运行,评估覆盖率
布局布线阶段:
- 扫描链重排序(scan reorder)优化布线
- 时钟树综合时考虑测试模式(test clock 也要平衡)
- 时序签核包含测试模式(test mode STA)
- 电源签核包含测试模式峰值功耗
签核:
- 故障覆盖率达标(stuck-at ≥ 99%,TDO ≥ 90%)
- 测试向量生成完毕,向量数量与测试时间达标
- 测试模式时序收敛(与功能模式同等严格)
- 低功耗测试的功耗分析通过
测试模式时序签核容易被忽视:测试模式下时钟结构不同(用 test clock)、扫描链的 MUX 增加了延迟、压缩逻辑增加了路径。如果只签核功能模式的时序,测试模式可能在硅上失败,表现为「部分芯片测试失败但功能正常」——这类问题极难定位。
DFT 与功能验证的交叉检查:扫描插入后必须重新跑功能验证,确认扫描逻辑不影响功能(scan_en 在功能模式下为 0,MUX 走功能路径)。这个检查叫 scan-inserted netlist 的功能回归,是 DFT 流程的必做项。
权衡取舍
| 决策点 | 选项 A | 选项 B |
|---|---|---|
| 扫描范围 | 全扫描:覆盖率高、面积大 | 部分扫描:省面积、ATPG 难 |
| 故障模型 | 只做 stuck-at:快、漏延迟缺陷 | 加 transition:覆盖好、向量多 |
| 压缩比 | 高压缩:省时间、覆盖率略降 | 低压缩:覆盖好、测试时间长 |
| 测试频率 | 全速:时间短、功耗高 | 降频:功耗低、时间翻倍 |
| BIST 方案 | LBIST:无设备依赖、覆盖率低 | 扫描 + ATPG:覆盖高、需设备 |
| JTAG 保留 | 保留:可调试、有安全风险 | 熔丝禁用:安全、失去调试能力 |
| 存储器测试 | MBIST:专用硬件、覆盖好 | 扫描:面积翻倍、不可行 |
| 冗余修复 | 有 BISR:良率高、面积大 | 无:省面积、良率低 |
常见坑清单
- 测试模式时序未签核:只签功能模式,测试模式在硅上违例,表现为部分芯片测试失败。
- ICG 在测试模式未强制开启:部分触发器收不到时钟,值不可控不可观,覆盖率骤降。
- 异步复位未在测试模式禁用:capture 阶段被复位,捕获值全错。
- X 值未阻塞:X 污染压缩网络与 MISR 签名,故障不可观测且压缩率暴跌。
- 扫描链长度不均衡:测试时间由最长链决定,不均衡导致时间浪费。
- 扫描插入后未跑功能回归:MUX 逻辑错误导致功能模式异常,却因为没回归而漏检。
- 测试峰值功耗未评估:移位与 capture 时电流冲击导致 IR drop,好片被判坏(overkill)。
- 存储器未做 MBIST:SRAM 无法用扫描测试,漏测导致存储器缺陷逃逸。
- JTAG 未在生产后禁用:留下安全后门,攻击者可 halt CPU 并读写内存。
- ATPG 向量未做仿真验证:向量本身有误(如时序假设错),在测试机上失败却难以定位。
- DFT 面积未预留:流片前才插扫描,面积与时序都超标,被迫返工。
小结
可测性设计的核心逻辑是**「把不可控不可观的时序电路,通过扫描链变成可控可观的组合电路,再用 ATPG 系统性地覆盖故障模型」**。围绕这条主线,压缩解决测试时间、BIST 解决设备依赖、JTAG 解决板级与调试、MBIST 解决存储器,而低功耗测试解决的是「测试本身不能把好片测坏」这个反直觉问题。
工程上最关键的三条经验:一是 DFT 必须从 RTL 阶段并行介入,扫描插入会改变面积、时序与功耗,后期补丁代价极高;二是测试模式的时序与功耗必须与功能模式同等签核,否则会出现「功能正常但测试失败」的诡异问题;三是覆盖率的目标是 99.9% 而不是 99%,最后 0.9% 对应的是 20 倍的质量差距。
下一步建议阅读 SystemVerilog 验证与 testbench,对照理解功能验证与结构测试的分工;如果想了解测试模式峰值功耗如何影响电源网络设计,可回看低功耗数字设计。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。