企业级内存条的Memory ECC

我们今天来简单讨论一下企业级内存条的memory ecc。
图 (1)
图(1)是一个带有ecc的rdimm,图中我们已经将各个组件和关键的金手指信号区域标示出来。首先,我们来认识一下这几个关键词: device:内存颗粒,根据其存放内容不同,又分为数据颗粒和ecc颗粒。通常有x4,x8和x16,代表每个颗粒对外的数据线路是4 lane,8 lane和16 lane。
channel:一个channel由一个或者多个rank组成,其宽度由控制器决定。当前主流的个人电脑和服务器中,一个channel的宽度为64bit,可根据内存控制器是否支持ecc而扩展额外的8bit。也就是说如果不支持ecc的channel,其宽度为64bit,而支持ecc的channel,其宽度为72bit。市面上两种内存条都有销售。
rank:一个channel里面,同一个cs(chip select)信号选中的所有device就是一个rank。同一个rank中所有的device共用命令,地址和控制信号。拿读操作举例,内存控制器发起的一个读操作,其实将作用于该channel的某个rank中所有的device。所有device的数据线共同输出达到内存控制器所需的宽度。例如,采用x4的颗粒,组成不带ecc功能的一个rank则需要64/4 = 16个x4的device。大家可以计算一下如果采用x8或者x16宽度的颗粒,需要多少个呢?
注:本文我们将主要以x4的device来讨论
注:x16的颗粒一般不被用来组成带ecc的rank
cacheline:cacheline通常是指是处理器中cache unit(缓存模块)缓存一笔数据的标准大小。根据处理器的不同,cacheline的大小是不一样的。当前主流的个人电脑和服务器中,cacheline的大小为64 byte。为了设计方便,处理器内部搬运可被缓存的数据也采用同样的大小64b。为了满足该需求,一个rank被设计成了64bit的数据位宽,而jedec(ddr标准组织)设计了burst传输。一个burst的长度可以是8,从而一次读操作,可以让颗粒一次吐出8笔数据。从而达到64bit x 8 = 64b的大小。具体参考图(2)。
图(2)
ce(correctableerror):可纠正错误是指硬件(芯片)可以直接纠正的错误。由于内存控制器设计不一样,对于可纠正错误的能力可能存在不同。例如,主流x86服务器的内存控制器(支持带ecc的内存条),在一次读操作中,一个x4宽度的device内的任意错误都是可纠正的,包括ecc的device。如果rank是x8宽度的device组成,其纠正能力还是与x4的device宽度及位置保持一致。在x8的一个device中,只有dq0-3,或者dq4-7可以被纠正。如果是dq2-5,虽然是x4宽度但位置与x4时不对应,也无法纠正。
注:dq0即d0,或者d0_0,dq63则是d63,或者d15_3
uce(uncorrectable error):不可纠正错误是指硬件(芯片)无法直接纠正的错误。例如,在一次读操作中,错误数据位分布在不同x4的device范围,以现有内存控制设计来看,属于不可纠正错误。
下面我们简单介绍一下内存控制器是如何侦错和纠错的。由于ecc具体算法属于各家的ip,这里介绍的方法只是帮助大家理解该功能。首先,内存控制器能够纠错,就必须先能发现错误。如果每次消费的数据大小是64b,在不增加额外信息的情况下,我们是无法知道该数据是否有改变的,因为64b的数据可以是任何01的组合,即任意数据都是合法的。另一方面,额外的信息需要额外的存储,从成本考虑,这额外信息应该越小越好。jedec组织提出增加额外8 x 8 = 64bit的数据来帮助一个64b的数据完成ecc。 从物理角度看,一个x4 device组成的rank将会增加两个device用于ecc。一种可行的做法是,其中一个device负责存放crc(cyclic redundancy check)校验信息用于侦错,另一个device负责存放奇偶校验信息(parity),配合纠正错误。
parity:parity基本功能是发现保护数据中是否有bit翻转。保护方法是统计保护数据中1的个数,如果是偶校验,当保护数据中1的个数是偶数时,parity为0,否则为1,所以parity只需要一个bit就能发现保护数据中是否有一个bit的数据翻转(0到1或者1到0)。当然对于奇数个bit都有一样的检测效果。但当偶数bit翻转的时候,parity将无法知道。在了解了parity基本功能后,我们来看看内存控制器是如何计算parity并存放的。如图(3)所示。
图(3)
burst传输中每一笔64bit数据,4bit parity和4bit crc的具体对应关系如下: p0=d0_0+d1_0+d2_0+…d15_0+c0 p1=d0_1+d1_1+d2_1+…d15_1+c1 p2=d0_2+d1_2+d2_2+…d15_2+c2 p3=d0_3+d1_3+d2_3+…d15_3 +c3
注:d15_3为device15的dq3信号,从rank角度看,为图中的d63
假设device 2 在burst的第三笔数据中有bit翻转,则无论是d2_0, d2_1, d2_2, d2_3 或者都错了,请参考图(4),我们都可以通过parity bits反算回来,前提是burst的第三笔数据中其他device没有出现错误。具体计算如下:
d2_0=p0(-)(d0_0+d1_0+d3_0…d15_0+c0)
d2_1=p1(-)(d0_1+d1_1+d3_1…d15_1+c1)
d2_2=p2(-)(d0_2+d1_2+d3_2…d15_2+c2)
d2_3=p3(-)(d0_3+d1_3+d3_3…d15_3+c3)
图(4)
crc:我们怎样知道读取的cacheline数据是正确的还是错误的?这里将会用到crc来进行校验。一种比较简单的校验方式就是除法。我们设计一个除数,让被保护数据(被除数)去除以这个除数,然后会得到商和余数。通常余数比设计的除数要小。在存储一个cacheline大小数据到内存条上的时候,内存控制器会计算crc的值,并存放到crc的device中去。读取的时候再计算一遍,然后和内存条读回来的crc的值进行比较。如果一致,则认为数据没有发生变化。否则,认为数据出错。 从上述理论可以推出,crc校验位越多,则侦错能力越强。crc设计不一样,侦错不同数据翻转的能力不同。可能存在数据错了,但侦错不了的情况。 既然有漏测的情况,为什么我们还会继续使用?这就和错误类型的概率有关了。通常情况下,一个bit翻转的可能性比较高,多bit同时翻转的可能性比较低。多bit翻转在同一个device里的几率比较高,多device同时翻转的概率比较低。 举个例子,当一个cacheline的数据从内存条里读出来后,通过crc校验,我们会发现数据有可能已经发生改变。这个时候,我们先假设出现了ce(correctable error)问题。则通过parity信息反算device数据,需要一个device一个device的假设,然后重新计算crc和之前存储的crc进行比较。所以最多的情况可能要假设18次。 如果全部弄完仍然crc对不上,则属于uce(uncorrectable error)问题啦。当然,大家会发现,ecc校验过程会影响内存读写延时。
到这里,大家应该了解了memory ecc的基本算法了,parity针对的是每个burst,crc是以半个cacheline或者其他大小为单位处理的。如果是跨device的error,真的无法纠错吗?如果有,请将你的实现方案发给我们吧,我们将在下期公布读者的“可行”方案哦。

碳化硅MOSFET芯片取得新突破!
对比oppo R9s,同样搭载骁龙625的红米4差在哪?
大普通信开启全时钟全链路芯片的新打法
加拿大ISED认证最新认证要求
基于手指的准确心率监测
企业级内存条的Memory ECC
可再生能源平均年投资额在未来20年将达到3500亿美元
公益诉讼土壤重金属元素分析仪是什么,有哪些作用?
微智达工业计算机,助力医疗视觉检测设备
Facebook推出支持VR模式浏览的新3D图片功能
将各自的成果开源——微软的PipeDream和谷歌的GPipe
红米Pro2什么时候上市?红米Pro2最新消息:红米Pro2即将到来,红米Pro2定价1999元了
SKI推800km续航快充电池,最快在今年年底完成新电池的开发
碳化硅在高温下能与氧发生反应吗?
后摩尔时代来临,语音IC封装技术一触即发
高速丝材激光熔覆技术及其特点有哪些?
Intel大连工厂投产:造世界最先进3D NAND!
滑动轴承修理的方法
USS通讯的定义、作用、结构及使用过程图文详解
功能显示区域点亮iPhone8科技, 华为P10自诩人像摄影师