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 手算的完整流程:

SPFM 手算流程 步骤1:选择电路并枚举故障 步骤2:分析每个故障的可检测性 步骤3:区分可检测与潜伏故障 步骤4:代入公式计算 SPFM 步骤5:对照标准评估 ASIL 等级 关键:每个故障必须逐条分析,不能跳过或合并 输出端故障最容易成为潜伏故障,需特别关注

4.7 小结

这一章我们通过一个简单的 NAND3 + INV 电路,完整地走了一遍 SPFM 的手算流程。你看到了,即使是最简单的电路,也需要逐故障分析,不能偷懒。

记住几个关键点:

  • 故障枚举要全面,不能漏掉任何一个引脚
  • 可检测性判断要基于安全机制的实际能力
  • 输出端故障是潜伏故障的高发区
  • SPFM 值直接决定了你能达到的 ASIL 等级