4、SPFM 计算实战:通过一个简单电路示例,手算 SPFM 值
好,前面我们把 SPFM 的定义和公式掰开揉碎讲清楚了。这一章咱们来点实在的——动手算一次。
我个人的习惯是,讲度量一定要配一个能用手算的例子。不然你光看公式,总觉得隔着一层纱。咱们就用一个最简单的组合逻辑电路,把 SPFM 的每一步算出来。
4.1 选一个“麻雀虽小五脏俱全”的电路
为了演示,我选了一个三输入与非门(NAND3)加上一个反相器(INV)的简单组合。你想想看,这个电路虽然只有两个门,但它包含了单点故障度量的所有关键要素:输入、内部节点、输出。
电路结构:
- 输入 A、B、C 接到 NAND3 的三个输入端
- NAND3 的输出节点记为 N1
- N1 接到 INV 的输入端
- INV 的输出节点记为 Y(最终输出)
嗯,这里要注意:我们假设所有输入 A、B、C 都是安全相关的输入,Y 是安全输出。这个电路的作用是:当三个输入都为高电平时,输出 Y 为低电平;否则 Y 为高电平。
4.2 列出所有可能的故障点
做故障度量,第一步就是枚举。我在项目中遇到过不少新手,上来就对着公式算,结果漏了几个故障点,整个 SPFM 值就偏了。
对于这个电路,我们考虑每个逻辑门的每个输入引脚和输出引脚上的 stuck-at 故障。一共是:
| 故障位置 | 故障类型 | 故障编号 |
|---|---|---|
| A 输入 | SA0, SA1 | F1, F2 |
| B 输入 | SA0, SA1 | F3, F4 |
| C 输入 | SA0, SA1 | F5, F6 |
| N1(NAND3 输出) | SA0, SA1 | F7, F8 |
| INV 输入(即 N1) | SA0, SA1 | F9, F10 |
| Y(INV 输出) | SA0, SA1 | F11, F12 |
一共 12 个单点故障。注意,N1 节点既是 NAND3 的输出,又是 INV 的输入。在物理上它是一个节点,但我们在故障枚举时,通常把它算作两个故障位置(输出端和输入端),因为它们的故障效应可能不同。不过为了简化,我们这里把 F7/F8 和 F9/F10 合并考虑——实际上它们是同一个物理节点的 stuck-at 故障。
4.3 判断每个故障是否被安全机制覆盖
现在,我们需要判断每个故障是否会被安全机制检测到。假设我们的安全机制是:在输出 Y 端接了一个比较器,定期将 Y 的值与预期值做比对。
说白了,就是看这个故障能不能通过观察 Y 的值发现。
我们来逐个分析:
判断原则:如果一个故障在任意输入组合下,会导致 Y 的值与无故障时的预期值不同,那么这个故障就是可检测的(被安全机制覆盖)。
咱们先看 NAND3 的输入故障:
- F1(A SA0):当 A 被 stuck at 0,NAND3 的输出 N1 恒为 1(因为 NAND 只要有一个输入为 0,输出就是 1)。那么 INV 输出 Y 恒为 0。但正常情况下,当 A=0 时 Y 应该为 1。所以这个故障会导致 Y 出错,可检测。
- F2(A SA1):当 A 被 stuck at 1,NAND3 的行为取决于 B 和 C。如果 B=C=1,N1 应为 0,但实际为 1(因为 A=1 且 B=C=1 时 NAND 输出应为 0,但 A 被 stuck 不影响,因为 A 本来就是 1)。等等,这里要小心——A SA1 在 A=1 时没有影响,但在 A=0 时,NAND 本应输出 1,但因为 A 实际是 1,所以 N1 取决于 B 和 C。如果 B=C=1,N1=0,Y=1,但正常 A=0 时 Y 应为 1,所以没有差异?不对,正常 A=0 时 N1=1,Y=0。所以当 A=0, B=1, C=1 时,正常 Y=0,故障 Y=1,差异出现。可检测。
嗯,这样逐个分析下去,你会发现大部分故障都是可检测的。但有一个例外:
关键发现:F8(N1 SA1)和 F10(INV 输入 SA1)实际上是同一个物理故障。当 N1 被 stuck at 1 时,INV 输出 Y 恒为 0。但正常情况下,当 A=B=C=1 时,N1=0,Y=1。所以这个故障会导致 Y 出错,可检测。
但是,F7(N1 SA0)呢?当 N1 被 stuck at 0,INV 输出 Y 恒为 1。正常情况下,当 A=B=C=1 时,N1=0,Y=1——没有差异!只有当 A、B、C 不全为 1 时,正常 N1=1,Y=0,但故障时 Y=1,差异出现。所以这个故障也是可检测的。
等等,我是不是说所有故障都可检测?那 SPFM 不就是 100% 了?
别急,咱们再仔细看看。实际上,F11(Y SA0)和F12(Y SA1)是输出端的故障。如果 Y 被 stuck at 0,那么无论输入如何,Y 都是 0。但正常情况下,当 A=B=C=1 时 Y 应该是 0,所以这个故障在 A=B=C=1 时不可检测。同样,Y SA1 在 A、B、C 不全为 1 时也不可检测。
所以,输出端的故障有一部分输入组合下是不可检测的。但我们的安全机制是“定期比对”,只要存在至少一个输入组合能暴露故障,我们就认为该故障是可检测的。
经过完整分析,12 个故障中,有 11 个是可检测的,1 个是不可检测的——F11(Y SA0)在 A=B=C=1 时不可检测,但其他输入组合下可检测。实际上,严格来说,Y SA0 在所有输入组合下都会导致 Y 恒为 0,而正常 Y 在 A=B=C=1 时也是 0,所以这个故障在 A=B=C=1 时是潜伏的。但我们的安全机制如果只做单次比对,可能会漏掉。所以,我们保守地认为 F11 是潜伏故障。
4.4 手算 SPFM
好,现在数据齐了。咱们套公式:
SPFM = 1 - (λ_MPF / λ_total)
其中:
λ_total = 所有单点故障的失效率之和
λ_MPF = 未被安全机制覆盖的单点故障的失效率之和
假设每个故障的失效率相同(简化处理),记为 λ。那么:
- 总故障数:12
- 可检测故障数:11
- 潜伏故障数:1
λ_total = 12 × λ
λ_MPF = 1 × λ
SPFM = 1 - (1λ / 12λ) = 1 - 1/12 ≈ 0.9167 = 91.67%
计算结果:这个简单电路的 SPFM 约为 91.67%。
如果按照 ISO 26262 的要求,ASIL B 需要 SPFM ≥ 90%,ASIL C 需要 ≥ 97%,ASIL D 需要 ≥ 99%。这个电路只能满足 ASIL B。
4.5 这个结果说明了什么?
你想想看,一个只有两个门的电路,SPFM 只有 91.67%。如果换成更复杂的电路,故障点成百上千,任何一个潜伏故障都会拉低 SPFM。
我在项目中遇到过类似的情况:一个简单的传感器接口电路,设计时觉得“这么简单的电路,肯定没问题”,结果一算 SPFM,只有 85%。后来加了诊断覆盖,才勉强达到 ASIL B。
我的经验:
- 输出端的 stuck-at 故障最容易成为潜伏故障,因为输出值在某些输入组合下恰好与故障值一致。
- 安全机制的设计要覆盖所有输入组合,不能只做单点比对。
- SPFM 计算一定要逐故障分析,不能凭感觉。
4.6 知识结构图
下面这张图总结了 SPFM 手算的完整流程:
4.7 小结
这一章我们通过一个简单的 NAND3 + INV 电路,完整地走了一遍 SPFM 的手算流程。你看到了,即使是最简单的电路,也需要逐故障分析,不能偷懒。
记住几个关键点:
- 故障枚举要全面,不能漏掉任何一个引脚
- 可检测性判断要基于安全机制的实际能力
- 输出端故障是潜伏故障的高发区
- SPFM 值直接决定了你能达到的 ASIL 等级