段曦冉
(中國(guó)電子科技集團(tuán)公司第四十七研究所,沈陽(yáng) 110000)
隨著芯片技術(shù)的進(jìn)步,對(duì)flash 的容量要求也在快速增加。但由于工藝的局限性和復(fù)雜性,往往越大容量的flash 越容易出現(xiàn)位翻轉(zhuǎn)問題。為提高系統(tǒng)可靠性,盡可能避免數(shù)據(jù)錯(cuò)誤的發(fā)生,不僅要提高工藝可靠性,也要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。針對(duì)這種情況,需要在flash 控制器中加入ECC(Error Checking and Correction)校驗(yàn)糾正設(shè)計(jì)。傳統(tǒng)的校驗(yàn)方法有奇偶校驗(yàn)、循環(huán)冗余校驗(yàn)(CRC)和漢明校驗(yàn)。奇偶校驗(yàn)是最常見的校驗(yàn)方法之一,其原理是在數(shù)據(jù)末尾加上1 位校驗(yàn)位。這種算法僅需1 位校驗(yàn)碼就可以檢測(cè)出1 位數(shù)據(jù)出錯(cuò)或奇數(shù)個(gè)位出錯(cuò)。CRC 校驗(yàn)是通過模2(mod 2)運(yùn)算,其特征是信息字段和校驗(yàn)字段可以任意選定長(zhǎng)度。這種算法優(yōu)點(diǎn)是錯(cuò)誤檢測(cè)能力很強(qiáng)。漢明校驗(yàn)是在有效信息位中加入校驗(yàn)位形成漢明碼。漢明碼編譯簡(jiǎn)單,不僅能校驗(yàn)數(shù)據(jù),還能定位數(shù)據(jù)錯(cuò)誤位置,因此基于漢明碼的ECC 技術(shù)被廣泛使用[1-2]。在此對(duì)flash 控制器中錯(cuò)誤檢測(cè)糾正的設(shè)計(jì)原理和實(shí)現(xiàn)過程展開研究。
對(duì)于flash 讀數(shù)據(jù)出現(xiàn)錯(cuò)誤的情況,1 位錯(cuò)誤的處理措施是產(chǎn)生單錯(cuò)誤中斷標(biāo)志、糾正1 位錯(cuò)誤并記錄錯(cuò)誤地址;多位錯(cuò)誤的處理措施是產(chǎn)生多錯(cuò)誤中斷標(biāo)志并記錄錯(cuò)誤地址。ECC 工作原理的簡(jiǎn)單之處在于,在使用時(shí)一定會(huì)檢測(cè)并糾正1 位錯(cuò)誤,一定會(huì)檢測(cè)到2 位錯(cuò)誤。
基于漢明碼的ECC 校驗(yàn)由奇偶校驗(yàn)發(fā)展而來,改進(jìn)了以往校驗(yàn)只能檢測(cè)出錯(cuò)誤而無(wú)法糾正的弊端。其工作原理為在數(shù)據(jù)后加入校驗(yàn)碼,當(dāng)1 位數(shù)據(jù)發(fā)生翻轉(zhuǎn)時(shí),會(huì)發(fā)生半數(shù)校驗(yàn)碼計(jì)算值不一致。通過對(duì)不一致校驗(yàn)碼進(jìn)行比較,可以確定具體錯(cuò)誤比特位,進(jìn)而糾正數(shù)據(jù)。當(dāng)2 位發(fā)生翻轉(zhuǎn)時(shí),會(huì)發(fā)生校驗(yàn)碼計(jì)算值不一致,只可以確定具體地址錯(cuò)誤,無(wú)法判斷具體比特位。當(dāng)多位發(fā)生翻轉(zhuǎn)時(shí),且校驗(yàn)碼計(jì)算值不一致時(shí),只可以確定具體地址錯(cuò)誤,無(wú)法判斷具體比特位。多位發(fā)生翻轉(zhuǎn)時(shí)校驗(yàn)碼計(jì)算值可能不變,但是概率極低、基本不會(huì)發(fā)生。
在此設(shè)計(jì)的ECC 是基于144 位flash,以128bit數(shù)據(jù)為單位計(jì)算校驗(yàn)碼,將128bit 數(shù)據(jù)分為16 個(gè)字節(jié),相應(yīng)的校驗(yàn)位有14 位。在flash 寫入數(shù)據(jù)時(shí),同時(shí)寫入校驗(yàn)碼,讀取數(shù)據(jù)后就可進(jìn)行校驗(yàn)碼比較。當(dāng)校驗(yàn)碼不一致時(shí)便可判定數(shù)據(jù)錯(cuò)誤,此時(shí)判斷數(shù)據(jù)錯(cuò)誤是1 位錯(cuò)誤或是多位錯(cuò)誤。1 位錯(cuò)誤產(chǎn)生中斷、記錄地址并在糾正錯(cuò)誤后輸出正確數(shù)據(jù),多位錯(cuò)誤數(shù)據(jù)產(chǎn)生中斷、記錄地址輸出錯(cuò)誤數(shù)據(jù)。具體流程參考ECC 校驗(yàn)流程圖,如圖1 所示。
圖1 ECC 校驗(yàn)流程圖
為直觀描述校驗(yàn)碼計(jì)算過程,將128bit 數(shù)據(jù)分為16 個(gè)字節(jié)并排列為計(jì)算矩,共計(jì)8 列16 行數(shù)據(jù)。ECC 校驗(yàn)碼計(jì)算如表1 所示。
表1 ECC 校驗(yàn)碼計(jì)算表
相應(yīng)的ECC 校驗(yàn)碼計(jì)算為一系列的異或操作,算式如下(Cn代表n 列數(shù)據(jù),Rn代表n 行數(shù)據(jù)):
計(jì)算后將數(shù)據(jù)位和校驗(yàn)位存儲(chǔ)在flash 中,讀出后根據(jù)數(shù)據(jù)位重新計(jì)算校驗(yàn)碼比較。
基于設(shè)計(jì)和實(shí)際的硬件情況,ECC 整體上由三個(gè)模塊組成,即:ECC 校驗(yàn)碼計(jì)算模塊、ECC 校驗(yàn)糾正模塊和ECC 寄存器模塊。其中,ECC 校驗(yàn)碼計(jì)算模塊在寫flash 時(shí)起作用,ECC 校驗(yàn)糾正模塊在讀flash 時(shí)起作用,ECC 寄存器模塊則用于存儲(chǔ)ECC標(biāo)志位和flash 錯(cuò)誤地址。所設(shè)計(jì)的ECC 的結(jié)構(gòu)框圖如圖2 所示。
圖2 ECC 結(jié)構(gòu)框圖
ECC_en 是ECC 寄存器中ECC 使能位,可以由系統(tǒng)總線控制。信號(hào)data_e 為數(shù)據(jù)錯(cuò)誤標(biāo)志。ADDR為flash 地址。
ECC 校驗(yàn)碼設(shè)計(jì)便于實(shí)現(xiàn)。此處給出部分flash控制器ECC 模塊的verilogHDL 的RTL 級(jí)實(shí)現(xiàn)。flash控制器的ECC 校驗(yàn)碼計(jì)算模塊設(shè)計(jì)采用分半異或,同時(shí)計(jì)算14 次,得出ECC 校驗(yàn)碼。校驗(yàn)碼計(jì)算過程如下述代碼[3-8]:
在ECC 糾正模塊設(shè)計(jì)中校驗(yàn)碼計(jì)算方法與校驗(yàn)碼計(jì)算模塊計(jì)算方法相同,增加了1 位錯(cuò)誤糾正功能,其糾正原理如表2 所示(以正確數(shù)據(jù)為144'h9 995_0000_0014_0000_0013_0000_0012_0000_0011,錯(cuò)誤數(shù)據(jù)為144'h9995_0000_0014_0000_0013_0000_0002_0000_0011 為例)。
表2 糾錯(cuò)原理表
對(duì)比表1 的ECC 校驗(yàn)碼計(jì)算表,便可以清楚地看出錯(cuò)誤位位數(shù)為bit36,將該錯(cuò)誤位取反即可得出正確數(shù)據(jù)。
對(duì)于2 位及2 位以上錯(cuò)誤,目前還沒有方法進(jìn)行糾正,但本設(shè)計(jì)可以檢測(cè)大部分的數(shù)據(jù)錯(cuò)誤情況并記錄錯(cuò)誤數(shù)據(jù)存放地址。
在ECC 模塊設(shè)計(jì)完成后,將其與其他IP 進(jìn)行整合,并掛接到Cortex-M4 為核心處理器的一款MCU 設(shè)計(jì)中,搭建仿真驗(yàn)證平臺(tái)進(jìn)行功能驗(yàn)證以及FPGA 驗(yàn)證。仿真結(jié)果如下:
(1) 寫數(shù)據(jù)
使用總線寫flash,使能ECC,對(duì)flash 寫操作進(jìn)行功能仿真,仿真結(jié)果如圖3 表示(以正確數(shù)據(jù)為144'h9995_0000_0014_0000_0013_0000_0012_0000_0011,錯(cuò)誤數(shù)據(jù)為144'h9995_0000_0014_0000_001 3_0000_0002_0000_0011 為例)。
圖3 校驗(yàn)碼計(jì)算
(2) 讀數(shù)據(jù)1 位錯(cuò)誤
使用總線讀flash,使能ECC,對(duì)讀flash 模式進(jìn)行功能仿真,強(qiáng)制翻轉(zhuǎn)1 位數(shù)據(jù),仿真結(jié)果如圖4 表示(以正確數(shù)據(jù)為144'h9995_0000_0014_0000_0013_0000_0012_0000_0011,錯(cuò)誤數(shù)據(jù)為144'h9995_000 0_0014_0000_0013_0000_0002_0000_0011 為例)。
圖4 讀數(shù)據(jù)1 位錯(cuò)誤
在仿真中,強(qiáng)制將第36 位置0,使flash 輸出結(jié)果錯(cuò)1 位。32'h810_c040~32'h810_c04C 地址為數(shù)據(jù)128'h 0000_0014_0000_0013_0000_0012_0000_0011地址,所以在系統(tǒng)總線中32'h810_c044 為32'h0000_0012 地址。
通過對(duì)設(shè)計(jì)的研究與分析,完成了基于144 位flash 的硬件ECC 設(shè)計(jì),并將設(shè)計(jì)集成在flash 控制器中。設(shè)計(jì)采用VerilogHDL 硬件描述語(yǔ)言設(shè)計(jì)并實(shí)現(xiàn)了ECC 校驗(yàn)。該設(shè)計(jì)方法簡(jiǎn)單且易于實(shí)現(xiàn),可1位錯(cuò)誤檢測(cè)糾正、2 位錯(cuò)誤檢測(cè)并記錄錯(cuò)誤地址。記錄錯(cuò)誤地址也可以避免其繼續(xù)使用,在芯片實(shí)際應(yīng)用時(shí)可以優(yōu)化flash 壞區(qū)管理策略。