陳天培,吳校生,強(qiáng)小燕
(1.上海交通大學(xué)微米/納米加工技術(shù)國(guó)家級(jí)重點(diǎn)實(shí)驗(yàn)室,上海 200240;2.中科芯集成電路有限公司,江蘇無(wú)錫 214072)
存儲(chǔ)器作為儲(chǔ)存大量數(shù)據(jù)的電路元件,對(duì)數(shù)據(jù)可靠性的要求很高。提升存儲(chǔ)器可靠性的一種常見(jiàn)手段是通過(guò)增加冗余硬件設(shè)計(jì)來(lái)對(duì)工作電路進(jìn)行保護(hù)[1]。給數(shù)據(jù)增加糾錯(cuò)碼(Error Correcting Code, ECC)或檢錯(cuò)碼(Error Detecting Code, EDC)是冗余硬件設(shè)計(jì)的一種思路。常見(jiàn)的ECC 或EDC 包括奇偶校驗(yàn)碼、CRC校驗(yàn)、漢明碼、BCH 碼、RS 碼[2-3]等。各種碼的復(fù)雜度不同,糾錯(cuò)能力也不盡相同。其中,漢明碼最為常見(jiàn)。漢明碼是一種線(xiàn)性分組碼[4],能夠?qū)崿F(xiàn)一位比特糾錯(cuò)。在電路中,一位錯(cuò)誤出現(xiàn)的概率最大[5],因此漢明碼得到了廣泛的應(yīng)用。
盡管ECC 碼是一種有效的增加存儲(chǔ)器可靠性的保護(hù)措施,但同時(shí)也帶來(lái)了一些負(fù)面影響。增加冗余信息碼會(huì)帶來(lái)額外的面積開(kāi)銷(xiāo)、編解碼帶來(lái)的功耗提升以及較長(zhǎng)的組合邏輯時(shí)延。如何進(jìn)行優(yōu)化,研究人員對(duì)其進(jìn)行了深入的探索,并得到了大量的研究成果。文獻(xiàn)[6]提出了兩種基于漢明碼的新的編碼機(jī)制SEC-DAED 以及SEC-DED-TAED,在不增加校驗(yàn)位位數(shù)的情況下,前者能夠?qū)崿F(xiàn)一位糾錯(cuò)、連續(xù)兩位檢錯(cuò),后者能夠?qū)崿F(xiàn)一位糾錯(cuò)、兩位檢錯(cuò)以及連續(xù)三位檢錯(cuò)。文獻(xiàn)[7]進(jìn)一步提出了一種可變范圍的連續(xù)位糾錯(cuò)的編碼機(jī)制,同時(shí)不增加同等情況下漢明碼的校驗(yàn)位數(shù)。文獻(xiàn)[8-9]則研究了對(duì)糾錯(cuò)碼編解碼模塊的優(yōu)化。本文基于擴(kuò)展?jié)h明碼這一編碼機(jī)制進(jìn)行了深入的研究,提出了一種動(dòng)態(tài)糾錯(cuò)機(jī)制。
漢明碼的基本思想是將待檢驗(yàn)的數(shù)據(jù)碼元進(jìn)行分組,再分別對(duì)各組碼元進(jìn)行編碼生產(chǎn)對(duì)應(yīng)校驗(yàn)碼。若是某一個(gè)數(shù)據(jù)位出現(xiàn)錯(cuò)誤,則該數(shù)據(jù)位所屬的組校驗(yàn)碼將無(wú)法與當(dāng)前數(shù)據(jù)對(duì)應(yīng),即發(fā)生錯(cuò)誤。通過(guò)計(jì)算出校驗(yàn)碼無(wú)法對(duì)應(yīng)的分組來(lái)確定最終出錯(cuò)的數(shù)據(jù)位。
漢明碼能夠?qū)崿F(xiàn)一位檢錯(cuò)與糾錯(cuò)。以n位數(shù)據(jù)為例,若附加的冗余校驗(yàn)位位數(shù)為r,對(duì)于校驗(yàn)位來(lái)說(shuō),需要唯一表示任何一位的出錯(cuò)情況以及數(shù)據(jù)正確的情況,因此n、r兩者的關(guān)系由式(1)約束:
當(dāng)數(shù)據(jù)位位數(shù)為32 位時(shí),則所需要的冗余位為6位。基于式(1),每當(dāng)數(shù)據(jù)位位數(shù)增加一倍,所需的冗余位位數(shù)增加一位。
普通漢明碼只能夠檢測(cè)并修正一位錯(cuò)誤。通過(guò)再增加一位奇偶校驗(yàn)碼,可以實(shí)現(xiàn)兩位錯(cuò)誤的識(shí)別,該碼被稱(chēng)為擴(kuò)展?jié)h明碼[4]。
本文進(jìn)行校驗(yàn)的數(shù)據(jù)位寬為32 位。擴(kuò)展?jié)h明碼的編碼方式如式(2)~(8)所示。其中bn為校驗(yàn)位n,an為數(shù)據(jù)位n。可以看到每位校驗(yàn)位的生成是對(duì)特定的數(shù)據(jù)位異或運(yùn)算后生成的。而增加的一位奇偶校驗(yàn)位則是對(duì)所有的數(shù)據(jù)位進(jìn)行異或運(yùn)算。
基于上述算法生成的校驗(yàn)位不僅可以對(duì)數(shù)據(jù)進(jìn)行一位糾錯(cuò),同時(shí)可以對(duì)校驗(yàn)位本身進(jìn)行一位糾錯(cuò)。其一位錯(cuò)誤位由以下流程確定:進(jìn)行ECC 校驗(yàn)時(shí),將儲(chǔ)存的校驗(yàn)碼以及相應(yīng)數(shù)據(jù)發(fā)至檢查模塊,對(duì)數(shù)據(jù)重新生成校驗(yàn)碼,將原校驗(yàn)碼與新生成的校驗(yàn)碼進(jìn)行比較(異或),產(chǎn)生7 位的錯(cuò)誤編碼;再將錯(cuò)誤編碼送至譯碼模塊,確定錯(cuò)誤位置。對(duì)于一位錯(cuò)誤來(lái)說(shuō),錯(cuò)誤編碼第7 位必然為1。而對(duì)于兩位錯(cuò)誤,錯(cuò)誤編碼的第7 位必然為0,此時(shí)若剩余6 位錯(cuò)誤編碼不為0 時(shí),則發(fā)生了兩位或以上的錯(cuò)誤。一位錯(cuò)誤及兩位錯(cuò)誤檢測(cè)如圖1 所示,其中syndrome 信號(hào)表示錯(cuò)誤編碼,single_err信號(hào)表示一位錯(cuò)誤,double_err 信號(hào)表示兩位錯(cuò)誤。
圖1 一位錯(cuò)誤及兩位錯(cuò)誤檢測(cè)
按照以上算法,本文基于Verilog 語(yǔ)言進(jìn)行了ECC 糾錯(cuò)模塊的設(shè)計(jì)。ECC 糾錯(cuò)模塊整體分為3 個(gè)子模塊:校驗(yàn)碼生成模塊、檢查模塊和修復(fù)模塊。當(dāng)數(shù)據(jù)要被送入到存儲(chǔ)器前,通過(guò)校驗(yàn)碼生成模塊生成校驗(yàn)碼,并與數(shù)據(jù)一起送入存儲(chǔ)器中。當(dāng)需要取用數(shù)據(jù)時(shí),則讀出數(shù)據(jù)到檢查模塊,利用生成模塊生成新校驗(yàn)碼后并得到錯(cuò)誤編碼,根據(jù)錯(cuò)誤編碼產(chǎn)生一位以及兩位錯(cuò)誤信號(hào)。如若有一位錯(cuò)誤,則進(jìn)一步送至修復(fù)模塊對(duì)數(shù)據(jù)進(jìn)行修正,ECC 糾錯(cuò)模塊如圖2 所示。
圖2 ECC 糾錯(cuò)模塊
由上述算法可以看出,與奇偶校驗(yàn)相比,漢明碼校驗(yàn)各校驗(yàn)位生成與檢查均需進(jìn)行大量的異或計(jì)算。在具體實(shí)現(xiàn)上引入了較長(zhǎng)的組合邏輯,帶來(lái)了更長(zhǎng)的延時(shí)。同時(shí)進(jìn)行數(shù)據(jù)編解碼時(shí),邏輯門(mén)頻繁的翻轉(zhuǎn)也導(dǎo)致了更大的動(dòng)態(tài)功耗。盡管奇偶校驗(yàn)在功耗與延時(shí)上都優(yōu)于漢明碼校驗(yàn),但奇偶校驗(yàn)本身只能檢測(cè)一位錯(cuò)誤,而不能糾正錯(cuò)誤。擴(kuò)展?jié)h明碼則能夠糾正一位錯(cuò)誤,檢測(cè)兩位錯(cuò)誤。為了盡可能利用兩種校驗(yàn)方式的優(yōu)勢(shì),本文提出了一種動(dòng)態(tài)糾錯(cuò)機(jī)制,在保證漢明碼糾錯(cuò)強(qiáng)度的同時(shí),降低糾錯(cuò)過(guò)程的延時(shí)與動(dòng)態(tài)功耗。
其基本原理是在檢查階段,利用奇偶校驗(yàn)碼對(duì)所有數(shù)據(jù)進(jìn)行校驗(yàn)。而在糾錯(cuò)階段,則采用漢明碼糾正錯(cuò)誤。注意到擴(kuò)展?jié)h明碼最高位本身是所有數(shù)據(jù)的奇偶校驗(yàn)位,因此對(duì)數(shù)據(jù)進(jìn)行奇偶檢驗(yàn)時(shí),只需對(duì)原始校驗(yàn)碼最高位進(jìn)行計(jì)算并檢查。這就使得檢查的邏輯延時(shí)縮短。而其他比較邏輯在奇偶校驗(yàn)期間不會(huì)工作,降低了檢查模塊的動(dòng)態(tài)功耗。
存儲(chǔ)器復(fù)位之后,開(kāi)啟奇偶校驗(yàn)。當(dāng)?shù)谝淮我晃诲e(cuò)誤出現(xiàn)時(shí),動(dòng)態(tài)糾錯(cuò)模塊將在下一個(gè)時(shí)鐘周期對(duì)同一數(shù)據(jù)進(jìn)行漢明碼校驗(yàn),以修正錯(cuò)誤。同時(shí)開(kāi)啟讀請(qǐng)求計(jì)數(shù),若在設(shè)定的次數(shù)內(nèi)不再發(fā)生一位錯(cuò)誤,則可認(rèn)為該一位錯(cuò)誤是偶發(fā)錯(cuò)誤,糾錯(cuò)模塊將繼續(xù)用奇偶校驗(yàn)對(duì)數(shù)據(jù)進(jìn)行檢查。若在設(shè)定的次數(shù)內(nèi)再次發(fā)生一位錯(cuò)誤,則可以認(rèn)為工作環(huán)境發(fā)生了變化,糾錯(cuò)模塊將持續(xù)開(kāi)啟漢明碼校驗(yàn)。在持續(xù)開(kāi)啟漢明碼校驗(yàn)的階段,每次新發(fā)生的一位錯(cuò)誤將重置讀請(qǐng)求計(jì)數(shù)。若在讀請(qǐng)求計(jì)數(shù)達(dá)到設(shè)定值前都未發(fā)生錯(cuò)誤,動(dòng)態(tài)糾錯(cuò)模塊將重新切換至奇偶校驗(yàn)。圖3 為動(dòng)態(tài)糾錯(cuò)機(jī)制的基本控制流程圖。
圖3 動(dòng)態(tài)糾錯(cuò)機(jī)制控制流程
動(dòng)態(tài)糾錯(cuò)模塊由一個(gè)ECC 監(jiān)控模塊以及ECC 糾錯(cuò)模塊組成。ECC 糾錯(cuò)模塊的一位錯(cuò)誤輸出信號(hào)將被送至監(jiān)控模塊。監(jiān)控模塊則基于上文所述邏輯對(duì)ECC糾錯(cuò)模塊進(jìn)行控制。監(jiān)控模塊自身采用一個(gè)有限狀態(tài)機(jī)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移。圖4 和5 分別為動(dòng)態(tài)糾錯(cuò)模塊功能框圖以及狀態(tài)轉(zhuǎn)移圖。狀態(tài)轉(zhuǎn)移圖中,fe(first error)指示第一次出現(xiàn)錯(cuò)誤,pe(parity error)指示奇偶校驗(yàn)錯(cuò)誤,ce(count end)指示計(jì)數(shù)完畢。該狀態(tài)機(jī)所有狀態(tài)位均為高有效。
圖4 動(dòng)態(tài)糾錯(cuò)模塊功能框圖
模塊啟動(dòng)后,狀態(tài)機(jī)處于idle(空閑)狀態(tài),并開(kāi)啟奇偶校驗(yàn)。當(dāng)檢測(cè)到奇偶校驗(yàn)錯(cuò)誤時(shí),pe 置1,此時(shí)狀態(tài)機(jī)切換至first_cnt(第一次計(jì)數(shù))狀態(tài),模塊將進(jìn)行一次糾錯(cuò)。pe 在計(jì)數(shù)時(shí)置0,fe 置1。在計(jì)數(shù)過(guò)程中,若再次發(fā)生錯(cuò)誤,pe 置1,狀態(tài)機(jī)切換到second_cnt(第二次計(jì)數(shù))狀態(tài)。若未發(fā)生錯(cuò)誤,則計(jì)數(shù)完畢后ce 置1,狀態(tài)機(jī)回到idle 狀態(tài)。在second_cnt 狀態(tài)下,動(dòng)態(tài)糾錯(cuò)機(jī)制模塊將持續(xù)開(kāi)啟漢明碼校驗(yàn)。若在第二次計(jì)數(shù)過(guò)程中發(fā)生錯(cuò)誤,則重置計(jì)數(shù)器。若不發(fā)生錯(cuò)誤,狀態(tài)機(jī)返回idle 狀態(tài)。
圖5 動(dòng)態(tài)糾錯(cuò)模塊狀態(tài)機(jī)
基于上述模塊搭建仿真環(huán)境,并進(jìn)行驗(yàn)證。動(dòng)態(tài)糾錯(cuò)機(jī)制的主要功能點(diǎn)包括兩個(gè)部分,第一個(gè)部分為底層ECC 糾錯(cuò)邏輯;第二個(gè)部分為奇偶校驗(yàn)與擴(kuò)展?jié)h明碼校驗(yàn)間的切換。
ECC 糾錯(cuò)模塊的驗(yàn)證分為一位數(shù)據(jù)的糾錯(cuò)以及二位數(shù)據(jù)的檢錯(cuò)。為測(cè)試所有出錯(cuò)的可能性,依次翻轉(zhuǎn)原始數(shù)據(jù)的每一位,并送至糾錯(cuò)模塊。圖6 和7 分別為一位錯(cuò)誤情況和兩位錯(cuò)誤情況。信號(hào)data_in[31:0]為原始數(shù)據(jù),data_to_ip[31:0]為正確數(shù)據(jù),data_from_ip[38:0]中低32 位為翻轉(zhuǎn)后的數(shù)據(jù),高7 位則為校驗(yàn)碼。data_correct_out[31:0]為修正后的數(shù)據(jù)。r 則指示一位錯(cuò)誤,fatal_error 指示兩位錯(cuò)誤。當(dāng)發(fā)生一位錯(cuò)誤時(shí),singlebit_error 置1,同時(shí)糾錯(cuò)模塊將修正后的數(shù)據(jù)送出。當(dāng)發(fā)生兩位錯(cuò)誤時(shí),fatal_error 置1,同時(shí)糾錯(cuò)模塊將原始數(shù)據(jù)送出。
圖6 一位錯(cuò)誤
圖7 兩位錯(cuò)誤
根據(jù)上文所述流程,當(dāng)?shù)谝淮纬霈F(xiàn)錯(cuò)誤時(shí),動(dòng)態(tài)糾錯(cuò)機(jī)制將執(zhí)行一次漢明碼糾錯(cuò)。當(dāng)一段時(shí)間內(nèi)第二次出現(xiàn)錯(cuò)誤時(shí),動(dòng)態(tài)糾錯(cuò)機(jī)制將持續(xù)開(kāi)啟漢明碼糾錯(cuò)。奇偶校驗(yàn)與漢明碼校驗(yàn)切換如圖8 所示,當(dāng)指示奇偶校驗(yàn)錯(cuò)誤的信號(hào)parity_err 第一次出現(xiàn)且讀請(qǐng)求rd_req 拉高時(shí),使能信號(hào)ecc_en 置1,漢明碼糾錯(cuò)執(zhí)行一次。同時(shí)計(jì)數(shù)器開(kāi)始計(jì)數(shù),當(dāng)計(jì)數(shù)器達(dá)到設(shè)定值而未出現(xiàn)第二次錯(cuò)誤時(shí),計(jì)數(shù)器停止計(jì)數(shù),first_err 置0,等待下一次奇偶校驗(yàn)錯(cuò)誤。當(dāng)計(jì)數(shù)器未到達(dá)設(shè)定值而出現(xiàn)第二次錯(cuò)誤時(shí),second_err 信號(hào)置1,同時(shí)計(jì)數(shù)器置0,漢明碼糾錯(cuò)常開(kāi)。當(dāng)?shù)谌五e(cuò)誤出現(xiàn)時(shí),計(jì)數(shù)器再次歸0,重新計(jì)數(shù)。若后續(xù)再無(wú)錯(cuò)誤出現(xiàn)且計(jì)數(shù)器達(dá)到設(shè)定值,first_err 以及second_err 置0,動(dòng)態(tài)糾錯(cuò)機(jī)制重新回到奇偶校驗(yàn)狀態(tài)并等待下一次錯(cuò)誤信號(hào)。圖8中還驗(yàn)證了當(dāng)計(jì)數(shù)器正好達(dá)到設(shè)定值時(shí)出現(xiàn)錯(cuò)誤的情況,可以看到,設(shè)計(jì)的模塊能夠正常工作。
圖8 奇偶校驗(yàn)與漢明碼校驗(yàn)切換
使用Synopsys 公司的綜合工具Design Compiler在中芯國(guó)際(SMIC)55 nm 工藝庫(kù)下對(duì)設(shè)計(jì)進(jìn)行綜合。表1 列出了采用擴(kuò)展?jié)h明碼校驗(yàn)與采用動(dòng)態(tài)糾錯(cuò)機(jī)制的關(guān)鍵路徑延時(shí)與動(dòng)態(tài)功耗。從表中可以看出,動(dòng)態(tài)糾錯(cuò)機(jī)制在延時(shí)上降低了7.49%,在動(dòng)態(tài)功耗上則降低了22.09%。延時(shí)上的降低是因?yàn)閯?dòng)態(tài)糾錯(cuò)機(jī)制將擴(kuò)展?jié)h明碼校驗(yàn)中的奇偶校驗(yàn)與漢明碼校驗(yàn)分開(kāi)到兩個(gè)時(shí)鐘周期進(jìn)行。而動(dòng)態(tài)功耗上的降低則是因?yàn)閯?dòng)態(tài)糾錯(cuò)機(jī)制僅在ECC 使能時(shí)才開(kāi)啟漢明碼校驗(yàn)。
表1 綜合結(jié)果
本文提出了一種基于擴(kuò)展?jié)h明碼的動(dòng)態(tài)糾錯(cuò)機(jī)制,能夠有效提高ECC 校驗(yàn)檢錯(cuò)階段的效率,減少無(wú)效檢錯(cuò)。本文主要對(duì)擴(kuò)展?jié)h明碼的原理進(jìn)行了闡述,并設(shè)計(jì)了基于擴(kuò)展?jié)h明碼的ECC 糾錯(cuò)模塊。同時(shí)進(jìn)一步闡明了動(dòng)態(tài)糾錯(cuò)機(jī)制的原理,完成模塊設(shè)計(jì),最后對(duì)設(shè)計(jì)進(jìn)行了仿真與分析。綜合結(jié)果表明,相比傳統(tǒng)擴(kuò)展?jié)h明碼校驗(yàn),該機(jī)制在延時(shí)與動(dòng)態(tài)功耗上有明顯降低。