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 | 码字总长 | 冗余开销 | 可纠/可检 |
|---|---|---|---|---|
| 8 | 5 | 13 | 62.5% | 1纠/2检 |
| 16 | 6 | 22 | 37.5% | 1纠/2检 |
| 32 | 7 | 39 | 21.9% | 1纠/2检 |
| 64 | 8 | 72 | 12.5% | 1纠/2检 |
在FPGA实现中,编码就是一棵异或树,解码则是重新计算伴随式并做译码。关键工程约束是:解码路径必须在一个时钟周期内完成,否则会拉低存储器接口频率。对于高速接口,常采用流水线译码或在读出寄存器后插入一级流水。另一个重要细节是“纠错写回”:当检测到可纠错误时,除了输出纠正后的数据,还应把纠正值写回存储单元,防止错误累积。写回时机需要与存储器写端口仲裁,避免与正常写入冲突。
四、从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往往是性价比最高的起点。
总结来看,汉明码解决了“定位1位错”的问题,SEC-DED在此基础上增加了“识别2位错”的能力,成为星载FPGA存储保护的基础方案。实际选型时,应结合数据位宽、目标频率、抗MBU需求和资源余量,在冗余开销与纠错能力之间做出明确取舍,而不是盲目追求更强纠错等级。