本文目的
理解什么是汉明距离,SEC-DEC 码和汉明距离的关系,如何从直觉构造 SEC-DEC 码,如何构造 odd-weight-column 码来降低关键路径延时。
错误检测/纠正码
如果在传输数据过程中,额外添加一些比特,在数据传输或者存储过程中出现错误,能够进行检测和纠正,对应的编码就是错误检测码或者错误纠正码。
奇偶校验码
最简单的错误检测机制就是奇偶校验码,通过计算数据比特中 1 的总数是奇数还是偶数实现错误检测。例如,对于 4 比特数据 4'b1001,“1” 的个数为2,那么对应校验码为 1 ^ 0 ^ 0 ^ 1 = 0。这个校验码会跟随数据存储或者传输。在接受到或者读出数据时,重新对数据做一次校验,和接受到或者读出的校验码比较,如果不同,那么数据有错误。例如读出数据为4'b1101,对应校验码应为 1 ^ 1 ^ 0 ^ 1 = 1,但是存储的校验码为 0,所以数据有错误。
奇偶校验码只能检测奇数个比特出现错误,并且无法指出错误发生的位置,也就无法纠错。但是由于实现电路简单,时序不长,所以当数据位宽比较少,或者需要快速检错的时候常使用奇偶校验,例如缓存中的 tag 常用奇偶校验机制保护。
单比特纠错 - 两比特检错码(SEC-DEC,Single Error Correction and Double Error Detection) 和汉明距离(Hamming Distance)
汉明距离
汉明距离标记两个编码之间的差异。
- 例如 8'b0100_1011 和 8'b0101_1001 有两个比特不同,那么汉明距离就是2。
SEC-DED 与汉明距离的关系
如果希望实现SEC(Single Error Correction),那么两个没有错误的编码之间最小汉明距离为3. 如果希望实现SEC-DED(Single Error Correction, Double Error Detection),那么两个没有错误的编码之间最小汉明距离为4。
code_wo_error_A <--> code_w_error_A <--> code_w_error_B <--> code_wo_error_B
对于 SEC 编码,code_wo_error_A 和 code_wo_error_B 之间有两个编码,那么的汉明距离就是 3 (从code_wo_error_A 到 code_wo_error_B 需要反转 3 个比特)。假如 code_wo_error_A 发生了 1 比特错误,变成了code_w_error_A,就可以推断出正确值应该是 code_wo_error_A。
code_wo_error_A <--> code_w_error_A <--> code_w_error_A_B <--> code_w_error_B <--> code_wo_error_B
对于 SEC-DED 编码,code_wo_error_A 和 code_wo_error_B 之间有三个编码,那么的汉明距离就是 4 (从code_wo_error_A 到 code_wo_error_B 需要反转 3 个比特)。假如 code_wo_error_A 发生了 1 比特错误,变成了code_w_error_A,就可以推断出正确值应该是 code_wo_error_A