3. ECC基本原理与分类

在星载FPGA的存储器设计中,单粒子翻转(SEU)会让存储单元中的某一位从0翻成1或从1翻成0。ECC(Error Correcting Code,纠错码)的核心思想并不是“防止位翻转”,而是通过增加冗余校验位,在读出数据时检测甚至纠正这些翻转。理解ECC,关键要抓住三个问题:校验位如何生成、错误如何被定位、纠错能力与面积/延迟开销之间如何权衡。

一、从奇偶校验到汉明码:错误定位的数学基础

最简单的检错手段是奇偶校验:给一组数据附加1个校验位,使“1”的总数为奇数或偶数。它能发现奇数个位错误,但无法定位错误位置,也无法纠正。汉明码的突破在于:用多个校验位分别覆盖不同的数据位子集,每个校验位负责一个“校验方程”,错误发生时,多个校验方程同时失败,其失败组合就构成了错误位置的“二进制地址”。

以经典的(7,4)汉明码为例:4位数据D1~D4,3位校验位P1~P3,共7位码字。校验位按如下规则生成(采用偶校验):

P1 = D1 ⊕ D2 ⊕ D4
P2 = D1 ⊕ D3 ⊕ D4
P3 = D2 ⊕ D3 ⊕ D4

读出时重新计算三个校验方程,得到3位伴随式(Syndrome)S1S2S3。若S=000,认为无错;若S≠000,其十进制值直接指向出错的位号。例如S=101(即5),表示第5位出错,将该位取反即可纠正。这就是汉明码“检1位错并纠1位错”的能力来源。

但汉明码有一个致命弱点:它只能纠正1位错,却无法区分“1位错”和“2位错”。当发生2位翻转时,伴随式可能恰好等于某个合法单错位置,导致纠错逻辑把好位改错,形成误纠。对于星载环境,多位翻转(MBU)并不罕见,因此需要更强的方案。

二、SEC-DED:扩展汉明码的工程化选择

SEC-DED(Single Error Correction, Double Error Detection)在汉明码基础上增加1个全局校验位P0,通常取整个码字(含原有校验位)的偶校验。这样做的效果是:

  • 发生1位错时,汉明部分给出非零伴随式,P0校验失败,判定为可纠单错;
  • 发生2位错时,汉明部分可能给出非零伴随式,但P0校验通过(因为两位翻转使总奇偶性不变),从而判定为不可纠双错,只报告不纠正;
  • 发生3位错时,P0失败且伴随式非零,可能被误判为单错,这是SEC-DED的能力边界。

因此SEC-DED的准确表述是:纠正1位错,检测2位错,对3位及以上错误不具备可靠区分能力。在星载FPGA中,这已经能覆盖绝大多数单粒子翻转场景,同时实现复杂度可控,是SRAM型FPGA配置存储器、BRAM以及外部SRAM/DRAM接口中最常见的ECC方案。

三、纠错能力与开销分析

ECC的开销可以从三个维度衡量:冗余位开销、编解码逻辑开销、时序开销。冗余位数量由码字长度决定。对于SEC-DED,若数据位为k,校验位为r,则需满足:

2^(r-1) ≥ k + r + 1

例如k=32时,r=7可满足(2^6=64 ≥ 32+7+1=40),因此32位数据需要7位校验,总码字39位,冗余开销约21.9%。k=64时,r=8(2^7=128 ≥ 64+8+1=73),冗余约12.5%。可见数据位越宽,相对开销越低,但编解码异或树的深度和延迟也随之增加。

下表给出典型位宽下的SEC-DED参数示例(均为按上述不等式计算的理论值,非实测):

数据位k校验位r码字总长冗余开销可纠/可检
851362.5%1纠/2检
1662237.5%1纠/2检
3273921.9%1纠/2检
6487212.5%1纠/2检

在FPGA实现中,编码就是一棵异或树,解码则是重新计算伴随式并做译码。关键工程约束是:解码路径必须在一个时钟周期内完成,否则会拉低存储器接口频率。对于高速接口,常采用流水线译码或在读出寄存器后插入一级流水。另一个重要细节是“纠错写回”:当检测到可纠错误时,除了输出纠正后的数据,还应把纠正值写回存储单元,防止错误累积。写回时机需要与存储器写端口仲裁,避免与正常写入冲突。

在星载应用中,建议对ECC状态做计数与上报:单错计数用于评估SEU率,双错计数用于触发更高级别的容错策略(如刷新、重载或切换冗余存储区)。

四、从SEC-DED到更强扩展

当系统要求“纠2位错”或“纠1位错同时检3位错”时,SEC-DED就不够了。常见扩展方向包括:

  • DEC-TED(Double Error Correction, Triple Error Detection):使用BCH码或RS码,能纠2位、检3位,但校验位和译码复杂度显著上升;
  • 交织SEC-DED:把多个SEC-DED码字按位交织,使一个物理多位翻转分散到不同码字中,每个码字仍只承受1位错,从而用较低开销获得抗MBU能力;
  • 级联/乘积码:行、列分别编码,适合大容量存储阵列,但译码延迟和面积更大。

选择哪种方案,取决于轨道环境、器件工艺节点、存储容量和可接受的延迟。对多数低轨星载FPGA设计,交织SEC-DED往往是性价比最高的起点。

SEC-DED 编解码与纠错能力示意 数据位 k 如 32 bit 编码:异或树 生成 P1..Pr + P0 码字 k+r 如 32+7=39 bit 存储阵列 SEU 注入点 读出码字 可能含位翻转 译码:伴随式 S 重算校验方程 S 与 P0 判断 区分单错/双错 无错 S=0,P0 通过 直接输出数据 单错(可纠) S≠0,P0 失败 翻转对应位并写回 双错(不可纠) S≠0,P0 通过 报错,不输出错误数据 开销权衡: 冗余位 r 随 k 增大而相对下降(k=32→r=7,约21.9%;k=64→r=8,约12.5%); 译码异或树深度随 k 增大而增加,需关注单周期时序;纠错写回需与写端口仲裁。

总结来看,汉明码解决了“定位1位错”的问题,SEC-DED在此基础上增加了“识别2位错”的能力,成为星载FPGA存储保护的基础方案。实际选型时,应结合数据位宽、目标频率、抗MBU需求和资源余量,在冗余开销与纠错能力之间做出明确取舍,而不是盲目追求更强纠错等级。