可测性设计与测试

系统讲解数字芯片的可测性设计:故障模型与 stuck-at 覆盖、扫描链插入与 DFT DRC、ATPG 向量生成、测试压缩与测试时间、低功耗测试的峰值功耗问题、逻辑与存储器 BIST、JTAG 边界扫描,以及良率、覆盖率与测试成本的量化权衡。

引言

功能验证回答的是「设计是否符合规格」,可测性设计(DFT)回答的是「这颗芯片造出来有没有坏」。这两件事经常被混为一谈,但它们的数学基础完全不同:验证要证明逻辑正确,测试要在几十亿个晶体管里找出物理缺陷。测试面对的是一个信息论问题——用有限的外部引脚、有限的测试时间,判断一颗黑盒芯片内部是否存在制造缺陷。

DFT 的工程价值极高:测试成本在先进工艺里可以占到芯片总成本的 20%~40%,测试时间直接决定产线吞吐。而 DFT 做得不好会导致「测试逃逸」——坏芯片流到客户手里,代价是召回、赔偿与信誉损失。更糟的是,DFT 电路本身如果引入功能问题(如扫描链影响时序),会造成「测试通过但功能失效」。

DFT 必须从 RTL 阶段就介入,而不是流片前补丁。扫描链插入会改变时序(增加多路选择器)、影响功耗(测试模式全翻转)、占用面积(通常 5%~15%),这些都需要在设计早期预留。本文按「故障模型 → 扫描 → ATPG → 压缩 → 低功耗测试 → BIST → 边界扫描 → 成本」展开。流程位置见 芯片设计流程与 EDA 工具链 ,与功能验证的边界见 SystemVerilog 验证与 testbench ,测试峰值功耗的问题则与低功耗设计紧密相关。

目录

  1. 测试与验证的分野
  2. 故障模型与覆盖率度量
  3. 扫描链:把时序电路变成组合电路
  4. 扫描插入与 DFT DRC 规则
  5. ATPG:自动测试向量生成
  6. 测试压缩与测试时间控制
  7. 低功耗测试与峰值功耗
  8. 逻辑内建自测试 LBIST
  9. 边界扫描与 JTAG
  10. 存储器测试与 MBIST
  11. 良率、逃逸率与测试成本
  12. 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短路/开路导致的固定值扫描 + ATPG99%+
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. 低功耗测试与峰值功耗

扫描测试时的功耗是功能模式的好几倍,原因是:

  1. 移位阶段:所有触发器同时翻转(功能模式下平均只有 5%15% 翻转),动态功耗可以到功能的 510 倍。
  2. capture 阶段:所有触发器在同一个时钟沿同时捕获新值,瞬时电流冲击最大。
  3. 测试频率:为省时间通常用高频测试,进一步放大功耗。

后果:

  • 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 SSstuck-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,对照理解功能验证与结构测试的分工;如果想了解测试模式峰值功耗如何影响电源网络设计,可回看低功耗数字设计。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「芯片与体系结构」更多文章

  1. 低功耗数字设计
  2. RISC-V 向量扩展 RVV
  3. 超标量与乱序执行