王番 施敏華 常亮
(1 中國科學院微小衛星創新研究院,上海 201210)(2 中國科學院大學,北京 100049)(3 上海微小衛星工程中心,上海 201210)
靜態隨機存儲器(SRAM)型現場可編程門陣列(FPGA)在星上的應用非常廣泛,但由于工藝原因,該類器件在空間環境下,易受到空間高能粒子的輻射,發生單粒子翻轉(Single-Event Upsets,SEU)等問題。而FPGA依靠存儲在配置存儲單元里的配置數據,實現其邏輯功能。所以如果配置存儲單元發生單粒子翻轉,可能會使FPGA無法實現預期的功能,造成嚴重后果。
為了解決SRAM型FPGA單粒子翻轉問題,國內外都做了很多相關研究。最直接的是對器件的制造工藝上增加抗輻照處理。除了工藝層面,常見的解決方法還有三模冗余(Triple Modular Redundancy, TMR)技術,即將電路復制為三份,再通過多數表決器對電路結果進行比較[1]。TMR雖然提高了設計的可靠性,但是相應的也會增加面積和功耗。除此外,若多數表決器電路發生單粒子翻轉,則會造成嚴重故障。鑒于此,文獻[2]根據SRAM型FPGA可重配置特性提出了對配置存儲器進行刷新(Scrubbing)的方法,可以在不中斷用戶設計運行的情況下直接修復配置內存。常見的刷新可分為外部刷新和內部刷新[3]。外部刷新接口通常使用SelectMAP模式,它一般是將刷新控制電路放在抗輻照的反熔絲FPGA中,并將原始比特流文件存儲在外部flash或prom存儲器中[4]。外部刷新常用的手段有定時刷新或回讀檢測刷新。定時刷新是按事先設定好的時間間隔對整個配置幀進行刷新[5]。這類刷新需要較大的存儲空間來存儲原始比特流文件,而且它的刷新速率較慢,受到配置時鐘頻率和比特流文件大小的限制。文獻[6]中采用回讀檢測刷新,對FPGA的配置數據進行回讀并檢測是否出現SEU,若出現則重新加載原始比特流[7],該方法設計復雜加載耗時。之后文獻[8]中提出了動態部分重構刷新方法,首先對配置數據進行糾錯編碼(Error Correcting Code,ECC),之后以幀為單位對配置數據進行回讀以及ECC校驗,如果校驗錯誤,則對該幀進行重新刷新。外部刷新可靠性高,但是設計復雜,而且需要額外的存儲器和控制芯片。內部刷新是通過內部配置訪問接口(Internal Configuration Access Port, ICAP),對FPGA進行回讀,之后經過ECC校驗,判斷是否出錯,最后進行重寫。文獻[9]提出在關鍵電路上通過復制與比較進行位置感知,從而降低冗余度,提高了內部刷新速率。而文獻[1]通過提取比特流的必要位減少回讀刷新時間,再通過控制刷新次數來提高系統的可靠性。對比外部刷新,內部刷新無需外部額外的芯片,所以系統更加簡潔,配置速度也更快。文獻[10]中將內部刷新與外部刷新方法相結合,既保留了外部刷新的高抗輻照性,又利用內部刷新提高了刷新速度,但該方法設計十分復雜,不易實施。
傳統的內部刷新電路是通過ICAP回讀配置幀后,再通過內置的糾錯電路FRAME_ECC進行檢錯糾錯。該系統結構存在的主要問題是刷新控制邏輯以及ECC校驗電路也會有可能受到輻射影響出現單粒子翻轉現象,而且內置的ECC校驗電路只能校驗糾正1 bit翻轉,檢測2 bit翻轉,無法對多位翻轉進行檢驗。鑒于以上分析,本文在此類傳統的內部刷新電路基礎上,提出對刷新電路增加三模冗余加固處理,并設計了新的檢驗糾錯系統,最高可支持對3位翻轉的檢錯糾正。
目前傳統的內部刷新方案,其刷新控制電路部分沒有進行抗單粒子加固,但刷新控制電路內部同樣可能會出現單粒子翻轉問題。一旦該部分電路出現問題,則可能會導致刷新系統紊亂,從而引起系統故障。系統造成很嚴重的影響。所以本文針對該問題,提出對刷新控制電路模塊部分增加三模冗余加固設計。同時對糾錯碼進行研究,提出糾錯能力更強的糾錯碼。針對以上所做出的改進,對系統可靠性產生的影響進行了如下分析。
最常用的檢錯糾錯手段是利用Xilinx公司提供的FRAME_ECC。FRAME_ECC是Xilinx官方提供的內嵌于配置存儲器的檢錯糾錯電路[11]。它采用的編碼方式是13位漢明碼,在系統上電時,會計算初始各個配置幀對應的ECC值,并對其進行存儲。之后一旦發現與原始存儲的ECC值不一致則判定為出現故障,便可及時對不一致處修復,解決單比特翻轉。但是它只能做到對單個比特位翻轉進行糾正,可以檢測2比特位翻轉并發出警告。而隨著FPGA設計越來越復雜,電路越來越集中,造成連續多比特翻轉的現象越來越多。所以傳統的FRAME_ECC糾錯碼已經不滿足需求。由此提出可以實現多位糾錯的里德-穆勒碼(Reed-Muller,RM)[12]。RM碼里的編碼方案是由Muller在1954年提出的,同年,Reed又提出了相應的解碼方案,由此構成了完整的RM碼。RM碼由于其延時較低的特性,被廣泛應用在星載計算機的信息傳輸上。
假設存在整數m和r,使得在0≤r≤m時,存在一個r階RM碼,并且其對應的二進制碼長l為2m,便將此時的RM碼記為RM(r,m)[13-14],可得
l=2m
(1)
(2)
dmin=2m-r
(3)
(4)
式中:l為二進制碼長;k為階數;dmin為最小碼距;b為最大可以糾正的錯誤位數。取r=2,m=5,則dmin=8,b=3。所以由此可以得出RM(2,5)糾錯碼可以實現對3位錯誤比特位的糾正,這比常用的FRAME_ECC糾錯碼的糾錯能力要強。
RM(2,5)碼編碼時,假設輸入數據的位寬為16 bit,那么輸出數據位寬是32 bit。由以上分析可知,RM碼中存在5個變量,將這5個變量設為a1,a2,…,a3,并定義編碼因子Q=(1,Q1,Q2),其中
Q1=(a1,a2,…,a5)T
(5)
Q2=(a1a2,a1a3,…,a4a5)T
(6)
將編碼因子Q與待編碼的輸入數據進行按位異或后,即可得到編碼后的輸出數據。
RM(2,5)碼譯碼過程需要分為3個過程,假設待譯碼的數據為data_out[31∶0],譯碼后的數據表示為data_decode[15∶0]。首先計算譯碼后的低十位data_decode[9∶0]。低十位中的每一位需要通過8位的校驗和確定。以data_decode[0]為例,在得到8位校驗和后,若其中0的個數大于1的個數,則data_decode[0]=0,反之為1,若二者相等,則說明發生了4 bit以上翻轉,該位出現錯誤。
C0,n=data _out[31-4n]+data_out[30-4n]+data_out[29-4n]+data_out[28-4n]
(n=0,1,…,7)
(7)
Dn=data _out[n]-[data_decode[9∶0]]Q2
(n=0,1,…,31)
(8)
計算data_decode[14∶10],該部分由16 bit校驗和決定,首先根據式(8),得到中間變量Dn,根據這個中間變量由高位到低位,相鄰兩位兩兩相加,可得到16 bit校驗和C′。
(9)


圖1 RM(2,5)碼解碼過程
沒有做任何抗單粒子舉措的SRAM型FPGA,其可靠性R隨時間t變化的曲線服從泊松分布[15]
R(t)=e-λt
(10)
式中:λ為單粒子翻轉概率。TMR兩個及兩個以上模塊正常運行,則系統正常,所以增加了TMR保護措施的FPGA,其可靠性為
R(t)=3e-2λt-2e-3λt
(11)
NASA通過粒子束來模擬高能粒子,并對器件進行輻射,以此得到了器件單粒子翻轉的概率λ大約為1.1×10-6bit/d[16]。根據此值,通過Matlab軟件仿真,可以得到未加抗單粒子保護措施以及增加TMR后,對應的可靠性變化曲線,如圖2所示。從中可以看出增加TMR后的可靠性明顯增強。

圖2 可靠性對比(未加任何緩解SEU措施、增加TMR)
設輸入輸出位寬為n,則增加了FRAME_ECC糾錯碼的系統,其可靠性為
(12)
而采用RM(2,5)糾錯碼的系統可靠性為
(13)
圖3顯示了未加任何糾錯碼,使用FRAME_ECC糾錯碼以及RM(2,5)碼三者分別對應的可靠性曲線,從中可以看出適用了RM(2,5)糾錯碼的可靠性最高,FRAME_ECC碼次之,未使用任何糾錯碼的可靠性最低。

圖3 可靠性對比(未加任何糾錯碼、 FRAME_ECC以及RM碼)
本文提出基于內部刷新的抗SEU系統框如圖4所示,主要包括刷新器(scrubber)、ICAP接口,待測試模塊DUT(Design under test,即為實際應用中用戶所設計的功能電路),其中scrubber主要包含刷新控制模塊、地址產生模塊、ICAP接口控制模塊、RAM存儲器以及糾錯模塊,糾錯模塊采用的是RM(2,5)糾錯碼。同時因為scrubber自身所在電路同樣可能被高能粒子輻射出現單粒子翻轉問題,所以為了降低該部分電路出現故障的可能性,在此系統中特別提出對scrubber模塊進行三模冗余加固,提高了scrubber容錯率,同時也增加了系統的可靠性。

圖4 系統結構
1)地址產生模塊
地址產生模塊的主要功能是提供檢錯以及糾錯所需要的幀地址。無論是對FPGA進行初始化還是刷新操作,都需要以幀的形式回讀配置數據,所以首先必須知道存儲的配置數據所對應的幀地址。在對當前幀檢錯糾錯完成后,地址產生模塊會生成下一幀數據的地址。如果在此過程中,scrubber中任何一個冗余模塊出現單粒子翻轉,地址產生模塊將會把幀地址改為scrubber模塊的初始地址,以此完成對scrubber模塊的刷新操作。這樣就可以避免由于錯誤累積,導致多個冗余模塊同時出現故障,導致整個電路出錯。
2)ICAP接口控制模塊
ICAP是FPGA內部的專用接口,可以通過例化其原語進行使用。ICAP接口控制模塊要嚴格遵循Xilinx公司規定的ICAP接口讀寫時序進行操作。因此該模塊的主要功能是根據時序要求,向ICAP接口發送讀寫使能以及幀地址,已完成對配置數據的讀寫。ICAP數據接口data信號主要的來源有3種:①根據Xilinx提供的配置手冊,在通過ICAP讀寫之前都需要先發送配置命令;②由地址產生模塊提供的幀地址;③RM檢錯糾錯模塊檢查到回讀到的數據發生了SEU后,對數據進行糾正,糾正后的數據需要重新通過ICAP寫入原始幀。
3)糾錯模塊
糾錯模塊主要功能是對回讀的數據進行檢查并判斷是否存在單粒子翻轉,若翻轉則進行糾正。在此采用的糾錯碼為RM(2,5)碼,最多對連續3位單粒子翻轉進行糾正,可檢測連續4位翻轉但無法修復。回讀的數據經過糾錯模塊內的編碼單元后,存儲到塊狀存儲器(BRAM)中,之后再從BRAM中讀出并經過譯碼單元判斷是否出錯,若出錯位數低于3位,譯碼單元可直接進行糾正,若超過3位錯誤,則會給出錯誤信號error_status[1∶0],00表示無錯誤出現,01出現了3位以下錯誤且進行了糾正,10表示出現4位翻轉,11表示4位以上的翻轉。10以及11狀態都無法對翻轉直接進行糾正。
4)刷新控制模塊
刷新控制模塊作為整個scrubber的核心模塊,通過發送各種指令信息控制其他子模塊的運行。主要指令包括開始生成幀地址指令、開始讀寫配置數據指令等。刷新控制模塊收到由上位機發來的刷新開始命令后(scrub_start),首先向地址產生模塊發送幀地址生成命令(frame_addr_gen_start),在收到地址產生模塊返回的幀地址生成完畢的信號后,向ICAP接口控制模塊發送回讀配置數據(start_rb)指令。待糾錯模塊對回讀的數據檢錯糾錯完畢后,刷新控制模塊會重新控制地址產生模塊生成下一幀地址。如果糾錯模塊是4位以上的翻轉,系統無法修復,刷新控制模塊會關閉所有使能來暫停系統工作。以上整個過程中如果scrubber冗余模塊存在錯誤,會立刻關閉所有操作,并將地址產生模塊的初始幀地址切換為scrubber,重新開始對scrubber進行刷新。
如前文所述,scrubber所在電路會受到高能粒子輻射,發生單粒子翻轉。而傳統的內部刷新電路并沒有對scrubber進行加固措施。為了解決這個問題,本文提出對scrubber進行三模冗余加固措施。但冗余模塊仍會出現單粒子翻轉,若翻轉后不進行維護,隨著錯誤累積,可能會出現多個冗余模塊同時出現故障,而此時多數表決器誤將多個出錯冗余塊產生的輸出作為正確結果,進行表決,這會引起scrubber模塊輸出錯誤,從而導致系統出錯。鑒于此,本文對每個三模冗余部分增加錯誤判斷信號,若該信號有效,則說明冗余模塊其一出現了故障,那么地址產生模塊會將刷新地址改為scrubber初始地址,對整個scrubber模塊進行刷新,以此達到避免錯誤積累的目的。經過三模冗余加固后的scrubber如圖5所示。對其中的錯誤判決器輸入輸出真值表經過化簡后,可得到其電路如圖6所示。

圖5 三模冗余結構

圖6 錯誤判決器電路圖
FPGA在布局布線時,開發工具往往會傾向于將各個模塊集中分布,這不利于我們確定DUT以及scrubber分別對應的起始幀地址。所以本文提出利用PlanAhead軟件中的Pblock工具對兩個模塊的分布位置進行調整。在進行布局布線時,對scrubber與DUT分布的位置進行手動的調整與約束,以此來將兩個模塊布局布線分隔開。這樣在調整之后,可以根據FPGA幀地址排布規律,就可以得到scrubber以及DUT分別對應的起始幀地址,之后可根據需要,將刷新的幀地址切換到DUT或者scrubber模塊。
綜上所述,整個內部刷新系統的工作流程如圖7所示。首先對系統進行初始化配置,之后將刷新使能信號拉高,進入刷新狀態,然后地址產生模塊開始產生幀地址。ICAP接口控制模塊根據幀地址回讀對應的配置數據,將幀地址以及讀寫命令序列發送至ICAP接口。糾錯模塊對回讀到的配置數據進行檢查,若正確則繼續判斷scrubber是否出錯,繼而繼續產生下一幀地址;若3位以下發生翻轉,糾錯模塊糾錯后再寫入對應的幀地址,然后開始下一幀讀寫。如果發生3位以上的翻轉,糾錯模塊無法恢復,那么系統要停止工作,重新對系統進行初始化。在以上過程中,若scrubber冗余模塊發生錯誤,則將幀地址切換到scrubber的初始地址,系統進入到對scrubber進行刷新的狀態。

圖7 系統工作流程
本文在xilinx公司推出的kintex-7系列的XC7K325TFFG676芯片上,對上述提出的系統進行實驗仿真。DUT模塊首先選擇為常用的4位加法器,除此外,為了更貼合實際情況,還從IWSL2005基準電路中選取3種不同的電路用作與DUT模塊,這3個電路分別代表著不同的應用領域,其中一個為組合邏輯較多的算術電路(FPU),另一個為時序邏輯較多的控制電路(MEM_CTRL),最后一個既包含算術電路又包括控制電路(USB_FUNC)。以4輸入加法器作為DUT模塊為例,進行邏輯綜合,圖8中(a)為由vivado工具自動布局布線后的結果,圖中紅色部分是DUT模塊布局布線所在區域,從中可以看出DUT與scrubber模塊沒有很明顯地被分割開。圖8(b)為使用pblock工具調整后的布局布線圖,從中可以看出經過調整布局后,可以將DUT與其他模塊分布位置分割開。同時可以得到DUT分布是在FPGA的下半部分,第2行30列的第0幀到第42幀。那么根據FPGA幀地址排列規則以及DUT所在的行和列位置信息,可以得到DUT的有效幀地址是0x110f00-0x110f2a。由此可以很方便地對DUT幀的起始位置進行定位。

圖8 布局布線
對以上4種DUT電路設置為4個不同的工程,分別進行邏輯綜合。表1顯示了4種DUT自身所消耗的FPGA內部資源,以及在這4種DUT電路下,傳統內部刷新系統整體的資源消耗情況和本文所提出的改進后的內部刷新系統所消耗的資源情況。從表中可以看出,改進后的系統,由于對scrubber增加三模冗余,故而導致資源占用率相對傳統內部刷新有所增加。即便如此,改進后的內部刷新系統所占用的資源仍然很低。在系統頻率為100 MHz時,本文所設計的內部刷新系統,回讀一幀需要114個時鐘周期,也就是需要1.14 μs,配置一幀數據需要110個時鐘周期,即1.1 μs。

表1 資源消耗統計
本文采用故障注入的方式來模擬單粒子效應,以此來驗證系統的抗輻射性能。針對以上4組DUT電路,將每組DUT所在的系統例化兩次,其中一份作為對照組,另一份為實驗組,并同時施加相同的激勵。采用線性反饋移位寄存器(linear feedback shift register,LFSR)生成隨機故障注入幀地址,對實驗組進行故障注入。在故障注入過程種,如果觀察到實驗組DUT的輸出與對照組不一致,那么此時已經注入的故障數目即為該系統最大可以接受的故障注入數目。
本文設計了3種刷新系統方案來綜合比對,來說明改進后刷新系統抗輻射性能。
(1)對傳統內部刷新系統進行故障注入,以得到其最大故障注入數目;
(2)將傳統內部刷新系統的刷新電路部分增加三模冗余處理后,對該系統進行故障注入,得到其最大故障注入數目;
(3)對本文所設計的內部刷新系統進行故障注入,得到最大故障注入數目。
為了使實驗數據更準確,減少偶發性造成的影響,重復對每種方案進行100次故障注入實驗。圖9顯示了方案(3)在DUT電路為4位加法器時,其中一次回讀到的配置數據,圖9(a)為故障注入前的數據,圖9(b)為故障注入后的數據,紅色框為1位單粒子翻轉,藍色框為2位,黃色框里的為3位單粒子翻轉,圖9(c)為經過糾錯刷新后的數據,從中可以看出該系統可以實現對3位及3位以下的翻轉實現糾錯。

圖9 回讀數據
100次故障注入實驗后,得到的各系統最大故障注入數目如表2所示。從表中可以得到,在4種DUT電路平均下,方案(2)最大故障注入數目約為方案(1)的1.93倍,這說明了增加三模冗余防護,可在一定程度上提高系統的容錯率。方案(3)也就是本文所提出的系統最大故障注入數目是方案(1)的2.56倍,是方案(2)的1.34倍,這表明采用糾錯能力更強的糾錯碼可以進一步提升系統的容錯能力。圖10為表2對應的最大故障注入數目統計圖,從圖中也可以直觀地看出方案(3)的容錯率最高,方案(1)最低。綜上,本文所提出的內部刷新系統方案相較于之前的傳統內部刷新系統,其容錯率得到了一定的提升。

表2 最大故障注入數目統計

圖10 最大故障注入數目統計圖
本文在經過對抗單粒子翻轉問題研究后,并結合國內外單粒子翻轉問題進行的研究,提出對傳統的內部刷新系統進行改進。具體改進措施為首先將刷新模塊與DUT分布式布局,方便確定兩個模塊對應的幀地址。之后對刷新控制模塊增加三模冗余,提高刷新控制模塊的容錯率,并且在三模冗余處增加錯誤判決器,可以對三模冗余的情況進行實時檢查,如果任一冗余模塊發生單粒子翻轉,則會立刻對刷新模塊進行刷新,防止錯誤累積,造成嚴重后果。除此外,還提出使用糾錯能力更強的RM(2,5)碼來替代傳統的FRAME_ECC糾錯碼,使得系統可以對3位及3位以下的翻轉進行檢錯和修正。通過對系統可靠性進行分析,可以得出改進后的系統可靠性大幅增加。最后通過故障注入實驗,證實了改進后的系統對故障的容錯率約是傳統內部刷新系統的2.56倍。綜上,改進的刷新系統可靠性以及容錯率都大幅增加,為衛星上存在的單粒子翻轉問題的解決提供了參考設計。隨著電路逐漸復雜集中,同時出現多個粒子被打翻的可能性越來越大,所以對糾錯碼糾錯能力也提出了更高的要求。在之后的研究中,可以對糾錯碼進行進一步的改進。