Silent Data Corruption (SDC) — 静默误算如何击穿 ISO 26262 的 DC/LFM 假设

功能安全L2别名 Silent Data Corruption · SDC · 静默数据损坏 · Silent Error · Mercurial Core · Corrupt Execution Error · CEE · 潜伏故障 · Latent Fault · SBST · STL · LBIST · in-field test · diagnostic coverage gap

本质与导读

本质 SDC (Silent Data Corruption) 让硬件算出错误结果却不报错、不进日志、不触发异常,直接打破 ISO 26262 硬件度量的隐含前提——危险失效要么被 SM 检测到、要么是低概率随机事件。Google 称之为 mercurial core,Meta 实测约每 1000 颗器件就有 1 颗静默误算;而 ECC、lockstep、看门狗都对它有盲区,于是 FMEDA 算出的 DC 被系统性高估,纸面过 ASIL D、实物不过。

主线坐标:横轨 · 功能安全(跨站) · ↑ 全景主线

1. 抓硬约束 — SDC 为什么是"静默"的

故障可怕不在于"出错",而在于"出错却不告诉你"。功能安全的全部数学都假设:一个危险失效发生后,要么被某个 SM 在 FTTI (Fault Tolerant Time Interval,故障容忍时间) 内抓到并进安全状态,要么它本身概率低到可忽略。SDC 同时违反这两条——它既不被抓到、概率也不低,于是错误结果直接流向感知/规划/控制,系统全程"自信地算错"。

SDC 与可检测故障的分类,以及三大 SM 的覆盖盲区

1.1 三类故障结局:正确 / 报错停 / 静默错

一个计算单元 (ALU、乘法器、地址生成、datapath) 在故障下有三种结局,区别在于"系统是否知道自己错了"。SDC 是其中最恶的一类,因为它消耗了下游所有"输入可信"的假设。

结局英文系统是否知道对安全的影响典型 SM 能否抓
算对correct
报错停detectable / DUE知道 (异常/中断/log)可进安全状态ECC/parity/trap
静默错SDC / SUE不知道错误结果继续流多数 SM 无效

这里 DUE (Detected Unrecoverable Error,可检测但不可恢复错误) 是"好"的——它至少触发了机器检查异常 (MCE),系统能停或重算;SUE (Silent Unrecoverable Error,静默不可恢复错误) 才是 SDC 的内核:故障落在没有 check logic 的电路部分,所以电路照常输出,只是输出是错的

1.2 数据中心已是工业级痛点,AD 域控同构继承

SDC 不是学术想象。Meta 在 fleet 里用 Fleetscanner/Ripple 两套在线测试扫了上百万机时,得出约每 1000 颗硅器件就有 1 颗带 SDC 缺陷的结论 (远高于宇宙射线软错误的量级);Google 三个月后发表《Cores That Don't Count》,把这种"间歇算错的单个核"命名为 mercurial core,称其错误为 CEE (Corrupt Execution Error)。两家都强调:这些缺陷逃过了出厂测试,在现场运行数月后才显形。

这一点对汽车是直接威胁:AD/ADAS 域控用的就是同一代高算力 SoC(同制程节点、同设计方法学、同测试覆盖逻辑),它继承了数据中心的 SDC 风险,却比数据中心更苛刻——车规要 15 年/温区 、振动、电压瞬态,加速老化;而且数据中心可以"多机投票 + 重算",车上的一帧感知误算可能直接转成错误的刹车/转向决策。

1.3 ISO 26262 的定量门槛与 SDC 的冲突

ISO 26262-5 给 ASIL D 的硬件度量定了硬门槛:。这三个数都依赖一个量——DC (Diagnostic Coverage,诊断覆盖率),即一个 SM 能检测到某失效模式的比例。问题在于:FMEDA 里给计算逻辑标的 DC 值,是按"故障会破坏存储/总线、被 ECC/parity 抓到"的模型估的;SDC 这类"逻辑算错但不破坏存储"的失效,根本不在那个模型里。于是 FMEDA 表上写着 ,真实对 SDC 的覆盖可能接近 0,SPFM/LFM 被系统性高估。


2. 因果分析 — SDC 的物理根因与为何 SM 失效

要修一个故障,先得知道它从哪来、为什么现有手段够不着。SDC 的根因在器件物理层 (marginal 晶体管、老化、Vmin 漂移),它"静默"的原因则在架构层——主流三大 SM (ECC、lockstep、看门狗) 的检测原理各自留了一块 SDC 能钻过去的盲区。

SDC 物理根因到 DC/LFM 假设被击穿的因果链

2.1 物理根因:故障在逻辑里,不在存储里

SDC 的源头是计算逻辑/datapath 上的边缘器件 (marginal transistor),而不是经典 EDAC 模型关注的存储位翻转。先进制程把这个问题放大:晶体管越小,工艺涨落越占主导,总有一小撮单元处在"刚好能工作"的边缘,稍有应力就给出错误逻辑值。

  • 制造缺陷逃测:某些缺陷只在特定数据模式 (data-dependent)、特定电压/频率/温度组合下才显形,出厂 ATE 测试无法穷举所有组合,缺陷被放行。
  • 老化/退化超出浴盆曲线:HCI、BTI、电迁移 (electromigration) 让器件随运行时间退化;SDC 器件可能正确运行数月后才开始误算,违反"早期失效后进入低故障率平台"的经典假设。
  • Vmin 漂移与电热边界:动态电压频率调节 (DVFS) 把器件压到电压下限 附近;老化让 上漂,原本有裕度的路径变成关键路径,在热点处偶发算错。

这解释了为什么 SDC 既间歇又数据相关:同一个核,跑某些 bit pattern 错、跑另一些对,换温度/电压又变——这正是它躲过确定性测试的原因。

2.2 为什么 ECC 只护存储、护不到计算

ECC (Error Correcting Code,纠错码) 是车规 SoC 最常被引用的 SM,但它的作用域是存储与传输路径:SRAM、DRAM、cache、总线。它在数据"静止或搬运"时附加冗余位,读出时校验。可是 SDC 的错误发生在计算之后、写回之前的逻辑里——ALU 把 算成了错的值,这个错值连同正确的 ECC 校验位一起被写进存储。ECC 校验的是"存进去的值有没有被翻位",它完全相信计算单元交来的值,于是给一个错值算出"正确"的校验位。结论:ECC 对 datapath SDC 的 DC 近似为 0

2.3 为什么 lockstep 抓部分、但对共因无效

Lockstep (双核锁步) 是 ASIL D MCU 的招牌 SM:两个核跑同一指令流,比较器逐周期比对,不一致就报故障。它确实能抓一大类 SDC——只要两个核的缺陷不同,错的核与对的核结果一比就露馅。但 lockstep 有两个 SDC 盲区,根子都在 共因失效 (CCF):

  • 相同设计 + 相同输入 + 相同缺陷 = 相同错误:两个核是同一版图、同制程、紧邻布局,若缺陷源于设计/工艺共性 (同一 marginal 路径),在相同输入下两核同时算出同一个错值,比较器看到"一致",判为正确。这是 CCF 对 lockstep 的经典攻击面。
  • 共享电压/时钟/温度域:DVFS 把两核压到同一 、同一热点,边缘路径在两核上同步失效。

所以 lockstep 的 SDC 覆盖高但不等于 1,且其残余项正是 CCF 决定的 因子那部分——这必须在 FMEDA/DFA 里显式计入,不能默认 lockstep

2.4 为什么看门狗只抓死机、抓不到"算错但活着"

看门狗 (watchdog) 的检测原理是"喂狗超时即复位",它假设故障会让程序卡死或跑飞,从而停止喂狗。SDC 的致命之处恰恰是 wrong-but-alive (算错但活着):核没死、没跑飞、按时喂狗,只是某次乘法结果错了。窗口看门狗 (windowed/question-answer watchdog) 能抓"喂狗时序异常"或"答错挑战题",对控制流错误有效;但对一次纯数据流误算 (感知特征图某像素算错),狗照样按时被喂,DC 近似为 0。这是看门狗作为 SM 的固有边界。


3. SDC 如何把 FMEDA 的度量算虚高

把 2.2-2.4 的盲区代回 FMEDA 公式,就能看见数字怎么虚高。FMEDA 把危险失效率 按 SM 覆盖拆成被检测的残差与未检测的残余/潜伏项,而 DC 正是这个拆分的系数。SDC 的麻烦是:它让某些失效模式的真实 DC 远低于表上填的值

ISO 26262-5 的 SPFM 定义可写成:

其中残余失效率 。若 FMEDA 给某 datapath 失效模式填 ,而它实际是一个 ECC/看门狗都抓不到的 SDC 模式 (真实 ),那么:

残余项被低估约 100 倍,SPFM 被高估,纸面过 ASIL D、实物不过。LFM (Latent Fault Metric,潜伏故障度量) 更隐蔽:LFM 度量"潜伏失效中有多少能被二次检测/周期自检抓到"。SDC 的本质就是潜伏 (latent)——它静默存在,直到某次刚好被它污染的计算决定了一个安全相关动作。如果系统没有针对 SDC 的周期性在线自检,这些 SDC 模式在 LFM 里应记为"未覆盖",而很多 FMEDA 默默把它们算成被 lockstep/ECC 覆盖了,于是 LFM 也虚高。

结论:SDC 不是给 FMEDA 加一行,而是要求重审每一个声称覆盖计算逻辑的 DC 值——问一句"这个 SM 真的能抓到 wrong-but-alive 吗?",不能就把对应 DC 打到接近 0,缺口用第 4 节的专门手段补。


4. 解决方案 — 多维度防御栈

既然单个 SM 都有 SDC 盲区,正确做法不是找一个银弹,而是叠加多种正交手段,让每一类 SDC 失效模式至少被其中一种以非平凡 DC 覆盖。下图把 5 类手段对 4 类 SDC 失效模式的覆盖排成矩阵,关键在于看哪一列没有任何一行打勾——那就是残余风险

SDC 多维度防御栈对失效模式的覆盖矩阵

4.1 空间冗余 — 异构双算 + 比较

最直接的手段是冗余计算后比对,但关键是"异构":用不同微架构/不同核/不同实现算同一安全函数,再比较。它针对的正是 lockstep 的共因盲区——异构让"相同输入触发相同错误"的概率大幅下降。代价是面积/功耗/算力翻倍,且比较器本身要做 DFA 证明独立。AD 域控常见做法:主 SoC 跑感知,旁路一个异构安全 MCU/小核对关键输出做合理性 (plausibility) 校验,而非逐位比对全帧。

4.2 时间冗余 + 软件多样性

当空间冗余太贵时,可在同一硬件上重算:同一函数算两遍 (可加扰动/不同编译) 再比对。它能抓间歇性、数据相关的 SDC——因为 SDC 常对特定瞬时状态敏感,两次执行的微状态不同,错误未必复现。软件多样性 (N-version、加随机化数据布局) 进一步降低两次同错的概率。代价是吞吐减半与时延翻倍,对有 FTTI 预算的实时感知链不总放得下。

4.3 周期性在线自检 — SBST / STL 与 LBIST

要专门攻 latent 的 SDC,得在运行间隙主动测硬件,这正是 LFM 要求的二次检测。两种主力:

  • SBST / STL (Software-Based Self-Test / Software Test Library,软件自测库):厂商提供一套测试程序,在上电与运行间隙周期性跑,用确定的激励-期望对去逼出 CPU/datapath 的潜伏缺陷。它是车规 MCU 满足 LFM 的核心机制之一。
  • LBIST (Logic Built-In Self-Test,逻辑内建自测):硬件用 LFSR 生成伪随机激励、MISR 压缩响应签名,对组合/时序逻辑做高覆盖结构测试,ISO 26262 推荐用于覆盖潜伏故障。

核心约束是时序:FDTI(检测)+ FRTI(反应/进安全态)必须 FTTI(即 FHTI FTTI)——在线自检只占 FDTI 这一段,故障反应时间(FRTI)另需预留,必须在故障酿成危害前完成检测 + 进安全态。SBST/LBIST 不能连续占满 CPU,只能分片在任务间隙跑,所以覆盖与检测时延要权衡。它们抓的是"测得到的潜伏缺陷",对运行时刚好被特定数据触发的瞬时 SDC 仍非全覆盖,需与冗余互补。

4.4 Fault Injection 验证 DC + Fleet 级监测

前三类是"防",这一类是"验与守"。故障注入 (fault injection) 是唯一能把 FMEDA 表上那个 DC 数字从"假设"变成"实测"的手段:往 RTL/门级/硅上注入故障,看 SM 是否在 FTTI 内报出,统计真实 DC——这是把 §3 的虚高问题钉死的方法。Fleet 级监测借鉴数据中心:车队规模收集异常签名、用影子计算/交叉校验统计 SDC 触发率,反哺哪些器件/批次/工况高发,做主动替换或降级。它不在单车 FTTI 闭环内,但能管理批次性、老化性 SDC 的系统性风险

4.5 给 AD 域控的 ASIL 分解策略

把上面手段落到架构上,AD 域控的务实组合是分解 (decomposition) + 异构监督:高算力主 SoC 承担 QM/低 ASIL 的感知重计算,一个独立异构安全岛 (safety island / 安全 MCU) 承担 ASIL D 的合理性校验、看门狗、安全状态触发,主 SoC 内部再叠 SBST/LBIST 跑潜伏自检,出厂前用 fault injection 实测每条链的 DC,量产后用 fleet 监测管老化。这套组合的逻辑是:没有任何单点声称自己覆盖全部 SDC,而是让每一类失效模式都落在至少一个有实测 DC 的手段下,缺口在 FMEDA 里诚实记为残余风险,而非用虚高 DC 抹平。


缩写表

缩写全称通俗解释
SDCSilent Data Corruption硬件算错却不报错的故障
SUESilent Unrecoverable ErrorSDC 的内核:静默且不可恢复
DUEDetected Unrecoverable Error检测到但不可恢复 (会报错停)
CEECorrupt Execution ErrorGoogle 对 mercurial core 误算的叫法
MCEMachine Check ExceptionCPU 报硬件错的异常机制
DCDiagnostic CoverageSM 对某失效模式的检测比例
SPFMSingle-Point Fault Metric单点故障度量 (ASIL D )
LFMLatent Fault Metric潜伏故障度量 (ASIL D )
PMHFProbabilistic Metric for random HW Failures随机硬件失效概率度量
FITFailure In Time 小时失效数
FTTIFault Tolerant Time Interval故障到危害的容忍时间
FDTIFault Detection Time Interval故障到被检测的时间
FRTIFault Reaction Time Interval检测到进安全态的反应时间(FDTI + FRTI ≤ FTTI)
ECCError Correcting Code纠错码 (护存储/总线)
SMSafety Mechanism安全机制
SBST/STLSoftware-Based Self-Test / Software Test Library软件自测库
LBISTLogic Built-In Self-Test逻辑内建自测
DVFSDynamic Voltage Frequency Scaling动态电压频率调节
CCFCommon Cause Failure共因失效
DFADependent Failure Analysis相关失效分析

核心要点

  • SDC = 计算硬件算错但不报错、不进日志、不触发异常;关键词是 wrong-but-alive。
  • 既不被抓、概率也不低 (Meta 实测约 1/1000 器件),同时违反 ISO 26262 度量的两个隐含前提。
  • 物理根因在计算逻辑/datapath 的 marginal 器件 + 老化 + Vmin 漂移,不在存储——所以护存储的 ECC 对它近乎无效。
  • 三大 SM 各有 SDC 盲区:ECC 只护存储;lockstep 抓不到共因同错;看门狗只抓死机抓不到数据误算。
  • 后果:FMEDA 给计算逻辑填的 DC 被系统性高估,SPFM/LFM 虚高,纸面过 ASIL D 实物不过
  • 解药是多维度叠加:异构空间冗余 + 时间冗余/软件多样性 + SBST/LBIST 周期自检 (FDTI + FRTI FTTI) + fault injection 实测 DC + fleet 监测管老化。
  • 务实架构 = 异构安全岛做合理性校验 + 主 SoC 内 SBST,每类失效模式都落在至少一个有实测 DC 的手段下

Engineering Objects

  • sdc_failure_mode(一条 wrong-but-alive 的计算逻辑失效模式;属性:触发数据模式、电压/温度敏感性、所属 datapath 单元)
  • sm_dc_claim(FMEDA 中某 SM 对某失效模式的 DC 声明;必带 verification_method: assumed / fault_injection_measured)
  • infield_test_schedule(SBST/LBIST 调度;属性:覆盖率、FDTI、占用率,约束 FDTI + FRTI FTTI)
  • heterogeneous_monitor(异构监督通道;属性:与主通道的 因子、校验粒度 plausibility/bitwise)
  • fleet_sdc_telemetry(车队 SDC 触发率遥测;属性:批次、里程/老化、工况 bin)

Cross-references

来源:Dixit et al. Detecting Silent Data Corruptions in the Wild (Meta, arXiv:2203.08989);Hochschild et al. Cores That Don't Count (Google, HotOS 2021);Meta Engineering SDC 博文 (2021/2025);semiengineering.com SDC / Logic BiST / BIST-for-FuSa 系列;ISO 26262-5:2018 §6-9 与 26262-11:2018;ScienceDirect 车规 STL / in-field test 论文。综合整理,非单一来源逐句转述。