DW ECC 设计
1 模块接口说明
module DW_ECC #(
parameter width = 32 , // ECC 校验数据位宽
parameter chkbits = 7 , // ECC 校验码数据位宽,示例:64 位数据 - 8 位校验码
parameter synd_sel = 0
)(
input gen , // 1'b1 : 写模式; 1'b0 : 读模式
input correct_n , // 低有效使能数据更正功能,仅作用于读模式
input [width-1:0] datain , // 数据输入
input [chkbits-1:0] chkin , // 校验码输入,仅作用于读模式
output err_detect , // 单 bit 错误报错,仅读模式有效
output err_multpl , // 多 bit 错误报错,仅读模式有效
output dataout , // 输出数据,错误发生且更正功能使能时有效将被更正,仅读模式有效
output chkout // 输出校验码,
); // gen = 1, 写入到存储器的校验码
// gen = 0, 当 synd_sel = 1 时输出 syndrome 值
// 即 chkin 和 rdata 校验码的异或值
DW_ECC 模块的核心算法是汉明码的变体。
基本原理:对于
m位的数据,需要添加k位校验位,构成一个m + k位的码字。这些校验位是通过对原始数据位进行特定的奇偶校验计算得到的。每个校验位负责保护一组特定的数据位,这种分组方式保证了单个数据位错误会产生一个唯一的错误特征签名,即校正子(Syndrome)。校验位数量:经典的汉明码满足不等式
2^k ≥ m + k + 1。例如,要保护8位数据,需要log(8) + 2 = 5位校验位;保护64位数据,则需要8位校验位。这种关系确保了有足够多的唯一校正子来定位所有单比特错误。
2 行为举例说明
假设写入数据为 64'h7766_5544_3322_1100;则 ECC 会生成 8'hC 作为校验码存入 MEM。读出数据假设发生 1bit 错误: 64'h7766_5544_3322_1100 -> 64'h7766_5544_3322_1101。此时 DW_ECC 会重新生成 64'h7766_5544_3322_1101 数据的 ECC 校验码 8'hC2,并有如下行为:
err_detect = 1'b1dataout = 64'h7766_5544_3322_1100(correct_n = 1'b0)chkout = 8'hC2 ^ 8'hC = 8'hCE(synd_sel = 0)