章宇杰,沈小波
(中國電子科技集團公司第58研究所,江蘇 無錫 214035)
評價存儲器的一個重要指標就是它的可靠性。在一般的數(shù)據(jù)存儲中,幾個位的錯誤可能不是很關鍵的問題,但是如果發(fā)生在某個敏感的數(shù)據(jù)上,這個小小的故障可能會導致嚴重的后果。因此,必須采取一些措施來及時檢出并糾正出錯的數(shù)據(jù)。目前常用的方法有:奇偶校驗、CRC校驗、重復碼校驗等。
ECC校驗是在奇偶校驗的基礎上發(fā)展而來的,它將數(shù)據(jù)塊看作一個矩陣,利用矩陣的行、列奇偶信息生成ECC校驗碼。它能夠檢測并糾正單比特錯誤和檢測雙比特錯誤,但對雙比特以上的錯誤不能保證檢測。它克服了傳統(tǒng)奇偶校驗只能檢出奇數(shù)位出錯、校驗碼冗長、不能糾錯的局限性。文中在介紹高速大容量固態(tài)存儲器的硬件結構基礎上,詳細介紹了ECC校驗碼的生成規(guī)則以及ECC校驗流程,并通過FPGA實現(xiàn)了該算法。
本文中的存儲器是以ARM為SSD控制器,用16片F(xiàn)lash芯片構成存儲陣列,采用SATA接口實現(xiàn)數(shù)據(jù)的高速率存儲。Flash存儲陣列分為8組,每組2片,每組Flash芯片共用數(shù)據(jù)和控制總線。該存儲器的硬件結構如圖1所示。
圖1 SSD構架圖
存儲板上的存儲芯片用的是Micron公司的高速大容量固態(tài)存儲芯片Nand Flash Memory,其容量為1 G×8 bit,分為8192個塊,每個塊又分為64頁,1頁有(2 k+64)Byte,其中一頁有64 bit的空閑區(qū)。存儲板上的SSD控制器是由ARM 926為核心的控制芯片,它負責數(shù)據(jù)的緩沖和整個存儲器的時序控制,并負責以頁為單位生成校驗碼,并把校驗碼存入到頁的空閑區(qū)內。下面以2 048 bit為單位介紹校驗碼的生成以及校驗流程。
Flash在讀寫數(shù)據(jù)的時候是以頁為單位進行的,可以以2 048 bit為單位生成校驗碼。每個數(shù)據(jù)有8位信息組成,可以把這2 048個數(shù)據(jù)看成256×8的矩陣,這樣就可以分別生成行校驗碼和列校驗碼來分別校驗。ECC校驗中,每256個數(shù)據(jù)生成3個字節(jié)的校驗碼,這24位的校驗碼分成3個部分:6位的列校驗信息,16位的行校驗信息,其余的2位置1,ECC校驗碼組成,如圖2所示。其中CP0、CP1、CP2、CP3、CP4、CP5是列校驗碼,而LP0、LP1、LP2、LP3、LP4、LP5、LP6、LP7、LP8、LP9、LP10、LP11、LP12、LP13、LP14、LP15是行校驗碼。行列校驗碼生成表,如圖2所示。
圖2 列和行奇偶的框圖
處理每個數(shù)據(jù)字節(jié)在整個數(shù)據(jù)模塊上計算列奇偶。
列奇偶位的計算方法為:
行奇偶位的計算方法為:
ECC校驗可以檢測1 bit或2 bit錯誤,并糾正1 bit錯誤。
(1)無錯誤
由于flash中存儲的代碼和讀操作所產(chǎn)生的代碼沒有不同,因此這種情況下沒有錯誤。
(2)可校準的錯誤
在計算完所有數(shù)據(jù)的ECC后和flash中所儲存的原來的ECC后產(chǎn)生位比較后,所有奇偶位對(CP0和CP1)…(LP14和LP15)自身有一個錯誤和一個匹配。這種情況下可以校準錯誤。
(3)不可校準的錯誤
在計算完所有數(shù)據(jù)的ECC后和flash中所儲存的原來的ECC后產(chǎn)生位比較后,只要有奇偶對都有錯誤,如CP0和CP1都有錯誤這表示多個位錯誤并不可校準。
(4)可校錯誤的位置
通過存儲在flash中的ECC和從數(shù)據(jù)中計算出的ECC相異或后,找到錯誤的位置。(LP15、LP13、LP11、LP9、LP7、LP5、LP3、LP1)這一組數(shù)據(jù)給出了出錯的字節(jié)地址。(CP5、CP3、CP1)給出了出錯的位的地址。
該ECC算法在FPGA中實現(xiàn),ECC碼生成工程實現(xiàn)按照ECC的生成的算法。
算法實現(xiàn)流程圖如圖3所示。
圖3 算法流程
本實驗處理對象為256 Byte的數(shù)據(jù)包,對其進行ECC校驗共生成22 bit校驗數(shù)據(jù)。為方便讀取,可以在末尾添加兩位,形成完整的3 Byte 校驗數(shù)據(jù)。這3 Byte共24 bit,分成兩部分:6 bit的比特校驗和16 bit的字節(jié)校驗,多余的2 bit置1,并置于校驗碼的最低位,在進行異或操作時此2 bit忽略。ECC生成實驗結果如圖4所示。
圖4 ECC計算結果
圖4中等待256個字節(jié)的數(shù)據(jù)輸入后,最后生成校驗碼4401E9,也就是3個字節(jié)的校驗碼。其中out1、out2和out3為中間數(shù)據(jù),EOF高電平出現(xiàn)代表數(shù)據(jù)運算結束。運算結束,輸出4401E9,其中最后兩位為無效數(shù)據(jù)。數(shù)據(jù)輸入為串行輸入,256個字節(jié)需要256個時鐘周期后才能完成輸入。由此從輸入開始到得出計算結果至少需等待256個時鐘周期。在實際使用過程中可以將串行輸入改為并行輸入,或流水線結構,以減少等待時間。
ECC校驗的結果如圖5所示,其中錯誤指示由兩個bit表示。00表示沒有錯誤,01表示有1位錯誤,10表示有2位及2位以上錯誤,11表示ECC區(qū)出錯。當出錯位為1位時,由錯誤位置指出可糾錯的位。
圖5 ECC檢驗
為了實現(xiàn)數(shù)據(jù)的可靠傳輸,在固態(tài)盤中需要使用ECC校驗。文中介紹了ECC算法的一種實現(xiàn)方法,說明了ECC的校驗流程,最后用xilinx FPGA XC3S500E實現(xiàn)ECC校驗算法。ECC校驗算法簡單,軟硬件均能實現(xiàn),ECC能夠檢測并糾正單比特錯誤和檢測雙比特錯誤,所以可以為數(shù)據(jù)存儲和通信系統(tǒng)提供一種強有力的差錯檢測手段。使用本文提供的ECC算法可以糾錯1 bit,檢錯2 bit。
[1]李璐,周海燕.一種含BCH編解碼器的SLC/MLC-Nand flash控制器的VLSI設計[J].現(xiàn)代電子技術,2009.7.
[2]Toru Tanzawa etc.A Compact On-Chip ECC for Low Cost Flash Memories [J].IEEE Journal of solid-state circuits,1997,32(5).