固定型故障模型:stuck-at-0/stuck-at-1 的激活、敏化与故障覆盖率
更新时间:2026-09-24。DFT/测试专题。stuck-at 是结构化测试的「普通话」:扫描链怎么把内部节点变成可控制点与观测点,见 ATPG 与扫描链;它测不到的延迟类缺陷怎么补,见 跳变故障与实速测试。
本文要回答的问题
- stuck-at-0 / stuck-at-1 到底是给「什么东西」建模,物理缺陷和逻辑故障是一一对应的吗?
- 明知芯片里可能同时有多处缺陷,工业界为什么坚持单故障假设?
- ATPG 凭什么说一个向量「测到了」某条故障?激活、敏化、传播分别在说什么?
- 一个几百万门的设计,故障数为什么不会爆炸?fault collapsing 在省什么?
- 故障覆盖率怎么算,它和 ATPG、故障仿真构成怎样的闭环?
- stuck-at 覆盖率 99% 以上,芯片质量为什么仍不能只靠它?
一、stuck-at-0 与 stuck-at-1:给逻辑值建的故障模型
stuck-at 故障模型(stuck-at fault model,固定型故障模型)的假设极其朴素:制造缺陷使电路中某一根线(net)永久固定在某个逻辑值上。固定在逻辑 0 叫 stuck-at-0(简写 s-a-0),固定在逻辑 1 叫 stuck-at-1(s-a-1)。故障点可以是一根互连线、一个门的输入引脚或输出引脚;无论上游驱动什么,故障点的值都被「钉死」。
注意模型描述的是逻辑现象而非物理形态。真实的物理缺陷千奇百怪:金属颗粒造成电源到地的短路、过孔开路导致输入浮空、扩散区沾污使晶体管常通或常断……这些物理缺陷大部分在逻辑上的表现恰好是「某根线卡在 0 或卡在 1」。比如 N 管栅氧击穿到地,该门看到的输入几乎恒为 0,就等价于输入 s-a-0。一个物理缺陷可能同时映射出多条逻辑故障,反过来一条逻辑故障也可能由不同缺陷引起——stuck-at 是缺陷的抽象替身,不是缺陷本身。这个替身换来了巨大的好处:故障空间从「连续的物理世界」塌缩成「离散且可枚举的逻辑世界」。还要补充一个使用前提:stuck-at 是门级(逻辑级)模型,它挂在综合后的网表上——线网、基本门、引脚这些对象要先存在,才谈得上给哪根线钉值。所以它和 RTL 仿真看的是同一份结构的不同侧面:功能验证问「行为对不对」,stuck-at 测试问「这堆门每根线通不通」。在测试领域的语境里,说「一条故障」默认指的就是一条 stuck-at 故障,不特别说明时无需追问模型种类。
二、为什么用逻辑级的单故障模型
对一个有 N 根线的电路,完整的故障清单只有 2N 条(每根线两个值),规模与网表线性相关,百万门设计也不过几百万到上千万条故障,工具处理得起。更关键的是工业界主流只假设单固定故障(single stuck-at,SSA):同一时刻芯片里至多存在一条故障。这听起来反直觉——晶圆上的缺陷为什么不能成群出现?理由有三条:
第一,现代工艺下单芯片出现多个独立缺陷的概率本就不高,且大多数多故障的检测向量恰好被单故障向量集覆盖,经验上单故障测试集对多故障也有很好的筛查效果。第二,多故障组合数随缺陷数指数膨胀(m 条故障两两组合就是 O(m²)),生成与仿真成本不可接受。第三,单故障问题在数学上可解:检测一条故障等价于「找一组输入,使好电路与坏电路在某个输出上取值不同」,这是一个有成熟算法(D 算法、PODEM、FAN)的约束满足问题。TetraMAX、TestKompress 这类 ATPG 工具内部处理的正是这张 2N 条故障的清单。
算法求解时用一种紧凑记号描述差异:好电路 1、坏电路 0 记作 D,好 0 坏 1 记作 D'(或写成 D-bar)。敏化传播的过程,就是观察 D 经过一个门时发生什么——AND 门遇到侧输入 1 时 D 原样通过,遇到 0 则输出被钉死成普通 0,D「熄灭」;OR 门的放行值是 0;XOR 门比较特别,任一侧输入都能让另一个输入的差异翻转通过。同时还要解决**正当化(justification)**问题:想要某个门输出特定值,倒推它的输入该怎么给,再从门一级级倒推到芯片引脚;倒推到引脚仍然无解,才宣告这条故障 untestable。激活、敏化、正当化三件事合起来,就是 ATPG 引擎对每条故障做的全部推理。
三、检测一条故障:激活、敏化、传播
要在输出端区分好电路与坏电路,必须同时满足两个条件。下面这张图画出了完整机理。
读图抓住一条链:激活让故障点在好、坏电路里产生差异(一个 D 值:好 1 坏 0),敏化负责让沿途每个门的侧输入「放行」这个差异,传播则把差异一路推到可观测点。三步中任何一步断掉,输出都看不到异常。
用一个最简单的与门(AND2,输入 A、B,输出 Y = A·B)演示检测「A s-a-0」。激活要求故障点在好电路里取与故障相反的值,所以先令 A = 1:好电路中该点为 1,坏电路被钉在 0,差异产生。接着敏化唯一一条通向 Y 的路径,必须令侧输入 B = 1——AND 门在 B=1 时 Y = A,输出复制另一个输入,差异原样通过。于是好电路 Y=1、坏电路 Y=0,主输出上差一个 1,故障被测到。反过来,若令 B=0,则无论 A 是什么 Y 恒为 0,差异被这一级门「掩掉」(mask),向量无效。对照规律:AND/NAND 的侧输入敏化值是 1,OR/NOR 是 0,NOT/缓冲器无需设置。为避免符号混淆,把常见门的敏化值列成一张小表:
| 目标门 | 放行差异的侧输入值 | 差异经过后的变化 |
|---|---|---|
| AND / BUF | 1 | 原样通过 |
| NAND / NOT | 1 / 无侧输入 | 翻转后通过 |
| OR | 0 | 原样通过 |
| NOR | 0 | 翻转后通过 |
| XOR / XNOR | 0(或任意固定值) | 按另一侧值决定是否翻转 |
还有一个传播中的经典陷阱:扇出再汇聚。信号 A 扇出两路,一路直接进 XOR,另一路经反相器进 XOR 同一门——差异沿两条路径同时到达时恰好互相抵消,输出恒等,单条路径看着敏化了,汇聚点上却观测不到。更隐蔽的是两条路径延迟不同,差异变成一个宽度与路径差相关的窄毛刺。ATPG 工具处理组合逻辑时会做蕴含(implication)检查避免逻辑上的假敏化,但时序与毛刺维度本来就超出 stuck-at 的能力范围。
再看多级电路:n1 = A·B,Y = n1 + C(OR2)。仍检测 A s-a-0:激活 A=1;敏化第一级给 B=1,好电路 n1=1、坏电路 n1=0;敏化第二级给 C=0,OR 门在 C=0 时复制另一输入,Y = n1;最终好 Y=1、坏 Y=0,向量 (A,B,C) = (1,1,0) 检测成功。若目标换成「A s-a-1」,激活改为 A=0,敏化条件不变,好电路 Y=0、坏电路 Y=1。
时序电路的麻烦正在这两步上:内部节点既不在芯片引脚上,也无法一拍设置成想要的值。没有扫描结构时,激活一个深处节点往往要先花若干拍把电路逼进特定状态,传播也要等差异被时钟逐拍锁存、移位出来——这正是 ATPG 与扫描链 存在的理由:扫描链把时序电路临时「摊平」成组合电路,让任意触发器可直接控制和观测。有了扫描之后,「施加一个向量」变成一套固定机械动作:先经移位把激励逐拍扫进所有扫描单元(链长多少拍就移多少拍),再发一个捕获时钟让组合逻辑的结果打进触发器,最后再把整条链的内容移出来逐位比对。激活与敏化所需的内部值因此可以像驱动主输入一样直接指定,绝大多数时序电路里的故障也从「可能要几千个状态转移」变成一拍可测——这正是 stuck-at 模型只有配上扫描 DFT 才真正发挥威力的原因。
四、fault collapsing:2N 条故障里有大量「等价品」
严格枚举时每个门的每个输入、输出引脚都算独立故障点,一条 2 输入与门就有 6 条故障。但其中许多故障在逻辑上不可区分,没必要都生成向量,这就是 fault collapsing(故障收缩/折叠)。它靠两类关系压缩清单。
等价收缩(equivalence collapsing):若两条故障在任何输入下坏电路的行为完全相同,它们互为等价故障。AND2 的输出 s-a-0 与任一输入 s-a-0 效果完全一样——把一个输入钉 0,输出永远是 0,和输出直接钉 0 无从区分。三条只保留一条代表。同理 OR2 的输出 s-a-1 与输入 s-a-1 等价,反相器输入与输出上的两条 s-a-0/s-a-1 也彼此等价。
支配收缩(dominance collapsing):若检测故障 f1 的所有向量必然也检测故障 f2,则 f2 支配 f1,f2 可从清单中删除(f1 的测试集白送了 f2 的检测)。AND2 的输出 s-a-1 支配两个输入 s-a-1:要在输出看到恒 1 的异常,向量本来就得让两个输入都为 1,此时任一输入 s-a-1 的差异也同样被激活和敏化。
收缩后,工具实际生成向量的故障数通常降到原始引脚故障数的一半多一点(经验上约 55%~65%),向量生成时间和故障仿真量同步下降,而检测能力没有任何损失——删掉的故障要么等价、要么被别的向量顺带测到。拿前面的 AND2 实算一遍:6 条引脚故障(A、B、Y 各两条),等价收缩把「A s-a-0、B s-a-0、Y s-a-0」三条并成一条,支配收缩再删去被输入 s-a-1 覆盖的「Y s-a-1」,最后只剩 A s-a-0、A s-a-1、B s-a-1 三条代表。读 ATPG 报告时若看到 total faults 明显小于网表引脚数的两倍,不是工具漏算了,而是收缩已经生效。
五、故障覆盖率与 ATPG 闭环
测试质量的核心指标是故障覆盖率(fault coverage):
故障覆盖率 = 已检测故障数(detected)/ 可测故障总数注意分母是「可测」故障。冗余逻辑(为防毛刺或未来功能保留的恒不触发结构)会产生 untestable 故障:数学上不存在任何向量能同时满足激活与敏化,它们经分析后可从分母中剔除,但工具会单独列出供设计方确认——有些「不可测」其实是设计笔误而非真冗余。此外 ATPG 还有检测等级(Detection Indices):仿真确定翻转的算确定检测,只在脉冲竞争下可能检出的降级标记。车规芯片对 stuck-at 覆盖率的典型要求在 99% 以上。
覆盖率不是一次算出来的,而是 ATPG 与故障仿真反复迭代的闭环结果。
这张图有两个容易被忽略的要点。其一,ATPG 为一条故障生成的向量,在故障仿真时会「顺手」检测清单上的许多其他故障,所以迭代次数远少于故障条数;向量压缩(见测试压缩相关流程)正是建立在这种共享之上。其二,闭环的终止条件不是「全部测完」,而是剩余故障要么被证明 untestable,要么补测试点(插入控制点/观测点)后重跑。
迭代中还会遇到一类硬骨头叫随机向量抗拒故障(random-pattern resistant):像 16 输入与门内部某点的 s-a-0,靠伪随机向量恰好凑齐所有侧输入为 1 的概率低到可以忽略,几十万拍都摸不到它。对策有两条:让 ATPG 对剩余故障定向生成确定性向量(向量不长但不可随机替代),或在收敛锥过深的位置插入测试点提高可控性。覆盖率随向量数增长的曲线因此总是「先陡后平」:前几千个向量扫掉九成以上故障,最后几个百分点要花掉多得多的向量和算力,这也是测试成本与质量的主要谈判区间。量产时每条向量都要占 ATE 测试时间,测试时间直接折算成本,所以签核谈的从来不是「覆盖率越高越好」,而是「在给定测试时间预算下覆盖率能做到多少」。
六、局限:stuck-at 测不到「慢」和「桥」
stuck-at 是纯静态、低速的逻辑模型:测试向量在 ATE(自动测试设备)上通常以远低于额定频率的速度施加,只检查稳态逻辑值对不对。于是一整类缺陷从它的视野里消失了——电路逻辑功能完全正确,只是某条路径太慢,实速工作时该到的数据没按时到。这类延迟缺陷(小电阻开路、阈值劣化、电源压降引起的降速)需要 跳变故障与实速测试 里的 transition fault、path delay 模型,配合实速捕获来筛。另一类常见缺陷桥接(bridging,两根本不相连的线短在一起)也不总表现为 stuck-at,线与/线或甚至模拟级耦合都可能发生。
| 维度 | stuck-at 固定故障 | transition 跳变故障 | path delay 路径延迟 | bridging 桥接故障 |
|---|---|---|---|---|
| 建模对象 | 线网恒为 0/1 | 节点慢上升/慢下降 | 整条路径总延迟超限 | 两线短接 |
| 检测条件 | 激活 + 敏化到输出 | 先初始化,再实速打一拍并捕获 | 沿目标路径传播一个跳变 | 两线被驱动成相反值并观测 |
| 施加速度 | 低速即可 | 必须实速(at-speed) | 实速,且关心路径汇聚 | 多为低速或实速 |
| 主要覆盖缺陷 | 开路、短路、晶体管失效 | 大延迟缺陷、 gross 缺陷 | 累积小延迟、分布性降速 | 金属颗粒、工艺挤压短路 |
| 工程成本 | 最低,向量最经典 | 中等,需时序与时钟控制 | 高,路径选择与仿真昂贵 | 建模复杂,常作补充 |
几个反复出现的坑值得单列:把功能验证向量当测试向量——功能向量的 stuck-at 覆盖率往往只有 60%~80%,质量签核必须靠结构化 ATPG;看到高覆盖率就认为万事大吉——stuck-at 99% 对延迟缺陷几乎没有承诺,需要实速测试补充;把 untestable 一律当冗余放过——先要确认它不是设计错误;混淆模型与缺陷——现场失效分析时,失效现象对不上某条 stuck-at 是常态,模型只是筛选工具。
这一篇在知识体系里的位置
本篇是 DFT/测试专题的地基:向上,stuck-at 清单要靠 ATPG 与扫描链 提供的可控性、可观测性才能高效求解,测试压缩则决定向量上 ATE 的成本;向旁,它的静态本性由 跳变故障与实速测试 补上延迟缺陷这一块,两者共同构成量产测试的主体;向后,覆盖率数据进入签核流程,与冗余分析、测试点插入、良率爬坡互相牵动。理解 stuck-at 的「激活—敏化—传播」语言,是读懂所有现代故障模型的前提。
总结
一句话总结:stuck-at 固定型故障模型假设某根线被制造缺陷永久钉在逻辑 0 或 1,用 2N 条离散故障替代无法穷举的物理缺陷,并以单故障假设让问题可计算;检测一条故障必须先把故障点激活成相反值、再把门的侧输入设成放行值(AND 类给 1、OR 类给 0)敏化出一条传播路径,使差异在输出端被观测到;fault collapsing 利用等价与支配关系把故障清单压到六成左右,ATPG 与故障仿真则围绕「已检测/可测故障」的覆盖率反复迭代直至签核——但 stuck-at 只验证低速稳态逻辑,测不到慢路径和桥接类缺陷,必须与 transition/path-delay 实速测试和扫描 DFT 配合,单凭高 stuck-at 覆盖率不能保证芯片质量。