故障诊断入门:故障字典与诊断算法
各位工程师朋友,今天我们来聊聊故障诊断。说实话,我刚入行那会儿,觉得只要测试能抓到坏芯片就够了。直到有一次,一个客户退回的芯片,测试报告只写了“FAIL”,但具体哪里坏了,完全不知道。那叫一个抓瞎。
从那以后,我深刻理解了——测试不只是判断好坏,更要定位故障。这就是故障诊断的价值。
故障字典(Fault Dictionary)概念
故障字典,说白了就是一本“故障-响应”对照表。你想想看,每个故障都会在输出端产生特定的响应模式。我们把所有可能的故障和它们的响应都记录下来,就形成了字典。
核心思想: 故障 → 输出响应(签名) → 查字典 → 定位故障
我习惯把故障字典分为两类:
- 精确字典:每个故障对应唯一的输出模式。理想情况,但实际很难做到。
- 压缩字典:多个故障可能共享一个签名。节省存储,但分辨率下降。
举个例子,一个简单的电路有10个节点,每个节点可能发生“ stuck-at-0”或“ stuck-at-1”故障。那么字典里就有20个条目。每个条目记录:输入向量 → 输出响应。
// 故障字典示例(简化)
// 故障ID: 节点名_故障类型
// 响应: 输出端观测值
Fault_001: N5_SA0 → 输出 = 1010
Fault_002: N5_SA1 → 输出 = 0101
Fault_003: N8_SA0 → 输出 = 1001
...
嗯,这里要注意:字典的大小会随着电路规模指数增长。我在项目中遇到过,一个百万门级的芯片,完整字典能到几个GB。所以实际应用中,我们通常用压缩字典。
诊断分辨率
诊断分辨率,就是你能把故障定位到多小的范围。分辨率越高,定位越精确。
| 分辨率等级 | 定位范围 | 实际意义 |
|---|---|---|
| 高 | 单个节点/单元 | 直接找到具体故障点 |
| 中 | 几个节点/一条路径 | 需要进一步排查 |
| 低 | 整个模块/区域 | 只能知道大概位置 |
为什么分辨率会下降?原因很多:
- 等价故障:两个不同故障产生完全相同的输出。比如某个门的输入和输出 stuck-at 相同值。
- 冗余逻辑:某些故障根本不影响输出,无法被检测到。
- 测试向量有限:向量越多,分辨率越高,但测试时间也越长。
我的经验: 诊断分辨率不是越高越好。我曾经为了追求极致分辨率,加了大量测试向量,结果测试时间翻了三倍,良率分析反而更复杂了。找到平衡点才是关键。
诊断算法:路径追踪
路径追踪,这个名字很形象。就是从故障输出端,沿着信号路径往回找,直到找到故障源。
算法步骤:
- 从观测到错误的输出端开始
- 检查该输出端的驱动门
- 判断哪个输入引脚导致了错误
- 沿着该输入继续往回追踪
- 重复直到找到原始故障点
我刚开始学这个算法时,总觉得它太简单。直到有一次,一个复杂的时序故障,用路径追踪硬是找到了一个被忽略的hold time违例点。嗯,有时候最简单的工具最有效。
注意: 路径追踪假设故障是单点的。如果存在多个故障同时发生,路径追踪可能会给出错误的方向。我曾经踩过这个坑,花了三天才意识到是双故障。
诊断算法:效应传播
效应传播,和路径追踪正好相反。它是从可能的故障点出发,看故障效应能否传播到输出端。
算法思路:
- 假设某个节点有故障
- 计算该故障的效应能否通过后续逻辑传播到输出
- 如果能传播,且输出与实测一致,则该节点是候选故障点
- 遍历所有节点,找出所有候选
效应传播的好处是:可以处理多故障情况。但计算量比路径追踪大得多。
// 效应传播伪代码
for each node in circuit:
inject fault at node
propagate fault effect through gates
if output matches observed failure:
add node to candidate list
实际项目中,我通常把两种算法结合使用:先用路径追踪快速缩小范围,再用效应传播做精确验证。就像侦探破案,先找线索,再确认证据。
知识体系总览
下面这张图,是我自己整理的故障诊断知识体系。你可以把它当作一个思维导图来看。
这张图把三个核心概念串起来了。你想想看,故障字典是“数据库”,诊断分辨率是“精度指标”,诊断算法是“搜索方法”。三者缺一不可。
一句话总结: 故障诊断就是“查字典找故障,用算法定位,靠分辨率衡量精度”。
好了,关于故障诊断入门就聊到这里。这些概念看起来简单,但真正用好需要大量实践。我建议你找个简单的电路,自己动手建个故障字典试试。纸上得来终觉浅,绝知此事要躬行。
可可精品资料库