一、概念介绍
1.1 Parity的概念

Parity,即奇偶校验位,指在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。它常常是从两个或更多的原始数据中产生一个冗余数据。一个字节数据的校验位等于8bit数据异或即:p=x0^x1^x2^x3^x4^x5^x6^x7。此时,实际的数据传输序列为9bit:数据+奇偶校验位。

 

 Parity 这个概念可能最初接触到可能是在使用串口调试助手时,它有个可选的奇偶校验,就是为了指示数据传输过程中,发送方和接受方数据序列1的个数是否一致。如果不一致,说明数据在传输的链路中可能出错了。

 

优点:

结构简单,只需异或计算就可以实现,数据量小时实现代价小。

 

缺点:

1、不能修正错误:只知道校验的数据中有部分比特发生错误,无法判断哪几个比特发送错误。

 

2、有偶数个比特位时,则无法判断出错。

 

3、数据位宽较大时实现代价大:如1024比特数据,需要256bit的校验位。

 

1.2 ECC的概念
ECC是“Error Correcting Code”的简写,ECC是一种能够实现“错误检查和纠正”的技术。通过上面的分析我们知道Parity机制是通过在原来数据位的基础上增加一个数据位来检查当前8位数据的正确性,随着数据位每增加8比特,检验位需要增加1比特。当数据量为256字节时,需要256个比特位,并且出错的数据无法恢复。由此,一种存储检错纠错机制出现了,这就是ECC。ECC同样通过增加校验位来进行错误判断,但是能够进行错误纠正。

 

优点:

1):大量数据位实现代价低:8比特数据需要5个校验位,256字节(256*8比特)的数据值需要5个列校验位和11行校验位

 

2)能够纠正错误:在内存中ECC能够容许错误,并可以将错误更正,使系统得以持续正常的操作,不致因错误而中断

 

缺点:

1):只能修复1比特错误

当数据只有单比特错误时,ECC能够进行错误修复;超过2比特的数据错误,将无法修复,ECC只能输出多比特错误信号。

 

2):不保证能检测超过2比特的错误。

超过2比特的错误不一定能检测出来。

 

3):算法复杂,逻辑级数比较深,时序不好收敛。

 

二、应用场景 
在IC设计中RAM模块需要输出信号有Parity信号和ECC信号。这样能够在一定程度上确保芯片的可测性以及可靠性。特别是在逻辑设计中使用的链表RAM或者控制RAM,如果这类RAM底层有坏块而导致RAM读出的数据某bit发生错误,可能会导致系统挂死。为了减少出现这种情况的风险,一般会对这类RAM做ECC计算逻辑,而像数据流RAM或者配置RAM可以只做Parity校验。

 

事实上,在做Parity计算时,并不需要严格按照每字节增加1bit Parity校验位,这样对于大位宽的RAM而言,仅仅为了实现校验错误,实现代价太大。因此,可以一个RAM做一个Parity校验位。而对于ECC而言,一般针对位宽较小的RAM。

 

三、实现细节
Parity是同一个data所有比特的异或,在data_in写入的时候进行异或计算得到parity_in,同时写入到RAM中,读出data的得到data_out,对data_out进行异或计算得到parity_out,若parity_out与parity_in(ram读出数据所携带)不相等,则表示数据有错误。

 

此外,在RAM的写侧和读侧加入Parity计算逻辑时,特别是大位宽的RAM,则需要考虑reg2mem和mem2reg时序是否收敛的问题,一般情况下处理是写侧计算Parity后打拍后写入,读侧打拍后再做Parity计算逻辑。

 

ECC负责纠错,能够修正1bit的数据。算法比较复杂,可以参考以下博客,不在叙述。