存储器 RAS:ECC 编码、SECDED、地址交织与后台巡检 scrub
更新时间:2026-09-19。前置:NAND ECC/坏块、存储可靠性、TCM/内存。宇宙中子、α 粒子、电压扰动会翻转存储单元(软错误),车规/服务器要求内存出单 bit 错不崩、多 bit 错能发现。这就是 RAS(Reliability/Availability/Serviceability)。
一、错误类型
- 软错误(soft error):粒子/串扰/时序导致内容翻转,单元本身没坏,重写即恢复(多数单 bit 翻转)。
- 硬错误(hard/permanent):单元/行/列物理失效,反复出错,需退役该页/行(page retirement)。
- 单 bit 错(SBE)vs 多 bit 错(MBE):一个 ECC 码字里错 1 位可纠;错多位可能漏纠,需特殊设计。
- NAND Flash 还面临擦写磨损造成的大量比特错,由强 BCH/LDPC 处理(见 NAND ECC);本文聚焦 SRAM/DDR/片上 RAM 的在线 ECC。
二、SEC-DED 汉明码(最常用)
- SEC-DED(Single Error Correction–Double Error Detection):扩展汉明码,给每个数据字加校验位,能纠正任意 1 位错、检测任意 2 位错。
- 原理:若干校验位分别覆盖特定比特子集,错误发生后由失败的校验组成校正子(syndrome),它的值直接指向出错位(0 表示无错);再加一个对全校验位做偶校验的总校验位,使任意双 bit 错产生非零但非法的 syndrome,从而与单 bit 区分(DED)。
- 代价:每 64 位数据通常加 8 位 ECC(72 位 DIMM),约 12.5% 存储/带宽开销;编码在写入时生成、读取时校验。
- 读取流程:算 syndrome → 0:无错;合法单 bit:翻转纠正后给出数据并上报 CE(Correctable Error);非法:双/多位错,上报 **UCE(Uncorrectable Error)**并通常触发中断/异常/机器检查。
- 更强的片上方案:DEC-TED(纠二检三)、Chipkill/符号级 ECC(DRAM 整颗芯片失效也能恢复,用于服务器 DIMM)、BCH(见 NAND)。
三、为什么 ECC 粒度/布局重要
- ECC 按**码字(如 32/64 位 + 校验)**独立保护。一个物理事件若打翻同一码字内 ≥2 位(如多位同时翻转),SEC-DED 只能检测不能纠正。
- 地址交织/位交织(bit interleaving):把连续逻辑位物理上分散到不同阵列/字/位置,使一次多 bit 物理故障(一个 α 粒子扰动相邻多个单元、一条字线/灵敏放大器失效)在每个 ECC 码字里只表现为单 bit 错,于是多个码字各自可纠。这是把 MBE「打散」成多个 SBE 的关键布局手段(类似 NAND 交织页 对抗突发错)。
- DRAM 颗粒内部行列组织、ECC 位与数据位的物理排布都要考虑交织,否则相邻多位翻转致命。
四、后台巡检 scrubbing(核心)
单 bit 错若一直留在内存里,累积第二个错误落在同一 ECC 码字时就升级为不可纠正双 bit 错。scrub 主动消除这种累积:
- 引擎在系统空闲时按地址顺序逐行后台读出内存,ECC 解码:发现单 bit 错就把纠正后的数据连同正确 ECC 写回,把软错误清零;硬错误标记/计数。
- 这样在错误累积成 MBE 前修复。巡检周期要足够短,使在预期软错误率下同一码字积累第二个错的概率极低(按 FIT/容量算 scrub 间隔,常 24h 内扫完整个内存)。
- 两种触发:
- 后台/巡逻 scrub(patrol scrub):引擎主动扫全部地址(即使 CPU 没用),占少量带宽。
- 按需/demand scrub:CPU 读到 CE 时顺便纠正写回。
- 对 SRAM/缓存也可做 scrub/flush;寄存器文件用 ECC 或奇偶+流水线重放。
五、错误上报、隔离与服务
- CE 计数/阈值:频繁 CE(尤其同一地址反复出现)预示硬失效;控制器累计错误地址/计数,超阈值产生中断,OS/固件把该页标记隔离(page offlining/retirement),避免反复使用坏单元。
- UCE 处理:不可纠正错误触发机器检查异常(如 RISC-V PMP/异常体系、ARM SError、x86 MCE);若错误地址对应内核数据可能 panic,对应可丢弃用户数据可杀进程;poison:在内存/总线上对坏数据打「中毒」标记,谁真正消费才上报(推迟错误处理),结合 AXI 错误响应。
- 地址/故障隔离:报告精确物理地址、rank/bank/bit,便于定位是颗粒故障还是随机软错;RAS 日志(CMC/AER 风格)。
- DDR 侧还有 post-package repair、行/列备用替换、refresh 加固、ECC 模式与 patrol 配合(见 DDR 初始化)。
六、微架构实现点
- 写路径:数据进 RAM 前算 ECC 一起存;支持子字写(只写部分 byte)时需读-改-写读出旧 ECC/未写字节重算(类似 NAND 部分写),或按最小 ECC 粒度写,性能/功耗要权衡。
- 读路径:ECC 校验在关键时序路径上(异或树+纠正 mux),可能加一拍延迟;缓存行 refill/写回都要校验。
- scrub 引擎是一个简单 DMA(见 多通道 DMA),低优先级顺序访问,避免与实时流量抢带宽(可借 NoC QoS)。
- ECC 保护范围要覆盖:数据 RAM、标签 RAM(tag)、有效/脏位、队列/缓冲;漏掉标签或控制结构的 ECC 会留下短板。
七、常见的坑
- 只检不纠 / 只 ECC 不 scrub:CE 长期累积,第二个错落成 UCE。
- ECC 粒度内物理相邻位不交织:单粒子打翻同码字多位,SECDED 失效。
- 子字写不读改写:只更新数据不重算 ECC,读出必报错误。
- scrub 太慢或从不跑:容量大时 24h 扫不完,累积概率升高。
- scrub 抢带宽影响实时:扫描优先级太高干扰业务;要低优先级/限速(见 带宽预算)。
- CE 当噪声忽略:同地址反复 CE 是硬失效前兆,应退役页。
- UCE 不区分可否恢复:可丢弃数据和内核关键数据处理策略不同,一律 panic 影响可用性。
- 漏保护 tag/控制 RAM:数据有 ECC 但标签、队列、页表没有,翻转照样致命。
- ECC 位宽/布局错:总校验位位置错误导致 DED 误判(双错被当单错纠反而翻错第三位)。
- 初始化不写 ECC:上电 RAM 随机,未先初始化就读,ECC 报假错;需初始化写正确 ECC。
- 省电保留模式不维护:自刷新/深睡期间不 scrub,长期累积风险。
- 测试覆盖不足:只测单 bit 注入,未测双 bit、跨码字突发和 scrub 写回路径。
相关与延伸
NAND 强 ECC 与坏块见 nand/eMMC ECC;SRAM 接口见 SRAM 控制器;DRAM 刷新见 DDR 初始化;错误传播见 AXI 错误响应。
总结
片上/DRAM 的 RAS 靠 SEC-DED 扩展汉明码在每个 64 位码字上加约 8 位校验实现纠一检二,读出时由校正子定位并翻转单 bit 错(报 CE)、识别双 bit 错(报 UCE);为防止单粒子或一条字线造成的相邻多位翻转落在同一码字内,用地址/位交织把逻辑位物理打散,使物理多位错变成多个可各自纠正的单 bit 错;再由低优先级后台 patrol scrub 引擎在系统空闲时顺序读全部内存、把单 bit 软错纠正写回,防止错误累积成不可纠正错,并对同一地址反复 CE 计数触发页退役、对 UCE 走机器检查/poison——不做巡检、不做位交织、子字写不读改写和漏保护 tag/控制 RAM 是四类最常见的可靠性短板。