朱旭鋒 郭佳鑫 胡曉晴 梁建強 張 紅
北京航天自動控制研究所,北京 100854
隨著導彈信息化、智能化、實戰(zhàn)化發(fā)展,彈載信息處理器對非易失的大容量數(shù)據(jù)存儲器需求變得非常迫切。NAND Flash因具有非易失、存儲密度高、讀寫壽命長、寫入和擦除速度快等特點,在彈載信息處理器被廣泛應用。但NAND Flash存在天然缺陷:一是存在壞塊而且壞塊會隨時間增加;二是存在不確定的位反轉[1-2]。因此,通常需要采用壞塊管理、備份、ECC校驗等方法提高數(shù)據(jù)存儲可靠性。文獻[3]提出了一種高效的壞塊管理方法,通過對壞塊地址映射和替換,提高了星載NAND Flash存儲器的使用壽命,但這種壞塊管理方法主要適用在多片NAND Flash并行存儲的星載場合,而且沒有進行ECC校驗,對于彈載信息處理器僅有限數(shù)量NAND Flash存儲關鍵參數(shù)的場合并不適用。文獻[4]基于FPGA方法實現(xiàn)了NAND Flash壞塊管理,但并沒有考慮數(shù)據(jù)位反轉帶來的可靠性問題。文獻[5]采用硬件雙備份和壞塊管理相結合實現(xiàn)了NAND Flash數(shù)據(jù)存儲,但仍然無法解決位反轉帶來的可靠性問題。文獻[6]采用FPGA實現(xiàn)了一種基于漢明碼的高性能ECC校驗方法,每256Byte可實現(xiàn)24bit的ECC校驗。但這種算法可糾正1bit錯誤,對于2bit及以上錯誤無法保證糾錯和檢錯[7]。
本文為提高NAND Flash數(shù)據(jù)存儲可靠性,在對NAND Flash芯片機理分析基礎上,提出一種NAND Flash全生命周期數(shù)據(jù)管理方法:將DSP軟件和FPGA算法相結合,實現(xiàn)了壞塊管理、壞塊評價、ECC實時校驗,提高了NAND Flash數(shù)據(jù)存取的可靠性。
NAND Flash存儲器是Flash存儲器的一種。NAND結構能提供極高單元密度,是高數(shù)據(jù)存儲密度理想解決方案。其存儲結構為:NAND Flash數(shù)據(jù)以bit方式保存在memory cell,一個cell只能存儲一個bit。這些cell以8個為單位,連成bit line,形成byte。這些byte line會再組成Page,然后每128個page形成一個Block。Block是NAND Flash中最大的操作單元,擦除按照block為單位完成,編程/讀取是按照page為單位完成的。NAND Flash讀寫操作以頁為單位。在每次寫入數(shù)據(jù)之前必須進行擦除操作,擦除最小單位為塊。塊與塊之間相互獨立。壞塊不會影響其他塊,這正是進行壞塊管理的基礎。
NAND Flash芯片在使用時,應考慮兩類對錯誤類型處理:即壞塊和位反轉。
目前彈載信息處理器中,NAND Flash數(shù)據(jù)讀取結構如圖1所示。
圖1 彈載信息處理器NAND Flash應用架構
圖1中,NOR Flash存儲容量較小,主要存儲程序信息。NAND Flash存儲容量較大,主要存儲圖像數(shù)據(jù)和深度學習關鍵參數(shù)。DSP通過FPGA訪問NAND Flash數(shù)據(jù)。FPGA設計NAND Flash控制器,控制NAND Flash讀寫。為了實現(xiàn)NAND Flash數(shù)據(jù)管理,目前方法如下:
一是建立壞塊表:在出廠時,將NAND Flash出廠時標定的壞塊信息存儲在首塊首頁(block0,page0)存儲空間,首塊存儲空間廠家出廠保證不是壞塊;在數(shù)據(jù)燒寫時,首先讀取壞塊信息,按照壞塊信息跳過壞塊。燒寫過程中,如果某block回讀數(shù)據(jù)與上傳數(shù)據(jù)不一致,則將該block標記為壞塊,并將原本寫入該block數(shù)據(jù)寫入下個block,同時更新位于block0壞塊信息表;
二是采用硬件或者軟件方式進行數(shù)據(jù)備份。通過備份提升位反轉(Bit Flip)條件下數(shù)據(jù)加載可靠性;三是通過FPGA軟件進行錯誤檢查和糾正(ECC,Error Checking and Correction)校驗算法來提高數(shù)據(jù)可靠性。但傳統(tǒng)的單bit糾錯能力,不能滿足嵌入式CPU和GPU對NAND Flash存儲的可靠性需求。文獻[8]采用了BCH碼與經(jīng)典硬判決的編解碼算法,但編碼效率低。編碼延時大。數(shù)據(jù)吞吐能力無法滿足航天器高速存儲系統(tǒng)需求。文獻[9]提出一種RS+LDPC碼級聯(lián)并行編碼設計方案,但編碼復雜,適用于多片NAND Flash并行處理場合。文獻[10]利用BCH算法實現(xiàn)了對負責GPU數(shù)據(jù)交互的NAND Flash進行多bit錯誤糾正,其通過GPU實現(xiàn)了修正的校驗多項式計算單元(Syndrome generator),構建了適應多種傳輸參數(shù)的BCH編解碼架構。文獻[11]提出了一種對稱逐塊拼接的架構,優(yōu)化BCH的編碼解碼過程,提升算法的編解碼效率。文獻[12]進一步基于對稱逐塊拼接架構進行優(yōu)化,整合主編碼器和一個輔助編碼器,進一步提升BCH算法的糾錯能力[12]。上述文章都從優(yōu)化糾錯能力和執(zhí)行效率的角度對BCH算法的編碼和解碼方式進行改進。對基于FPGA的嵌入式高可靠應用,并行BCH算法的解碼單元需要消耗大量的邏輯資源。在保證算法糾錯能力的基礎上,需要兼顧模塊資源使用情況,對消耗資源多單元模塊進行壓縮和優(yōu)化。
本文在實現(xiàn)經(jīng)典BCH編碼和解碼模塊基礎上,通過邏輯單元復用將無逆BM解算PE單元數(shù)量壓縮為原有的1/8,將整個BCH編解碼模塊邏輯資源使用量壓縮為傳統(tǒng)1/2以下。
本文研究的BCH編解碼單元,每個譯碼過程處理的數(shù)據(jù)內容包括4200位(4096個數(shù)據(jù)位(512字節(jié)),104個校驗位),對于BCH算法碼長為n=2m-1,為了實現(xiàn)對數(shù)據(jù)內容的包絡,取m=13,糾錯能力t為8位,每512字節(jié)的校驗位位數(shù)為m×t=104位,每頁大小為4096字節(jié),包含8個512字節(jié),從而需要104字節(jié)的空間來存儲校驗位。BCH碼可描述為BCH(4200,4096,8)。NAND Flash每個數(shù)據(jù)讀或寫為8位字節(jié)格式,因此選擇并行度為8的編碼器、譯碼器設計。由于m=13,得到其本原多項式為:
f(x)=x13+x4+x3+1
(1)
NAND Flash對外接口為8位,對于8位并行的在線數(shù)據(jù)移入,利用對應生成多項式規(guī)則的線性移位寄存器的高8位與移入8位數(shù)據(jù)乘以x104的結果相加(對于二進制伽羅華域,相加代表異或操作)??梢缘玫?位并行編碼器的解析表達式,其硬件實現(xiàn)只需將表達式的每一位用同步邏輯表達。設計實現(xiàn)電路如圖2所示:
圖2 8位并行BCH編碼器
在完成512次8位數(shù)據(jù)輸入后,得到的104位表達式為13字節(jié)校驗位數(shù)據(jù)。對于一個頁來說,其數(shù)據(jù)存儲區(qū)域為索引0到4095的存儲字節(jié)。而4096位至4105位的10個字節(jié)存儲塊信息,其校驗位存儲在4106開頭的地址空間中。
譯碼器設計包括3個模塊,分別是伴隨多項式計算模塊、錯誤位置多項式計算模塊、錢搜索模塊。伴隨多項式計算用于檢測512字節(jié)的數(shù)據(jù)是否存在位反轉的錯誤;錯誤位置多項式計算采用SiBM算法(Simple Inverse-free BM),用于從伴隨多項式確定錯誤位置多項式的系數(shù);錢搜索將錯誤位置多項式根的求解轉化為對本原多項式根的冪的驗證。
2.2.1 伴隨多項式計算模塊
伴隨多項式用于確認數(shù)據(jù)是否發(fā)生錯誤。對于t位糾錯能力的BCH譯碼器,需要數(shù)量為2t個伴隨多項式。
(2)
傳統(tǒng)對單個數(shù)據(jù)位的計算,工作效率低,不能滿足工程需求。對應NAND Flash數(shù)據(jù)位寬為8位,采用8位并行計算策略,如圖3所示。
圖3 8位并行線性移位單元
2.2.2 錯誤位置多項式計算模塊
錯誤位置多項式計算模塊是譯碼器設計中占用邏輯資源最多的部分。伯利坎普-梅西算法是傳統(tǒng)的無逆BM算法,是求解錯誤位置多項式的解決方法之一,其實現(xiàn)依賴于16個PE單元的組合,如圖4所示。
圖4 傳統(tǒng)無逆BM算法求解模塊
每個PE單元的組成如圖5所示:
圖5 PE單元設計
可以看出,傳統(tǒng)無逆BM算法雖然實現(xiàn)簡單,但PE資源的堆疊造成邏輯資源的極大消耗,不利于FPGA的編程實現(xiàn)。
本文采用簡化的無逆BM算法(SiBM)求解錯誤位置多項式,即采用PE單元的復用實現(xiàn)資源的節(jié)省,如圖6所示。
圖6 PE復用無逆BM算法求解模塊
采用2個PE單元復用的設計方式,算法的迭代次數(shù)從t次擴展為t×t=64。錢搜索和伴隨多項式計算都需要512個周期的情況下(且數(shù)據(jù)訪問等待時間在于NAND Flash自身的緩存數(shù)據(jù)準備),增加的迭代次數(shù)不會顯著增加數(shù)據(jù)獲取的延遲。無逆BM算法模塊PE單元的復用,在不顯著增加訪問數(shù)據(jù)延遲的情況下,將整個BCH ECC模塊邏輯資源使用壓縮為原來的1/2。
2.2.3 錢搜索模塊
錢搜索是利用關鍵方程的錯誤位置多項式σ(x)確定錯誤位置的過程。本文的BCH(4200,4096,8)算法是一個縮短碼架構,原碼是(8191,8087,8),所以在使用錢搜索尋找σ1的根的過程,并不是從α0開始,對所有的冪次都進行搜索。而是從3991(8191-104-4200)開始,8位并行錢搜索的計算電路設計如圖7所示。
圖7 8位并行錢搜索模塊
算法的運行過程為:開始的第一個時鐘周期,選擇器把最左邊的伽羅華域乘法器的結果存入寄存器,以后每個周期選擇器選擇的是后面反饋過來的數(shù)據(jù)。對于第一排來說,每個固定因子乘法器計算的結果都會用到下面的加法器進行運算,從而實現(xiàn)八位并行的功能。一共有8個這樣的處理單元,最終結果為result0-result7,如果result0-result7某個寄存器結果為00000000,代表該位對應的數(shù)值為錯誤多項式的根(乘法結果為0),對應的校驗數(shù)據(jù)為1,否則代表該位未發(fā)生反轉,對應的校驗數(shù)據(jù)位為0。在第1個時鐘周期選擇錯誤位置多項式輸入左側乘法器后,模塊自身持續(xù)迭代512個周期,得到512個8位校驗數(shù)據(jù)。當DSP讀取Flash中的數(shù)值時,利用FIFO結構,將從NAND Flash獲取的512字節(jié)讀取數(shù)據(jù)和算法產(chǎn)生的512字節(jié)校驗數(shù)據(jù)進行異或,得到糾正后的數(shù)據(jù)。
在以上ECC算法基礎上,建立了一種NAND Flash的全生命周期的數(shù)據(jù)管理方法如圖8所示。
圖8 NAND Flash全生命周期壞塊管理
NAND Flash全生命周期數(shù)據(jù)管理流程如下:
1)芯片出廠壞塊檢測
根據(jù)和芯片公司交流,芯片公司出廠前會對NAND Flash進行芯片擦除和寫入檢測:將擦除、寫入失敗(查詢狀態(tài)信息),以及超過8bit的錯誤塊標志成壞塊,存放于每個壞塊第1頁的空閑區(qū)位置。在完成糾錯的基礎上,當發(fā)生反轉的位數(shù)量≤8時,反轉位能夠從校驗數(shù)據(jù)中得到糾正。通過對比每個512字節(jié)中關鍵方程的非零根數(shù)量和校驗數(shù)據(jù)的非零位數(shù)量,得到反轉的錯誤位計數(shù)。當發(fā)生反轉的錯誤位數(shù)量超過8位,出現(xiàn)非零根數(shù)量和校驗數(shù)據(jù)的非零位數(shù)量不等的狀況,F(xiàn)PGA對DSP上報錯誤。在糾錯的基礎上,F(xiàn)PGA的ECC模塊能夠實時監(jiān)測NAND Flash讀寫過程中的狀態(tài),為軟件的壞塊管理提供更精確的依據(jù);
2)芯片裝機后初始壞塊檢測
NAND Flash裝入彈載信息處理器后,通過對NAND Flash全部塊區(qū)域的壞塊標記位進行讀寫,完成壞塊數(shù)量的檢測,如果壞塊數(shù)量超過1%,則說明芯片失效,需要更換新的芯片;
3)單機試驗出廠前芯片壞塊檢測
彈載信息處理器進行一系列單機試驗后,需要對NAND Flash進行壞塊檢測。具體方法為對芯片未標記為壞塊的部分進行擦除和寫入操作,失敗則標記為壞塊,若ECC算法檢出8位以上錯誤,則標記為壞塊;如果DSP軟件判別壞塊數(shù)量超過2%,則說明芯片失效,需要更換新的芯片;
4)產(chǎn)品寫入NAND Flash數(shù)據(jù)時壞塊檢測
當往NAND Flash寫入數(shù)據(jù)時,會進行壞塊檢測,對芯片未標記為壞塊的部分進行擦除和寫入操作,失敗則標記為壞塊,若ECC算法檢出9位以上錯誤,則標記為壞塊;如果壞塊數(shù)量超過2%,則說明芯片失效,需要更換新的芯片;
5)產(chǎn)品讀取NAND Flash數(shù)據(jù)時壞塊檢測
當從NAND Flash讀出數(shù)據(jù)時,也會進行壞塊檢測。如果讀出的數(shù)據(jù)無法糾錯,則將無法糾錯的塊進行壞塊標記。同時,此時需要對數(shù)據(jù)進行重新更新。如果壞塊數(shù)量超過2%,則說明芯片失效,需要更換新的芯片。
以MICRON公司的NANDFLASH芯片(MT29F8G08ABABAWP-AITX)為例,仿真模擬NAND Flash讀寫過程數(shù)據(jù)。
通過采用本文改進BCH ECC校驗算法后,與無ECC校驗算法相比,讀取時間上增加約10%,但在數(shù)據(jù)正確率上達到了100%。具體仿真方法如下:寫入4096字節(jié)數(shù)據(jù),然后寫入104字節(jié)校驗位。按頁寫入,先寫入4096字節(jié)數(shù)據(jù),然后寫入104字節(jié)校驗位。校驗碼帶來的數(shù)據(jù)寫入時間在總的頁寫入時序中占比小于10%。
按照本文改進的BCH算法,假設寫入數(shù)據(jù)8FF,如果數(shù)據(jù)讀出(fifo1_data_out)正確,為8FF,則校驗數(shù)據(jù)(parity_result)為800。
按照本文改進的BCH算法,當按頁讀取數(shù)據(jù),對于512字節(jié),假設第一個數(shù)據(jù)8FF反轉為800 (fifo1_data_out),得到的校驗數(shù)據(jù)(parity_result)從800變?yōu)?FF。校驗數(shù)據(jù)與讀取數(shù)據(jù)異或結果為正確的數(shù)據(jù)8FF,實現(xiàn)了對8位反轉位糾正。
由于校驗碼存放在每頁(4096+224)字節(jié)中的224字節(jié)存儲區(qū),此存儲器仍然存在發(fā)生位反轉概率。仿真結果表明,在總反轉位數(shù)不超過糾錯能力8位的情況下,當數(shù)據(jù)、校驗碼分別或者同時發(fā)生位反轉時,本文的BCH ECC算法都能夠有效糾正位反轉的數(shù)據(jù)。
本文提出的NANDFLASH數(shù)據(jù)管理方法已經(jīng)在某彈載信息處理產(chǎn)品進行了實測。實測結果如下:
1)對邏輯資源進行對比,傳統(tǒng)BCH ECC算法占用邏輯資源為6300LUT,而本文改進后的BCH ECC算法占用邏輯資源為2900LUT。說明改進的BCH算法可以有效減少邏輯資源數(shù)量;
2)對數(shù)據(jù)讀取速度進行對比,如果無BCH ECC算法,25MHZ時鐘下讀取NANDFlash數(shù)據(jù)速度為1.4Mb/s。采用傳統(tǒng)的BCH ECC算法數(shù)據(jù)讀取速度在0.5Mb/s。在采用本文的BCH ECC算法后,讀取速度為1.35Mb/s。說明采用本文的BCH ECC算法后讀取速度延遲更??;
3)在某項目彈載信息處理器上,按照本文提出的NAND Flash全生命周期高可靠數(shù)據(jù)管理方法進行數(shù)據(jù)管理:以一年為測試周期,多次寫入和讀取NAND Flash數(shù)據(jù),未再發(fā)生由于沒有ECC校驗而導致的數(shù)據(jù)讀取錯誤問題。NAND Flash數(shù)據(jù)讀取可靠性得到了有效提高。
本文提出的一種彈載信息處理器NAND Flash全生命周期高可靠數(shù)據(jù)管理方法:以壞塊管理為基礎,通過DSP軟件對NAND Flash全生命周期進行實時壞塊檢測,采用一種基于PE單元復用的BCH ECC校驗算法,實現(xiàn)了對NAND Flash內存儲數(shù)據(jù)的檢9糾8實時檢測。通過DSP軟件壞塊管理、基于FPGA的實時ECC糾錯來提高數(shù)據(jù)管理的可靠性。
仿真效驗結果表明,采用該方法即可實現(xiàn)實時ECC校驗,同時能夠有效避免數(shù)據(jù)錯誤和數(shù)據(jù)備份帶來的空間浪費問題,提高了NAND Flash全生命周期數(shù)據(jù)管理的可靠性。本文的研究,對彈載信息處理場合應用NAND Flash實現(xiàn)高可靠數(shù)據(jù)管理具有重要實用意義。