程振洪 阮 航 熊庭剛
(武漢數(shù)字工程研究所 武漢 430205)
計算機(jī)系統(tǒng)離不開存儲設(shè)備支持,惡劣環(huán)境中的存儲設(shè)備的存儲性能易受影響甚至引發(fā)故障,直接導(dǎo)致計算機(jī)系統(tǒng)的崩潰。據(jù)統(tǒng)計,80%以上的系統(tǒng)崩潰問題均由存儲設(shè)備數(shù)據(jù)錯誤引起。近年來針對糾錯碼的研究推動了存儲容錯進(jìn)程[1]。文獻(xiàn)[2]針對硬件實現(xiàn)糾一檢二的編碼用于內(nèi)存保護(hù)時糾錯能力有限的問題,提出了一種軟硬件協(xié)同的EDAC(error detection and correction)檢錯糾錯方法。在硬件對水平方向的每個字進(jìn)行糾一檢二編碼的基礎(chǔ)上,該方法在軟件上對垂直方向的每個位片進(jìn)行奇偶編碼,并通過軟硬協(xié)同方式發(fā)現(xiàn)并糾正內(nèi)存位翻轉(zhuǎn)錯誤。該方法無需增加額外硬件開銷,相比純硬件EDAC 的可靠性有一定提高,不足之處是系統(tǒng)性能的開銷有所增加。漢明糾錯編碼在硬件容錯方向應(yīng)用廣泛,如文獻(xiàn)[3]提出一種基于[12,8]拓展?jié)h明編碼[4]的AES(Advanced Encryption Standard)硬件容錯設(shè)計方法。文獻(xiàn)[5]基于一套ECC加固的SRAM 可靠性評估體系,采用廣泛應(yīng)用的MTTF(平均無故障失效時間)作為可靠性依據(jù)。文獻(xiàn)[6]提出了基于閃存錯誤特征的聯(lián)合譯碼策略,并研究了面向閃存系統(tǒng)的多進(jìn)制LDPC 碼。文獻(xiàn)[7]針對內(nèi)存單粒子翻轉(zhuǎn)問題采用SEC-DED編碼進(jìn)行糾錯。文獻(xiàn)[8]用軟件實現(xiàn)SEC-DED 編碼,盡管多位錯誤翻轉(zhuǎn)出現(xiàn)概率不大,但仍是該可靠計算機(jī)設(shè)計不得不考慮的問題。除了存儲器本身出現(xiàn)的數(shù)據(jù)錯誤外,數(shù)據(jù)在片外傳輸通道上的信號衰變和損耗也會導(dǎo)致錯誤發(fā)生,故設(shè)計合適的糾錯編碼保證傳輸質(zhì)量十分重要[9]。另外,NAND 閃存的糾錯工作也是近年的研究熱點,多種編碼得到應(yīng)用,如二維漢明編碼[10],QC-LDPC碼[11],RS碼[12]。其他應(yīng)用場景,如存儲系統(tǒng)芯片級容錯[13]、光存儲糾錯[14]、云存儲容錯[15]也有研究。
采用軟件或者軟硬件結(jié)合的糾錯技術(shù)雖然能夠一定程度上滿足糾錯需求,但存在數(shù)據(jù)糾正效率較低,難以解決內(nèi)存在連續(xù)訪問模式下的數(shù)據(jù)糾錯問題,另外當(dāng)前涉及鏡像存儲結(jié)構(gòu)的可靠性研究十分稀少,本文針對此情況展開研究。
本文的SRAM 存儲容錯方案在硬件上采用鏡像內(nèi)存結(jié)構(gòu)。鏡像內(nèi)存采用兩片物理特性相同的內(nèi)存,通過添加額外的特殊控制電路,使得內(nèi)存的寫操作得以同時進(jìn)入兩片內(nèi)存。當(dāng)錯誤發(fā)生時,可以快速切換至備份內(nèi)存總進(jìn)行讀寫操作。鏡像內(nèi)存通過內(nèi)存熱插拔技術(shù),即使內(nèi)存出現(xiàn)物理性的永久損壞,也可以在系統(tǒng)運行時替換內(nèi)存。執(zhí)行替換后,再通過內(nèi)存間拷貝的方式,迅速從備份內(nèi)存中恢復(fù)有效,提高內(nèi)存系統(tǒng)的可靠性,從而達(dá)到延長系統(tǒng)無故障運行時間的目的。本文所采用的鏡像內(nèi)存系統(tǒng)原理框圖如圖1所示。
圖1 原理框圖中兩套物理上獨立的CPU 總線分別與存儲模塊A、B 連接,用于傳遞CPU 的讀寫事務(wù)和內(nèi)存反饋的數(shù)據(jù)信息??偩€協(xié)議解析/封裝模塊起到兩個作用:1)從CPU總線解析得到內(nèi)存訪問的類型、類型、數(shù)據(jù)信息;2)將讀取的內(nèi)存數(shù)據(jù)封裝成CPU 總線的協(xié)議。ECC 編碼模塊將CPU 總線寫入內(nèi)存的原始數(shù)據(jù)進(jìn)行ECC編碼處理,在其后添加校驗碼字段,形成ECC編碼字段。ECC解碼模塊將從內(nèi)存讀出的ECC編碼數(shù)據(jù)進(jìn)行解碼,解碼過程中按照ECC 規(guī)則進(jìn)行,如果數(shù)據(jù)校驗不通過,則在ECC 的糾錯能力范圍內(nèi)對錯誤數(shù)據(jù)位進(jìn)行糾正。如果錯誤個數(shù)超出糾錯能力范圍,就通告總線協(xié)議解析模塊,將錯誤信息反饋至CPU總線。內(nèi)存分兩部分:一部分是數(shù)據(jù)存儲顆粒,用于存儲數(shù)據(jù),即ECC 的信息碼;另一部分是校驗碼存儲顆粒,用于存放校驗數(shù)據(jù),即ECC的校驗碼。
圖1 鏡像內(nèi)存系統(tǒng)原理框圖
板間修復(fù)控制器用于應(yīng)對ECC 解碼模塊檢出數(shù)據(jù)錯誤,但無法將錯誤糾正的情況。一旦出現(xiàn)ECC解碼模塊不能糾正的錯誤,ECC解碼模塊通告板間修復(fù)控制器,板間修復(fù)控制器向另一存儲模塊發(fā)出修復(fù)請求,獲取相應(yīng)數(shù)據(jù)單元的正確數(shù)據(jù)。在獲取正確數(shù)據(jù)后,正確數(shù)據(jù)和其校驗碼將被存儲控制器重新寫入原出錯單元,完成覆蓋和糾正。
對于圖1 鏡像內(nèi)存系統(tǒng),當(dāng)內(nèi)存數(shù)據(jù)讀出時,ECC 解碼模塊會存在兩種可能性:第一種情況,數(shù)據(jù)位翻轉(zhuǎn)導(dǎo)致的錯誤在糾錯碼的糾錯能力范圍內(nèi),ECC解碼模塊可以糾正這類錯誤,并獲得正確的譯碼后數(shù)據(jù)交給總線協(xié)議封裝模塊進(jìn)行封裝;第二種情況,數(shù)據(jù)位翻轉(zhuǎn)導(dǎo)致的錯誤超出糾錯碼的糾錯能力范圍。此時,ECC 解碼模塊可能檢測到這類錯誤,并將這一錯誤通過信號傳遞給板間修復(fù)控制器。通過板間修復(fù)控制器,正確數(shù)據(jù)可以通過請求和應(yīng)答的握手方式由存儲模塊間的數(shù)據(jù)通道傳遞,完成對糾錯碼不可糾正錯誤的糾正工作。
根據(jù)圖1 所述鏡像內(nèi)存系統(tǒng)原理框圖,并結(jié)合自頂而下的數(shù)字邏輯設(shè)計思想,本文設(shè)計了如圖2所示的鏡像內(nèi)存系統(tǒng)邏輯頂層。
圖2 用于鏡像內(nèi)存的糾錯系統(tǒng)具有數(shù)據(jù)/地址總線、存儲模塊A、存儲模塊B,其中存儲模塊A 與存儲模塊B 具有相同的內(nèi)部結(jié)構(gòu),形成冗余關(guān)系。訪問類型指定內(nèi)存存儲陣列的訪問模式,如單次寫、單次讀、突發(fā)寫、突發(fā)讀;原始數(shù)據(jù)指定即將寫入內(nèi)存的數(shù)據(jù)流;無誤讀出數(shù)據(jù)指定從內(nèi)存單元讀出的經(jīng)過糾錯處理的正確數(shù)據(jù)流;交錯通道A-B與交錯通道B-A 實現(xiàn)存儲模塊A 與存儲模塊B 間的錯誤信息和正確數(shù)據(jù)片段的實時交換。另外,存儲模塊A與B結(jié)構(gòu)相同,可以替換使用。
圖2 鏡像內(nèi)存系統(tǒng)邏輯頂層
事件/數(shù)據(jù)緩沖單元實現(xiàn)了對訪問類型和原始數(shù)據(jù)的忙時緩沖和閑時釋放功能。當(dāng)糾錯控制核心處于數(shù)據(jù)糾錯、恢復(fù)的繁忙狀態(tài)時,事件/數(shù)據(jù)緩沖單元分別將訪問類型和原始數(shù)據(jù)緩存到一級事件緩存和一級數(shù)據(jù)緩存中。當(dāng)糾錯控制核心完成糾錯控制過程,只要一級事件緩存或一級數(shù)據(jù)緩存非空,則打開緩存使能,選擇器將選擇緩存類型和緩存數(shù)據(jù)分別作為事件輸入和寫入數(shù)據(jù)進(jìn)行輸出,從而提高下一個內(nèi)存訪問事務(wù)的處理速度。另外,如果糾錯控制核心空閑時這兩個一級緩存為空,則選擇器選擇訪問類型和原始數(shù)據(jù)作為事件輸入和寫入數(shù)據(jù),從而達(dá)到減少內(nèi)存訪問的延遲,提高內(nèi)存響應(yīng)速度的效果。
編碼觸發(fā)單元實現(xiàn)了對不同訪問類型的編碼和觸發(fā)功能。它的輸入為事件輸入,來自事件/數(shù)據(jù)緩沖單元。它的輸出為事件編碼,連至糾錯控制核心。ECC 編碼/譯碼單元實現(xiàn)對寫入數(shù)據(jù)的糾錯編碼和內(nèi)存讀出數(shù)據(jù)的糾錯譯碼。它的寫入數(shù)據(jù)來自事件/數(shù)據(jù)緩沖單元,即待編碼數(shù)據(jù),由它輸出的編碼數(shù)據(jù)連接數(shù)據(jù)修復(fù)存儲控制器及存儲陣列,是通過糾錯編碼處理后的結(jié)果。糾錯譯碼過程相反,待譯碼數(shù)據(jù)來自數(shù)據(jù)修復(fù)存儲控制器及存儲陣列,經(jīng)過ECC 編碼/譯碼單元譯碼后輸出譯碼結(jié)果交給糾錯控制核心處理。交錯修復(fù)單元實現(xiàn)存儲模塊間的錯誤字節(jié)碼、正確字節(jié)段的交換和數(shù)據(jù)修復(fù)功能的輔助功能。
司大愣子媳婦遇見我,悄悄地說:“嫂子我是過來人,你呀,還是離別呦呦遠(yuǎn)點,她是妖精,你小小年紀(jì),別被她吸干了?!?/p>
圖2 中糾錯控制核心采用狀態(tài)機(jī)設(shè)計實現(xiàn)。該狀態(tài)機(jī)在多個外部輸入條件的變化下,在不同的狀態(tài)間進(jìn)行跳轉(zhuǎn),并控制內(nèi)存控制器進(jìn)行各種操作,如內(nèi)存單次寫、內(nèi)存單次讀、內(nèi)存burst 讀。糾錯控制核心中重要的功能是多個出錯狀態(tài)的檢測和對應(yīng)的糾錯控制狀態(tài)。為了使糾錯控制的過程更加明白清晰,在此使用圖3 糾錯控制核心狀態(tài)機(jī)流程圖進(jìn)行解釋。
圖3 糾錯控制核心狀態(tài)機(jī)流程圖
糾錯控制核心狀態(tài)機(jī)的行為如下。
在IDLE 狀態(tài)下,等待各種類型內(nèi)存訪問事件的觸發(fā)。在WRITE狀態(tài)下,進(jìn)行單次/突發(fā)寫控制,指示內(nèi)存控制器將編碼數(shù)據(jù)寫入存儲陣列。在SINGLE_READ狀態(tài)下,進(jìn)行內(nèi)存單次讀控制,指示內(nèi)存控制器將待譯碼數(shù)據(jù)從存儲陣列讀出。在ECC_CHECK 狀態(tài)下,單次檢查ECC 譯碼單元輸出的錯誤字節(jié)碼。在LOCAL_FIX 狀態(tài)下,控制本模塊內(nèi)存數(shù)據(jù)修復(fù)過程,修復(fù)數(shù)據(jù)來自與之通過交錯通道連接的另一存儲模塊。在OTHER_FIX 狀態(tài)下,將本模塊譯碼數(shù)據(jù)通過交錯通道交給與之連接的另一存儲模塊,以滿足其他存儲模塊數(shù)據(jù)修復(fù)需求。在BURST_READ 狀態(tài)下,進(jìn)行內(nèi)存突發(fā)讀,按照設(shè)定的突發(fā)長度管理內(nèi)存控制器從存儲陣列中連續(xù)讀數(shù)。在BURST_CHECK 狀態(tài)下,連續(xù)檢查ECC 譯碼單元輸出的錯誤字節(jié)碼。在BURST_FIX狀態(tài)下,控制交錯修復(fù)單元在兩個存儲模塊間交換錯誤字節(jié)碼,并將對方錯誤字節(jié)碼對應(yīng)所需的正確字節(jié)片段進(jìn)行互換,最后在各自存儲模塊通過內(nèi)存控制器寫入修復(fù)數(shù)據(jù)完成數(shù)據(jù)修復(fù)。
為了提高系統(tǒng)存儲的可靠性,針對每個字節(jié)增加了5位監(jiān)督碼元,構(gòu)成了13位的漢明編碼。漢明編碼可以糾正存儲字最多出現(xiàn)1 位錯誤,同時可以檢出2 位錯誤,即俗稱的“糾一檢二”。令p 為單個位出錯概率,并假設(shè)各個位的故障是獨立的,提供了系統(tǒng)可靠性的上界。在這種情況下,可以容忍每個字一個故障。通過排列組合可以得到無錯誤概率Pno_error,一位錯誤概率Pone_error,兩位錯誤概率Ptwo_error,如下所示。
通過漢明編碼提高存儲可靠性的原理可以通過以下公式證明:
這表明,通過向1 字節(jié)增加5 位監(jiān)督碼元構(gòu)成的漢明編碼比無糾錯編碼的原始字節(jié)數(shù)據(jù)的正確概率高。若系統(tǒng)使用的存儲為16MB(含監(jiān)督碼元)的靜態(tài)存儲器,根據(jù)《電子設(shè)備可靠性預(yù)計手冊》,查表可得該靜態(tài)存儲器的整體失效率:
現(xiàn)在需要根據(jù)整體失效率得到單bit 失效率,根據(jù)單bit 失效率繼續(xù)求得無錯、單錯、雙錯概率,繼而得出ECC 功能下的存儲失效率。根據(jù)統(tǒng)計規(guī)律,充分的數(shù)據(jù)表明,整個芯片失效這一方式對大部分芯片來說不是主要失效方式,個別位、行、列失效才是導(dǎo)致芯片失效的主要原因,因此有理由使用單個位失效模型SBFM(Single Bit Failure Mode)進(jìn)行存儲失效性分析。該模型假設(shè)單個位的失效是獨立事件,并且每個位單元都遵循指數(shù)失效規(guī)律,其失效率為λb,可靠度函數(shù)為Rb( )t ,每n個位組成一個字,存儲器一共有w 字。根據(jù)可靠性函數(shù)與MTTF的關(guān)系:
即:
經(jīng)過整理,得到:
為了在系統(tǒng)可靠性模型分析中使用單存儲模型失效率參數(shù)λsingle和雙存儲模型的失效率參數(shù)λdouble,必須分情況求解存儲器的整體失效率。單存儲模型和鏡像存儲模型下的失效率:
在式(13)中,有:
在式(12)與式(13)中,n為13,w是存儲器總字?jǐn)?shù),經(jīng)計算得到:
根據(jù)式(12)與式(13)計算所得結(jié)果,證實本文采用的SRAM 容錯存儲方法在可靠性方面較未采用ECC 和存儲鏡像技術(shù)的方案均有明顯提升。其中,含ECC 的單存儲模型可靠性提高了大約22 倍,而鏡像存儲模型則比單存儲模型的可靠性高三個數(shù)量級。
針對SRAM 的數(shù)據(jù)糾錯問題,本文提出一種基于漢明編碼的鏡像存儲糾錯方法,在漢明編碼提供每個字節(jié)可糾正一位錯誤的基礎(chǔ)上,利用兩個SRAM 存儲間數(shù)據(jù)片段共享的特征,建立數(shù)據(jù)交換信道,從而提高了糾錯能力的提高。理論分析也表明,該方法較未采用ECC和存儲鏡像技術(shù)的方案均有明顯提升。今后的工作可以進(jìn)一步研究存儲數(shù)據(jù)恢復(fù)技術(shù)對于可靠性的影響,用馬爾可夫建模方法評估分析,并用實驗方法對可靠性進(jìn)行驗證。