喬冰濤,吳旭凡,劉海靜,王 正,董業民
(1.信息功能材料國家重點實驗室(中國科學院 上海微系統與信息技術研究所),上海,200050;2.材料與光電研究中心(中國科學院大學),北京 100049)
星載電子系統容易受到空間高能粒子、質子和中子的影響發生單粒子效應(Single Event Effect,SEE),從而產生軟錯誤,在大規模集成電路芯片系統中,靜態隨機存儲器(Static Random Access Memory, SRAM)約占一半以上的面積[1],系統中出現的錯誤絕大部分也與存儲器有關.因此,對存儲器單元進行加固是降低集成電路系統軟錯誤率(Soft Error Radio,SER)的重要途徑之一[2-3].
隨著半導體工藝節點的不斷降低,SRAM對SEE更加敏感.當集成電路尺寸降低到深亞微米(<0.18 μm)以下時,存儲器內受單粒子翻轉(Single Event Upsets, SEU)的影響不會明顯增加,而是逐漸趨于飽和[4].但是由于工藝節點的降低,相同面積內擺放了更多的存儲單元,使得存儲器發生多位翻轉(Multiple Bits Upset, MBU)的概率大大增加[5-6].
為了提高SRAM單元抗SEE的能力,常用的加固方法可以分為兩種,一種為工藝加固,另一種為設計加固.工藝加固主要采用SOI或者GaAs工藝[7-8],能夠取得很好的抗輻射效果;設計加固主要可以分為電路級、版圖級和系統級加固.電路加固通過加入反饋電路來維持存儲節點電容上的電荷值來增強抗輻射效果,如雙互鎖存儲單元(Dual Interlocked storage Cell, DICE)結構[9];版圖加固通常采用版圖交錯技術[10],它把不同字上的位單元分配成在物理版圖上相鄰的單元,從而避免同一個字上的多個位單元同時發生翻轉,但是這種方法會使得存儲器布線增長,當交錯位數變多時,上述問題會更加明顯.系統級加固主要采用檢錯糾錯(Error Detection And Correction, EDAC)技術,常用的EDAC編碼有漢明碼[11]、BCH碼[12]和RS碼[13].漢明碼譯碼電路比較簡單,但是只能糾正一位翻轉或者檢測出兩位翻轉;BCH碼和RS碼可以修正存儲器中出現的多位翻轉,但是他們的編碼和譯碼電路比較復雜[14-15],需要以查找表的方式處理高階域的乘法運算,具有較大的電路延遲.
因此,本文針對系統級加固提出一種雙模冗余漢明(Dual Modular Redundancy Hamming,DMRH)碼,它能夠修正存儲器中出現的一位翻轉和兩位翻轉,且電路延遲小于兩位修正能力的BCH碼.
漢明碼基本原則是在n位原碼的基礎上插入k位的校驗碼,校驗碼依據漢明碼編碼規則生成,記錄了原碼的部分信息,能夠在所存儲的數據中出現一位翻轉時對錯誤進行修正[16-17],其中n與k的關系式為
2k≥n+k+1.
(1)
在需要讀取所存儲的n+k位數據之前,依據漢明碼的解碼規則,生成k位狀態碼(記為S0~Sk-1).若所存儲的數據中未發生翻轉,S0~Sk-1每一位狀態碼的值均為0;若數據在存儲過程中發生了一位錯誤,出錯位置不同,狀態碼的值也將不同.因此,可以根據狀態碼的值確定翻轉的位置,對錯誤進行修正.
此外,在漢明碼的基礎上再增加一位校驗位(記為Pk)就可實現糾一檢二的功能.在漢明碼編碼階段,Pk生成式為將n+k位數據進行異或運算.
在需要讀取所存儲的n+k+1位數據之前,使用所讀出來的n位原碼與k+1位校驗碼相異或,得到k+1位的狀態碼(記為Sk).在糾一檢二漢明碼中,若Sk的值為0,同時S0~Sk-1全為0,則代表所存儲數據內未發生翻轉;若Sk的值為1,則代表所存儲數據中出現了一位翻轉;若Sk的值為0,同時S0~Sk-1不全為0,則代表數據中出現了兩位翻轉.
在表1中,假設k=4,說明狀態碼與錯誤類型對照關系.表中記S0~Sk-1為St,××××為不等于0000的值.

表1 狀態碼與錯誤類型對照表
在漢明碼解碼模塊內定義信號兩位翻轉標志位S_2err_flag,則其生成關系式為
S_2err_flag=(Sk=0&&St≠4′b0000)?1′b1:1′b0.
(2)
當數據中出現兩位翻轉時,S_2err_flag值為1;否則該值為0.
為了提高SRAM單元抗MBU的能力,本文在前節糾一檢二漢明碼的基礎上,提出了一種雙模冗余漢明碼.DMRH碼各模塊說明如下:
1.2.1 編碼模塊
DMRH碼編碼模塊如圖1所示,輸入數據將首先經過優化后的漢明碼編碼模塊.與前節不同的是,在優化后的編碼模塊內,通過將P0~Pk-1的生成式代入Pk的生成式,將原來n+k位的異或運算進行了化簡,有效降低了電路的延遲.

圖1 雙模冗余漢明碼編碼電路
之后添加了雙模冗余模塊對k+1校驗碼做處理,得到2(k+1)位校驗碼與n位原碼組成加固后的數據,作為雙模冗余漢明碼編碼模塊的輸出.
1.2.2 解碼模塊
DMRH碼解碼模塊如圖2所示,待解碼的數據包括原碼與兩份校驗碼(分別記為P0和P1).
依據漢明碼的解碼規則對校驗碼P0和原碼做處理得到修正后數據OUT0和兩位錯誤標志位S0_2err_flag;由校驗碼P1和原碼得到修正后數據OUT1和兩位錯誤標志位S1_2err_flag;MUX模塊將依據S0_2err_flag和S1_2err_flag的值從OUT0和OUT1中選擇正確的數據作為輸出.

圖2 雙模冗余漢明碼解碼電路
如表2所示,記原碼為D,當所存儲的數據中出現一位翻轉到兩位翻轉時,修正后的數據為OUT0和OUT1,兩位翻轉標志位為S0_2err_flag和S1_2err_flag,表中共有9種不同的翻轉類型.可以看到當兩位翻轉標志位為0時,解碼得到的數據是正確的.
因此,我們可以依據兩位翻轉標志位選擇正確的數據作為解碼模塊的輸出.但是,當兩位翻轉同時發生在數據位D內時,兩位翻轉標志位同時為1,此時,并不能從OUT0和OUT1內獲得正確的數據作為解碼模塊的輸出.
1.2.3 版圖分割技術
為了進一步提高DMRH碼的可靠性,本文依據版圖分割技術對校驗碼與原碼排序,消除了兩位翻轉同時發生在原碼D內的情況.排序的基本原則為每兩位原碼之間至少要有一位校驗碼間隔.因此n與k還應該有關系為
n≤2k+3.
(3)
當高能粒子引起所存儲的數據中發生兩位翻轉時,采用版圖分割技術后,可能翻轉的位置會出現以下3種情況:
a)翻轉的是P0內一位校驗碼和一位原碼D;
b)翻轉的是P1內一位校驗碼和一位原碼D;
c)翻轉的是兩位校驗碼.
由表2可知,a情況對應表內序號6的情況;b情況對應表內序號5的情況;c情況對應了表內序號4、7和8對應的情況.以上情況均可以通過S0_2err_flag和S1_2err_flag的值從OUT0和OUT1中選擇出正確的數據作為DMRH碼的輸出.因此,本文所設計的MUX模塊解碼流程如圖3所示.

表2 一位翻轉與兩位翻轉輸出結果分析
由于版圖分割技術消除了兩位翻轉同時出現在原碼D內的情況,S0_2err_flag和S1_2err_flag不會同時為1.本文選用S0_2err_flag作為判定條件,當該值為1時,標志原碼D與校驗碼P0內出現了兩位錯誤,解碼后得到的OUT0時錯誤的,此時應選擇OUT1作為輸出;同理,當該值為0時,選擇OUT0作為輸出.
本節在糾一檢二漢明碼的基礎上設計了兩位修正能力的DMRH碼.接下來本文以原碼n=8為例,實現該修正碼.
當原碼為8位時(記為D0~D7),依據DMRH碼的編碼規則,需要10位校驗碼,其生成方式為

圖3 雙模冗余漢明碼解碼流程圖
P0[0]=D0^D1^D3^D4^D6,
P0[1]=D0^D2^D3^D5^D6,
P0[2]=D1^D2^D3^D7,
P0[3]=D4^D5^D6^D7,
P0[4]=D0^D1^D2^D4^D5^D6,
P1[0]=D0^D1^D3^D4^D6,
P1[1]=D0^D2^D3^D5^D6,
P1[2]=D1^D2^D3^D7,
P1[3]=D4^D5^D6^D7,
P1[4]=D0^D1^D2^D4^D5^D6.
(4)
式中,^為異或運算.
P0[4]和P1[4]分別為D0~D7、P0[0]~P0[3]和P1[0]~P1[3]的異或運算的化簡結果,使得原來的12位數據相異或減少到了6位相異或,有效減小了電路的延遲.
當輸入的8位原碼經過漢明碼編碼模塊后,若按照圖4(a)的順序存入存儲單元,那么當高能粒子所引起的兩位翻轉全部出現在原碼D內時,會影響解碼后數據的正確性.
因此采用版圖分割技術把原碼D與校驗碼P0、P1排序,基本原則為每兩位原碼之間至少要有一位校驗碼間隔.使用版圖分割法后,當原碼為8時,版圖結構如圖4(b)所示.

圖4 (a)未采用版圖分割技術的8位寬度字的版圖結構;(b)采用版圖分割技術的8位寬度字的版圖結構
可以看到,當所存儲數據在高能粒子影響下發生兩位翻轉時,有可能發生以下3種情況:
a)一位原碼和P0內一位校驗位翻轉;
b)P0內一位校驗位與P1內一位校驗位翻轉;
c)P1內一位校驗位和一位原碼翻轉.
由表2可知,以上3種情況分別對應表內序號6、序號4和序號5代表的情況,可以結合兩位錯標志位的值從OUT0和OUT1選擇正確的數據作為輸出.
當需要從存儲器中讀取數據時,記存儲器內讀出的數據分別為D′、P0′和P1′,接下來需要按照漢明碼的解碼規則生成對應的狀態碼.
由讀出的數據D′和P0′生成的狀態碼S0為
(5)
在得到狀態碼S0的值后,依據漢明碼解碼規則可得翻轉數據發生的位置,進而得到修正后的數據OUT0,同時可得兩位錯誤標志位S0_2err_flag的值,其生成關系式為
S0_2err_flag=(S0[4]=0 &&S0[3:0]≠4′b0000)?
1′b1:1′b0,
(6)
由讀出的數據D′和P1′生成的狀態碼S1為
(7)
在得到狀態碼S1的值后,依據漢明碼解碼規則可得翻轉數據發生的位置,進而得到修正后的數據OUT1,同時可得兩位錯誤標志位S1_2err_flag的值,其生成關系式為

(8)
最后,依據S0_2err_flag和S1_2err_flag的值,從OUT0和OUT1里面選擇出正確的數據作為輸出,其具體流程如圖3所示.
在解碼電路的設計中,本文通過分析存儲器內發生兩位翻轉的情況,發現當翻轉位置不同時,可以依據狀態碼中兩位錯誤標志位的值來判定數據中發生翻轉的位置,之后結合版圖分割技術完成了解碼電路算法的設計.
雙模冗余漢明碼測試系統的電路如圖5所示,為了驗證它的糾錯能力,添加了錯誤注入單元,用于向存儲器中讀出的數據中注入錯誤.在Test_en為0時,為正常工作模式,從存儲器內讀出的數據不作任何處理,直接交給解碼模塊解碼.當Test_en為1時,進入測試模式,從存儲器內讀出的數據與測試變量err相異或,對數據進行修改.之后,再把修改后的數據交由解碼模塊解碼.若解碼后的數據與寫入的數據一致,則認為加固方法有效,可以修正所存儲數據中出現的兩位錯誤.

圖5 雙模冗余漢明碼測試系統
字長為8位的DMRH碼的仿真結果如圖6所示,在Test_en有效后,通過err與加固后的數據相異或,向數據中注入錯誤.在時間段T0內,讓(D3、P0[4])所存儲的信息翻轉,此時S0_2err_flag為1,選擇OUT1作為輸出,解碼后得到的數據與原碼相同.在時間段T1內,分別仿真了向(P0[4]、P1[0])與(P1[0]、D4)注入錯誤的情況,均得到預期的效果.最后遍歷了所有可能的一位翻轉與兩位翻轉的情況,仿真結果表明,DMRH能夠修正數據中出現的錯誤,本文提出的加固方法是有效的.
當工藝節點降低到130 nm時,大量試驗數據表明其產生兩位翻轉的次數占總翻轉次數的1%左右,三位翻轉的次數占總翻轉次數的0.1%左右[18].因此,相比于一位修正的漢明碼,使用兩位修正能力的DMRH碼能夠提高存儲單元的可靠性.

圖6 雙模冗余漢明碼仿真結果
在本文中,共設計了三種DMRH碼,分別對應字長為4、8和11,與其他修正碼的面積、功耗和延遲參數對比如表3所示.以漢明碼為參考,字長為4、8和11的DMRH碼的電路延遲分別是漢明碼的85%、89%和96%,低于兩位修正能力的BCH碼.
本文提出了一種雙模冗余漢明碼,它能夠抑制存儲單元中出現的兩位翻轉.首先,對漢明碼編碼模塊進行邏輯優化,有效減少了編碼電路的延遲,再把該模塊生成的校驗碼進行雙模冗余處理,作為雙模冗余漢明碼編碼模塊的輸出.之后依據漢明碼解碼規則分別對每份校驗碼與原碼的組合進行處理,通過分析發現當兩位翻轉未同時發生在原碼內時,可以依據兩位錯誤標志位的值得到正確的輸出.最后,采用版圖分割技術有效抑制了兩位原碼同時翻轉的情況,進一步提高了存儲器的可靠性.與其他的兩位錯誤修正碼相比,本文提出的DMRH碼具有較低的電路延遲.

表3 修正電路的面積、功耗延遲參數列表