FPGA 配置存储器 SEU 与 CRC:粒子翻转为什么改的是电路本身
FPGA 每次上电都从外部 Flash 把比特流搬进片内 SRAM,这张比特流决定了芯片内部「连线怎么接、LUT 算什么」(加载过程见 比特流与配置 Flash,FPGA 配置模式 讲有哪些加载入口)。绝大多数应用里,这份配置一旦加载就被认为不会再变——但有一类故障专门推翻这个假设:高能粒子穿过硅片,把某个 SRAM 位打翻,而被打翻的极可能不是你的数据,是定义电路本身的那一位。这就是 FPGA 配置存储器 SEU 与 CRC 这一篇要讲的事。
本篇是入门概念篇,只讲机制与防护分工,不堆器件型号和故障率数字;辐射环境分类、SEL/SET 细节与空间工程取舍见专家层 FPGA 可靠性与 SEU 和 FPGA 抗辐射与 SEU 深解。
本文要回答的问题
- FPGA 配置存储器 SEU 与 CRC 各指什么?为什么说单粒子翻转改的常常不是数据,而是电路本身?
- 一颗芯片里 SRAM 位那么多,粒子打下来,凭什么绝大多数翻转落在配置帧上,而不是用户触发器?
- 上电时明明有 CRC 校验,为什么运行中翻一位它却不报警?运行期帧 ECC 补上了哪段空窗?
- readback、盲刷、读回刷新、SEM IP 是什么关系,谁在检错、谁在纠错、故障注入拿来干什么?
- TMR 三模冗余是不是万能的?为什么它必须和刷新配套用?FIT、MTBF 这些词在说什么,哪些产品真的要关心?
先给一张全篇总图。SEU 话题看起来散(粒子物理、编码、冗余、可靠性数学),但任何一块具体设计要回答的其实只有三组问题:
读这张卡抓住一条主线:成因、对象、手段三者要分开记。常见混淆都来自把它们搅在一起——比如以为上电 CRC 能防运行期翻转(不能,它只管「加载那一刻」),或以为 TMR 能修复配置位(它只能掩蔽,不能修)。下面先看不做防护时故障长什么样。
一、不做防护会怎样:一种复位修不好的故障
设想一块工作在民航设备上的 SRAM FPGA,内部跑一个联锁状态机。某天它「认为」某个条件始终成立,输出锁死在错误状态。用普通数字 bug 的排查思路去查,会处处碰壁:
| 故障表象 | 普通逻辑 bug | 配置位 SEU |
|---|---|---|
| 与输入数据的关系 | 有确定触发条件 | 无规律,换输入也不消失 |
| 按复位键 | 多数能恢复 | 无效,复位只清用户触发器,不重写配置 |
| 重新上电整板加载 | 不影响 bug | 症状消失,事后无法复现 |
| 报错信息 | 仿真/断言可能抓到 | 全程静默,没有任何异常标志 |
| 换板复现 | 同型号板子都有 | 只在某一块板、某个时间点出现 |
复位为什么修不好?因为复位接到的是设计里的触发器,而这次翻掉的是决定这颗芯片「成为这块电路」的配置位——某个 LUT 真值表的一位变了,或布线矩阵里一个开关错位。重新加载之前,芯片已经是「另一块电路」,复位只是反复清空错误电路的状态。这类故障叫软错误(soft error):硅片没被烧坏,重写配置即可恢复;它对应的现象叫 SEU(Single Event Upset,单粒子翻转)。更麻烦的是静默性:翻转后时钟照跑、DONE 照样高、接口照常应答,只是某条逻辑悄悄错了,所以不能靠「等它报警」,必须主动去检。
二、翻转从哪来:粒子怎样把一个 SRAM 位打翻
要理解为什么校验挡不住、防护该加在哪一层,先看翻转发生的物理链条:
这张图按颜色分三段读:灰色是粒子来源与穿透——中子不带电,径直穿过封装并在硅核上撞出次级重核,α 粒子来自封装材料里微量放射性杂质的衰变。蓝色是电离:次级粒子沿路径产生一股电子-空穴对。橙色是临界点:交叉耦合反相器本应稳态互锁,节点收集电荷超过临界值后平衡被打破;红色是结局,锁存态翻到另一侧,一位完成 0↔1 翻转。
由此有四个工程推论:其一,这是电现象不是烧伤,重写即恢复,真正可能损伤硬件的 SEL(单粒子闩锁)需断电退出,不在本篇展开;其二,金属屏蔽用处有限,高能粒子穿透力强、厚屏蔽还可能撞出更多次级粒子,主战场在工艺与逻辑设计;其三,地面不是零风险,大气中子通量随海拔升高,机载电子首当其冲,地面大集群里小概率事件同样会发生;其四,组合逻辑上的瞬态电荷叫 SET(单粒子瞬态),只是纳秒级毛刺,恰好被寄存器采样才变成错误,直接打中存储位的 SEU 则立即生效。每位敏感度随工艺节点演变,不要凭「工艺越新越脆弱」下结论,数值以厂商可靠性报告为准。
三、为什么翻转的是「配置」而不是「数据」:位数差了几个数量级
现在回答全篇最关键的问题。SRAM FPGA 内部的存储位按用途分两大类,先看它们各自是什么:
- 配置存储位(CRAM,configuration RAM):决定电路结构的位。一个 4 输入 LUT 的函数功能就是它那 16 个配置位写的真值表(LUT 原理见 从 LUT 与触发器理解 FPGA);布线矩阵里每一个可编程连接点由开关位控制;IOB、时钟资源、DSP 模式也各有一组配置位。这些位以配置帧(configuration frame)为单位编址,铺满整个器件。
- 用户位:设计实例化出来的触发器、BRAM 里的数据。数量由你的设计用量决定,一块没跑满的芯片这部分甚至很空。
| 对比项 | 配置存储位 CRAM | 用户触发器 / BRAM |
|---|---|---|
| 内容 | LUT 真值表、布线开关、模块配置 | 设计运行时的状态与数据 |
| 芯片内位数占比 | 占总位数的绝大部分 | 小得多,且随设计利用率变化 |
| 翻转后后果 | 电路功能被改变:恒错、错连、悬空 | 一拍或一段数据出错 |
| 持久性 | 持续到重新配置/刷新该帧 | 下一次写入或复位即覆盖 |
| 复位能否恢复 | 不能 | 通常能 |
| 主要防护 | 帧 ECC、readback、scrubbing | TMR、EDAC/ECC、复位、协议重传 |
关键就在第二行:配置位占据了芯片位数面积的绝大部分。粒子击中位置近似随机,绝大多数翻转天然落在配置位上——不是配置位「更脆弱」,而是它们「人多」。后果性质又放大了严重性:用户触发器翻一位通常只污染一次状态,下一笔数据或一次复位就盖过去;配置位翻一位改变的是硬件结构本身,LUT 真值表变了此后每次都错,布线开关错位则信号恒通或恒断,不自愈,一直挂到该帧被重写。另有 MBU(多位翻转):一个粒子可能同时打翻物理相邻几位,使「纠单检双」类编码也兜不住,所以器件布帧时用位交织(interleave)把逻辑相邻位打散到不同物理位置,选型时值得查这一项。
四、上电 CRC 与运行期 ECC:两道防线管的是两段时间
很多人第一次接触这个话题会以为比特流带了 CRC 就万事大吉。要拆开看:CRC 和运行期帧 ECC 守护的是完全不同的时间段。
绿色是两道防护,灰色是被守护的状态,橙色是兜底动作,读法如下:
- 上电 CRC 管「镜像有没有被正确搬进来」。加载时配置逻辑逐帧读入并核算 CRC,与比特流里自带的校验值比对;不一致(Flash 位老化、加载受扰、文件损坏)就不拉高 DONE,器件拒绝以半份坏镜像启动。但 DONE 一旦拉高,CRC 的使命就结束了——它校验的是加载动作,没有任何机制在运行中持续重算整芯片的 CRC。
- 运行期帧 ECC 管「住进来之后有没有人捣乱」。现代家族的配置帧在用户位之外附带校验编码位,帧被读回时可算出错误综合征:单 bit 翻转能定位并纠正,双 bit 翻转能检出但不保证纠正。这道检查不依赖重新上电,可以在任务运行期间反复进行。
还要划清一条安全边界:CRC 只防随机差错,不防恶意篡改。CRC 是公开线性校验,攻击者改了数据后可以重算一个匹配的 CRC;防比特流被读走靠 AES 加密,防被恶意替换靠认证(消息摘要比对),三者分工不要混。完整体系见 FPGA 比特流加密,安全启动的更深内容在专家层 FPGA 安全:比特流加密、认证与安全启动。
五、运行期怎么检怎么修:readback、scrubbing 与 SEM IP
运行期检错修复围绕配置帧展开,核心动作叫 readback(回读):经 JTAG、SelectMAP 或片内 ICAP 把配置帧从 CRAM 读出,然后两条路——与「黄金期望值」逐位比对,或直接利用帧自带 ECC 判综合征。JTAG 回读适合外部维护(见 FPGA JTAG 链概念),片内 ICAP 回读不依赖外部电缆,适合无人值守设备自己做。
在回读之上长出了 scrubbing(配置刷新) 这个概念,它有两种做法:
| 做法 | 怎么工作 | 优点 | 代价 |
|---|---|---|---|
| 盲刷(blind scrubbing) | 不等检测,按周期把全部配置帧重写一遍 | 实现简单,不依赖 ECC/比对逻辑,能清掉所有已累积翻转 | 占用配置接口带宽,做不到事件定位与计数 |
| 读回校验刷新 | 先回读 + ECC/比对,只对确认出错的帧做纠正写入 | 只动坏帧,可定位地址、分类、累计事件统计 | 需要 ECC 或黄金副本支撑,控制器更复杂 |
刷新之所以能做到「修 bug 不停机」,靠的是帧粒度写回——只覆盖那一帧配置位,其余逻辑照常工作,这正是部分重配置能力在可靠性方向的应用(原理见专家层 部分重配置与 ICAP 深解)。把这套控制器做成现成 IP,就是厂商提供的 SEM IP(Soft Error Mitigation,软错误缓解),它的能力可以归成四类:监测配置帧、detect(检出错误并分类)、correct(对可纠正帧自动写回修复)、inject(按命令人为翻转指定位——故障注入,专门用来在地面验证你的防护逻辑到底灵不灵)。刷新周期是个折中:周期越短,翻转累积到「多处同时出错」的暴露窗口越小,但占用 ICAP 带宽越多,按任务可接受的错误累积时间来定。

读这张时序图抓住分叉口:ECC 综合征判定后有两个出口,绿色路径(图中主路径)是单 bit 翻转的原地修复,用户电路感觉不到;另一个出口是多位翻转或 SEFI(单粒子功能中断——粒子打中了配置控制、全局时钟一类要害,器件连配置接口都可能不再正常响应),此时帧级修复失效,SEM IP 只负责报错和锁存信息,由系统决定降级进安全态还是整器重配置(远程切换与多重启动机制见 FPGA 远程更新与 Multiboot)。
六、用户触发器翻转谁来管:TMR 及其单点限制
刷新修的是配置位,那用户触发器和状态机里翻掉的一位呢?复位可以清,但要求故障可被即时发现;对不能停、不能错的关键逻辑,标准手段是 TMR(Triple Modular Redundancy,三模冗余):
三份副本并行计算同一函数,表决器每拍按多数票输出:任一份出错,两票正确仍压住一票错误。TMR 不区分错误来源,对配置位翻转同样有效,但有四个必须知道的限制:
- 表决器自身是单点。图中橙色节点坏了就没有「四模」兜底,所以表决器本身要用加固写法,而且要在每级寄存器后分段插入表决,防止错误在某一份副本内部一路传播放大。
- 共享资源是单点。三份逻辑若共用一个时钟、一个复位、一个输入同步器,这些点翻一次全灭;高可靠设计要把时钟、复位、输入同步一并冗余考虑。
- 三份必须真正独立。综合器看到三份一模一样的逻辑可能做等价合并,布线也可能挤在一起,需要专用约束或厂商 TMR 工具保证物理分散,否则一个 MBU 就能同时掀翻多份。
- 资源约三倍起步,数据通路和大存储器不适合整体 TMR——大块存储通常改用 ECC(BRAM 普遍带内建 ECC),状态机可用大汉明距离的安全编码,TMR 只花在关键控制与状态逻辑上。
最后是配套逻辑:TMR 治标,scrubbing 治本。光有 TMR 没有刷新,一份翻了靠表决撑着,第二份再翻就只剩一票正确,第三份再翻表决彻底失效——翻转不会自愈,错误单向累积。刷新在后台把翻掉的副本修回来,让系统长期回到「三票全新」。验证时用 SEM IP 的 inject 能力人为打翻指定位,观察表决是否掩蔽、刷新是否修复、不可纠正时是否按预期进安全态。
七、FIT 与 MTBF:用概率而不是「会不会」来讨论
这类话题落到产品决策必须量化,但本篇不给任何具体率值——器件从几十纳米到先进工艺、从海平面到地球同步轨道,率值可以差出许多个数量级,背一个数字只会误用。需要掌握的是概念和取数方法:
- FIT(Failures In Time):每 10^9 个器件·小时内预期发生的故障次数。1000 FIT 意味着平均每百万器件·小时 1 次。它是速率单位,不是百分数。
- MTBF(平均故障间隔时间):与 FIT 互为换算,MTBF(小时)≈ 10^9 / FIT。
- 系统级软错误率怎么估:大致是「器件配置位数 × 每位翻转敏感度 × 环境因子」。配置位数查器件手册的帧规模,每位敏感度取厂商可靠性报告(中子束流试验折算大气中子环境),环境因子由海拔、纬度、屏蔽、任务剖面决定,机载与高海拔机房要乘显著大于 1 的系数。
- 两个容易错的直觉:单器件 FIT 很低不代表系统没事——大集群里器件数乘以运行小时数会把小概率累积成「每年若干起」;工艺演进让每位敏感度有升有降,但每代器件配置位总数在快速增长,单芯片绝对事件数未必下降,大容量器件反而更值得刷新。
拿到率值后与系统可用性目标或功能安全标准对账:车规产品在 ISO 26262 框架下论证安全机制的诊断覆盖率与残差故障率,航天任务则按任务期翻转概率预算决定器件工艺与刷新周期。
八、哪些应用必须关心:一张按风险分档的表
| 应用场景 | 关注程度 | 典型组合 |
|---|---|---|
| 卫星、深空探测器 | 必须,按概率做设计 | 抗辐照器件或反熔丝/Flash FPGA;SRAM 型则 TMR + 周期刷新 + 故障注入验证 |
| 民航航电、高海拔基站 | 高,中子通量随海拔升高 | 帧 ECC + SEM IP 刷新 + 安全态/重配置,纳入适航故障率预算 |
| 汽车电子(ISO 26262) | 高,重功能安全论证 | TMR/ECC/看门狗等安全机制 + 诊断覆盖率文档 |
| 医疗、轨交、工业安全 | 中高 | 关键逻辑 TMR、看门狗、出错进入安全态 |
| 通信核心网、大规模算力机房 | 中,可用性驱动 | 轻量后台刷新 + 整机冗余 + 远程重配置 |
| 地面消费、普通工业 | 低 | 上电 CRC + 看门狗 + 重新加载通常足够 |
表中第一行有个值得单独点出的思路:换工艺可以从根上消掉配置位翻转这个问题类别。反熔丝 FPGA 一次编程后配置由物理连线保存,Flash 型的配置存在非易失单元里,二者都没有暴露在粒子下的易失 SRAM 配置阵列,天然免疫配置位 SEU(用户触发器仍可能翻),完整对比见 SRAM、Flash 与反熔丝 FPGA。代价是反熔丝不可重复编程、Flash 型密度与性能上限不及高端 SRAM 型,所以高端任务主流仍是「SRAM 器件 + TMR + 刷新」。
这一篇在知识体系里的位置
本篇是 FPGA 可靠性话题的入门枢纽,向上承接配置链路:比特流与配置 Flash 与 FPGA 配置模式 讲配置怎么加载进来,本篇讲它住进来之后怎么被守护;从 LUT 与触发器理解 FPGA 是理解「为什么 LUT 位翻转会改变功能」的基础。横向分工上,FPGA 比特流加密 讲防读防篡改,与本篇的防随机差错互补;SRAM、Flash 与反熔丝 FPGA 讲从工艺上免疫配置位翻转的路线;FPGA 远程更新与 Multiboot 是不可纠正错误后整器重配置的落地机制。继续深入走专家层:FPGA 可靠性与 SEU 给防护体系全貌与设计清单,FPGA 抗辐射与 SEU 深解 展开辐射环境、效应分类与 FIT 量化,部分重配置与 ICAP 深解 解释帧级修复为什么能不停机。
总结
FPGA 配置存储器 SEU 与 CRC 的核心认知收成五句话:第一,SRAM FPGA 绝大部分片内位是定义 LUT 与布线的配置帧位,粒子打翻一位时落点大概率在配置位,改变的是电路结构本身,所以复位无效、故障静默、重配置才消失。第二,上电 CRC 只保证比特流完整搬入,DONE 拉高后不再守护运行态,运行期持续检错靠帧 ECC 与回读;CRC 也不防恶意篡改,那是加密与认证的职责。第三,readback 分盲刷与读回校验刷新,SEM IP 提供监测、detect、correct、inject 四类能力,单 bit 错帧可不停机写回,多位翻转或 SEFI 则上报系统进安全态或整器重配置。第四,用户触发器翻转由 TMR、BRAM ECC、复位与安全编码负责,TMR 的表决器和共享时钟复位是单点,且必须与 scrubbing 配套——前者掩蔽错误维持功能,后者修复被翻副本防止累积。第五,用 FIT(每 10^9 器件·小时故障数)和 MTBF 与可用性目标对账,具体率值查厂商可靠性报告;航天、航电、车规、医疗与大规模机房必须按概率设计,想从根上消除这一类故障可选反熔丝或 Flash 工艺器件。