Silent Data Corruption (SDC) — 静默误算如何击穿 ISO 26262 的 DC/LFM 假设
本质与导读
本质 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 同时违反这两条——它既不被抓到、概率也不低,于是错误结果直接流向感知/规划/控制,系统全程"自信地算错"。
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 年/温区 到 、振动、电压瞬态,加速老化;而且数据中心可以"多机投票 + 重算",车上的一帧感知误算可能直接转成错误的刹车/转向决策。
2. 因果分析 — SDC 的物理根因与为何 SM 失效
要修一个故障,先得知道它从哪来、为什么现有手段够不着。SDC 的根因在器件物理层 (marginal 晶体管、老化、Vmin 漂移),它"静默"的原因则在架构层——主流三大 SM (ECC、lockstep、看门狗) 的检测原理各自留了一块 SDC 能钻过去的盲区。
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 。
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 失效模式的覆盖排成矩阵,关键在于看哪一列没有任何一行打勾——那就是残余风险。
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 抹平。
缩写表
| 缩写 | 全称 | 通俗解释 |
|---|---|---|
| SDC | Silent Data Corruption | 硬件算错却不报错的故障 |
| SUE | Silent Unrecoverable Error | SDC 的内核:静默且不可恢复 |
| DUE | Detected Unrecoverable Error | 检测到但不可恢复 (会报错停) |
| CEE | Corrupt Execution Error | Google 对 mercurial core 误算的叫法 |
| MCE | Machine Check Exception | CPU 报硬件错的异常机制 |
| DC | Diagnostic Coverage | SM 对某失效模式的检测比例 |
| SPFM | Single-Point Fault Metric | 单点故障度量 (ASIL D ) |
| LFM | Latent Fault Metric | 潜伏故障度量 (ASIL D ) |
| PMHF | Probabilistic Metric for random HW Failures | 随机硬件失效概率度量 |
| FIT | Failure In Time | 每 小时失效数 |
| FTTI | Fault Tolerant Time Interval | 故障到危害的容忍时间 |
| FDTI | Fault Detection Time Interval | 故障到被检测的时间 |
| FRTI | Fault Reaction Time Interval | 检测到进安全态的反应时间(FDTI + FRTI ≤ FTTI) |
| ECC | Error Correcting Code | 纠错码 (护存储/总线) |
| SM | Safety Mechanism | 安全机制 |
| SBST/STL | Software-Based Self-Test / Software Test Library | 软件自测库 |
| LBIST | Logic Built-In Self-Test | 逻辑内建自测 |
| DVFS | Dynamic Voltage Frequency Scaling | 动态电压频率调节 |
| CCF | Common Cause Failure | 共因失效 |
| DFA | Dependent 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
- ← 索引
- FMEDA 深度 — SPFM/LFM/PMHF — SDC 让本页的 DC/SPFM/LFM 数学被系统性高估,需重审每个计算逻辑的 DC
- 共因失效 (CCF) 深度 — lockstep 的 SDC 盲区本质是 CCF,残余项由 因子决定
- ISO 26262 Part 5 硬件 — SPFM/LFM/PMHF 门槛与 DC 定义出处
- ISO 26262 Part 11 半导体 — SoC 级 SM、LBIST/SBST 与半导体 CCF
- 功能安全总览 — SDC 在整体功能安全体系中的位置
来源: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 论文。综合整理,非单一来源逐句转述。