第二章:测试基础理论——故障模型、覆盖率、ATPG与故障仿真

各位同学,欢迎来到测试理论的核心章节。说实话,很多工程师做了好几年设计,对测试的理解还停留在“跑个ATPG看看覆盖率”的阶段。但真正遇到芯片回来fail的时候,才知道基础不牢有多痛苦。今天我就带大家把这几个硬骨头啃下来。

2.1 故障模型:芯片为什么会坏?

芯片制造不是完美的。晶圆上的灰尘、光刻的偏差、金属线的断裂……这些物理缺陷最终会表现为逻辑错误。我们做DFT的人,就是要用数学模型去描述这些物理缺陷。这就是故障模型。

2.1.1 Stuck-at 故障模型

这是最经典的模型,也是我入行时学的第一个模型。说白了,就是假设某个节点永远固定在逻辑0或逻辑1,不管你怎么驱动它。

  • Stuck-at-0 (SA0):节点被强制拉到地,永远输出0
  • Stuck-at-1 (SA1):节点被强制拉到电源,永远输出1

举个例子,一个两输入与非门,如果输出端SA0了,那不管输入是什么,输出永远是0。我在项目中遇到过一种情况:芯片在ATE测试时发现某个寄存器总是读不到正确值,追查下来是扫描链上的一个缓冲器SA1了。嗯,这种问题在早期工艺节点很常见。

关键点:Stuck-at模型假设故障是永久性的。一个节点要么SA0,要么SA1,不会同时存在。对于CMOS电路,单个节点的Stuck-at故障数 = 2 × 节点数。

2.1.2 Transition 故障模型

随着工艺进步,芯片速度越来越快。Stuck-at模型只能检测静态故障,但芯片在高速运行时,信号翻转可能来不及完成。这就是Transition故障模型要解决的问题。

Transition故障关注的是信号从0→1或1→0的跳变过程。如果跳变太慢,在采样时刻还没完成,就会出错。

  • Slow-to-Rise (STR):上升沿太慢
  • Slow-to-Fall (STF):下降沿太慢

我记得有一次做28nm芯片的at-speed测试,Stuck-at覆盖率做到了99%,但Transition覆盖率只有85%。结果流片回来,芯片在低频下完全正常,一跑到目标频率就随机出错。后来加了Transition测试向量,才把问题抓出来。你想想看,如果只做Stuck-at测试,这种问题根本发现不了。

个人经验:对于先进工艺(28nm以下),我建议Transition测试的覆盖率目标至少定在90%以上。低于这个数,流片风险会显著增加。

2.1.3 Bridging 故障模型

Bridging故障,说白了就是两根不该连在一起的线短路了。在深亚微米工艺中,金属线间距越来越小,桥接故障的发生概率越来越高。

桥接故障有两种主要类型:

  • AND桥接:两个节点短路后,逻辑表现为线与(如果一方为0,另一方也被拉低)
  • OR桥接:两个节点短路后,逻辑表现为线或(如果一方为1,另一方也被拉高)

我曾经处理过一个案例:芯片在ATE测试时,某个模块的功耗异常高。排查了几个月,最后发现是两条相邻的电源线之间发生了桥接。这种故障用传统的Stuck-at模型根本测不出来,必须用专门的Bridging测试向量。

注意:Bridging故障的测试向量数量通常比Stuck-at多一个数量级。在实际项目中,我们一般只对关键路径和敏感区域做Bridging测试,全芯片做的话测试时间会爆炸。

2.2 测试覆盖率:你到底测了多少?

覆盖率是衡量测试质量的核心指标。但很多人只盯着一个数字看,这是不对的。我见过不少团队,Stuck-at覆盖率做到99%就沾沾自喜,结果芯片回来一堆问题。为什么?因为覆盖率有很多种,每种反映的问题不同。

覆盖率类型 含义 典型目标
Stuck-at覆盖率 检测到的Stuck-at故障数 / 总故障数 ≥98%
Transition覆盖率 检测到的Transition故障数 / 总故障数 ≥90%
桥接覆盖率 检测到的桥接故障数 / 总桥接故障数 ≥85%
动态覆盖率 实际翻转的节点数 / 总节点数 ≥95%

这里我要强调一点:覆盖率不是越高越好。为什么?因为覆盖率从95%做到99%,测试向量数量可能要翻10倍。而测试时间直接关系到芯片成本。我个人的习惯是:先定一个合理的覆盖率目标,然后针对未覆盖的区域做定向分析,而不是盲目地加向量。

核心原则:覆盖率是手段,不是目的。我们的目标是确保芯片在真实场景下能正常工作。有时候,覆盖率99%的芯片可能比98%的芯片更容易出问题——如果那1%恰好是关键路径的话。

2.3 ATPG基本原理:自动生成测试向量

ATPG,全称Automatic Test Pattern Generation。说白了,就是让工具自动生成测试向量,用来检测芯片中的故障。手动写测试向量?那是不可能的,一个百万门的芯片,手动写向量写到下辈子都写不完。

ATPG的核心思想很简单:

  1. 故障激活:让故障节点产生一个与正常值不同的信号
  2. 故障传播:把这个差异信号传播到某个可观测的输出端

举个例子,检测一个与非门输出端的SA0故障:

  • 激活:让两个输入都是1,这样正常输出应该是0,但SA0故障下输出还是0——不对,这样激活不了。正确的做法是让输入为(1,0)或(0,1),正常输出为1,故障下输出为0,这样差异就出来了。
  • 传播:把这个差异信号通过后续逻辑传到输出端

ATPG工具用的算法主要有两种:

  • D算法:基于布尔差分的穷举搜索,适合小规模电路
  • FAN算法:改进的D算法,通过扇出分析和回溯剪枝,效率更高

我记得刚入行时,导师让我手动推导一个简单电路的ATPG向量。我花了整整一天才搞定一个20门的电路。后来用工具跑,0.1秒就出来了。嗯,从那以后我就再也不敢小看工具了。

实用技巧:ATPG工具生成的向量通常包含大量冗余。在实际项目中,我会先用工具跑一个快速模式,看看哪些故障覆盖不到,然后手动调整约束条件。这样比直接跑全量ATPG节省至少50%的时间。

2.4 故障仿真:验证你的测试向量

ATPG生成了向量,但你怎么知道这些向量真的能检测到故障?答案就是故障仿真。故障仿真的本质是:在电路中注入故障,然后用测试向量去跑,看看能不能把故障抓出来。

故障仿真的流程大致如下:

  1. 故障列表生成:从网表中提取所有可能的故障点
  2. 故障注入:在仿真模型中修改某个节点的逻辑值
  3. 仿真运行:用测试向量驱动电路,观察输出
  4. 结果比对:比较故障电路和正常电路的输出,如果不同,说明该故障被检测到了

这里有个坑:故障仿真非常耗时。一个百万门的芯片,全故障仿真可能要跑好几天。我见过一个团队,为了追求完美,跑了整整一周的故障仿真,结果发现覆盖率只提升了0.5%。

避坑指南:我曾经犯过一个错误——在故障仿真时没有考虑时序。结果仿真通过,但实际芯片在ATE上就是过不了。后来发现,有些故障在静态仿真下能检测到,但在动态时序下根本激活不了。所以,对于Transition故障,一定要用时序仿真。

故障仿真的输出通常是一个覆盖率报告,格式如下:

Fault Coverage Report
---------------------
Total faults: 1,234,567
Detected faults: 1,210,000
Undetected faults: 24,567
Coverage: 98.01%

Breakdown by fault type:
  Stuck-at-0: 98.5%
  Stuck-at-1: 97.8%
  Transition STR: 91.2%
  Transition STF: 90.5%

看到这个报告,我会重点关注Undetected faults。如果这些故障集中在某个模块,我会去检查那个模块的测试结构是不是有问题。如果分布很均匀,那可能是测试向量不够,需要加一些定向向量。

2.5 小结:这些理论怎么用在实际项目中?

好了,理论讲完了。但我知道你们最关心的是:这些东西在实际项目中怎么用?我给大家总结几条实战经验:

  • 故障模型的选择:对于成熟工艺(65nm以上),Stuck-at模型基本够用。对于先进工艺,一定要加上Transition和Bridging模型。
  • 覆盖率目标的设定:不要盲目追求100%。我一般设定Stuck-at 98%、Transition 90%、Bridging 85%作为基线,然后根据芯片的用途调整。比如车规芯片,要求会更高。
  • ATPG和故障仿真的配合:先用ATPG生成向量,然后用故障仿真验证。如果覆盖率不达标,分析未覆盖的故障,手动添加定向向量。
  • 测试时间的权衡:测试向量越多,覆盖率越高,但测试时间也越长。在量产中,测试时间直接换算成成本。我一般会在设计阶段就评估测试时间,确保不超过ATE的预算。

下一章,我们会进入DFT设计的核心——扫描链设计。到时候我会详细讲怎么把扫描链插入到你的设计中,以及怎么处理那些让人头疼的时序问题。咱们下章见。