1. ECC: Error checking and correction
2011年做手机memory时,2D NAND检错和纠错算法是ECC,一个page 2k,每256 bytes做ecc,纠1检2。
分为行校验和列校验,简单的说就是从行或列逐层做异或(^),奇数个1就是1,偶数个1就是0.
write时比如按列来看(行的原理一样),还是画出来图容易明白:
Byte 0 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP0 | RP2 | RP4 | ... | RP14 |
Byte 1 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP1 | ||||
Byte 2 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP0 | RP3 | |||
Byte 3 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP1 | ||||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ||
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | RP15 | |
Byte 252 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP0 | RP2 | RP5 | ||
Byte 253 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP1 | ||||
Byte 254 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP0 | RP3 | |||
Byte 255 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | RP1 | ||||
CP1 | CP0 | CP1 | CP0 | CP1 | CP0 | CP1 | CP0 | ||||||
CP3 | CP2 | CP3 | CP2 | ||||||||||
CP5 | CP4 |
CP0: bit 0/bit 2/bit 4/bit 6 这4列异或。
CP1: bit 1/bit 3/bit 5/bit 7 这4列异或。
CP2: bit 0/bit 1/bit 4/bit 5 这4列异或。
CP3: bit 2/bit 3/bit 6/bit 7 这4列异或。
CP4: bit 0/bit 1/bit 2/bit 3 这4列异或。
CP5: bit 4/bit 5/bit 6/bit 7 这4列异或。
最后得出CP0-5, RP0-15总共 22 bits,在NAND中占用3个 Bytes放在Spare区。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | |
Byte 0 | RP7 | RP6 | RP5 | RP4 | RP3 | RP2 | RP1 | RP0 |
Byte 1 | RP15 | RP14 | RP13 | RP12 | RP11 | RP10 | RP9 | RP8 |
Byte 2 | CP5 | CP4 | CP3 | CP2 | CP1 | CP0 | 1 | 1 |
read时怎么用它来纠错和检错呢?
同Write一样计算CP,RP,计算结果和spare中存放的进行对比。为
如果read出来的结果有1bit反转,怎么找出并纠正呢?
刚才的图再拿过来用下,还是从列先讲原理,比如bit2的列里存在1个bit反转,从最外层往里二分法比较。
bit7列 | bit6列 | bit5列 | bit4列 | bit3列 | bit2列 | bit1列 | bit0列 |
CP1 | CP0 | CP1 | CP0 | CP1 | CP0 | CP1 | CP0 |
CP3 | CP2 | CP3 | CP2 | ||||
CP5 | CP4 |
对比CP4/CP5与之前存入的比较,发现CP4不一致;然后下一层级对比CP2/CP3发现在CP3,最后一层得出CP0不一致也就找到了bit2这一列。
同理,从行找到具体哪行,就确定那个bit发生了反转了,纠正过来。
如果有2个bit发生反转,假如在同一行,通过CP能找到在哪2列,但是RP是完全相同找不到在哪行。所以2个及以上的bit反转ECC就无能为力了。
2.LDPC: Low Density Parity Check Code
发展到3D NAND后,ssd容量也变大了,单个page也大了。ECC的纠正能力就难以满足,于是有了2k LDPC,到现在的4k LDPC。
LDPC是稀疏校验矩阵线性分组码,分为正则编码和非正则编码。简单点说就是设计一个校验矩阵H和生成矩阵G并且满足HG=0。write时数据和G矩阵异或,得出编码c;read时数据的转置和H矩阵做异或,得出编码s,s为0则解码成功。