王 潔, 康俊杰, 侯 剛, 于健海
(1. 大連理工大學(xué) 軟件學(xué)院, 遼寧 大連 116620; 2. 遼寧省泛在網(wǎng)絡(luò)與服務(wù)軟件重點實驗室, 遼寧 大連 116620; 3. 梧州學(xué)院 電子與信息工程學(xué)院, 廣西 梧州 543002)
電子產(chǎn)品在復(fù)雜多變的應(yīng)用環(huán)境中發(fā)生故障的可能性增大,微處理器的可靠性和穩(wěn)定性受到極大挑戰(zhàn)[1-2]。容錯技術(shù)能夠有效保障微處理器的可靠性,但如何驗證容錯技術(shù)的有效性則是需要研究的問題[3-4]。故障注入是一種靈活、方便且易于操作的有效驗證容錯的技術(shù),通過對電路注入故障,能夠反饋微處理器注入故障后的反應(yīng),設(shè)計人員可記錄故障數(shù)據(jù)并分析處理,最終用于評價容錯機制的可靠性[5-7]。本文提出了基于Qt的Verilog故障注入工具VBFIT的設(shè)計方案,利用VBFIT可以實現(xiàn)Verilog HDL代碼的掃描,通過語法語義分析對寄存器變量精確定位,用戶能夠根據(jù)自己的需求選取變量并對微處理器進行故障注入,以研究容錯技術(shù)的可靠性。
電路的模擬故障注入主要有2種方式:一是通過仿真器命令進行故障注入,這種方式易于實現(xiàn);二是改變源代碼,從模型內(nèi)部生成故障,這種方式較為復(fù)雜,但能夠?qū)崿F(xiàn)更多故障模型[8-9]。為了滿足設(shè)計人員研究微處理器容錯性能需求,VBFIT通過掃描Verilog設(shè)計源文件直接對源代碼注入故障,具體功能如下:
(1) 源代碼掃描分析:掃描整個Verilog工程文件,獲得每個模塊中的變量定義以及例化關(guān)系;
(2) 故障注入:根據(jù)使用者選擇的故障點自動修改設(shè)計源文件;
(3) 圖像顯示:以圖像化的方法顯示故障注入的效果,并對結(jié)果進行分析。
故障注入工具主要分為2部分:(1)用于提供與用戶交互的界面程序;(2)用于處理原工程文件、輸出新的工程文件的后臺執(zhí)行程序。VBFIT工具總體框架設(shè)計如圖1所示。
圖1 總體框架設(shè)計
用戶選擇需要故障注入的工程后,界面程序?qū)⒃撀窂絺魉徒o后臺程序,后臺程序?qū)⒃撐募窂竭M行掃描,通過語法語義分析器對Verilog源文件進行解析,并將每一個故障注入點以語法樹的形式展現(xiàn)給用戶。用戶輸入故障注入?yún)?shù)后,通過故障注入管理器,利用故障注入宏對源文件進行故障注入,生成新的工程文件。對新生成的工程文件進行模擬仿真,分析結(jié)果后反饋給用戶,用于容錯性能的評價。
從總體框架設(shè)計可以看出,VBFIT主要是由圖形界面、語法語義分析器以及故障注入管理器等功能模塊組成。
圖形界面主要用于與用戶交互,以圖形化界面向用戶展現(xiàn)工程文件的故障注入過程。通過圖形界面,用戶可將整個Verilog工程文件導(dǎo)入VBFIT工具,經(jīng)過語法語義分析器處理后對用戶展示可進行故障注入的每個位置。用戶通過故障注入管理器輸入故障參數(shù),即可完成故障注入,最終生成新的源文件,用于容錯性能測試。表1為圖形界面的功能說明。
表1 VBFIT圖形界面各模塊的功能
語法語義分析器主要對Verilog文件進行解析,確定各個module間的層次關(guān)系,生成模型的語法分析列表,建立每個基本元素的語法樹,最終得到所有可能的故障注入點。
以簡單的Verilog語法語義分析器為例。該分析器并不對Verilog語言進行錯誤檢查和編譯,而只是對原文件進行掃描。識別器中可以注入故障的模塊、寄存器、線網(wǎng)等基本電路元件,從而建立整個注入對象的語法結(jié)構(gòu)樹。
語法語義分析器包括代碼掃描,保留字識別,標(biāo)識符的識別、添加和修改、變量屬性獲取等4個子功能。為了保證對Verilog HDL靈活的語言規(guī)則的適配度,代碼掃描功能采用了按字符掃描的方法,利用正則表達式、非確定性自動機(NFA)對Verilog HDL進行描述[10-12]。
Verilog代碼中的保留字、標(biāo)識符和空白的正則表達式定義如下:
Reservedword=module| if | while | for | always@ | output | input | endmodule | initial | begin |end | reg | wire | parameter | assign |
Letter = [a-zA-z]
Digit = [0-9]
Identifer = (Letter | _ )(Letter | Digit | _)*
Whitespace = (newline | blank | tab |comment)+
將識別到的元素名稱存在符號表中,用于識別各個元素之間的層次關(guān)系。根據(jù)分隔符和空白格對掃描到的單詞進行判斷(是否為關(guān)鍵字、標(biāo)識符、數(shù)字等);保留字和標(biāo)識符的識別功能通過容器(vector)類進行實現(xiàn),通過對兩個容器的增、刪、改、查,對保留字和標(biāo)識符進行添加、識別和修改;變量屬性的獲取主要是通過對已定義的標(biāo)識符進行識別,然后再進行對單個標(biāo)識符的屬性修改,對于新定義標(biāo)識符,會有相應(yīng)的默認(rèn)屬性。根據(jù)掃描結(jié)果建立語法樹,并通過圖形界面展示給設(shè)計人員用于故障注入。
如圖2所示,故障注入管理的主要功能是獲取故障注入節(jié)點,與用戶交互故障模型、故障周期、故障位等參數(shù),并將參數(shù)傳給底層函數(shù),再利用底層函數(shù)將該故障精準(zhǔn)注入。
圖2 故障注入管理器工作原理
在故障注入管理器圖形界面,用戶可設(shè)置故障注入的參數(shù)有故障位、故障模型(置1,置0,翻轉(zhuǎn)等)、故障注入周期等。用戶收到Verilog語法語義分析器返回的數(shù)據(jù)后,根據(jù)該數(shù)據(jù)選擇故障需要注入的位置,同時設(shè)置故障注入的周期和所注入的故障模型。將該數(shù)據(jù)提交給故障注入管理器后,管理器會判斷用戶提供的參數(shù)是否合法,如不合法(數(shù)據(jù)位不存在,或缺少相關(guān)參數(shù)等),將提示用戶重新提交參數(shù)。
VBFIT工具是基于Qt平臺開發(fā)的,整個程序功能部分代碼使用C++語言開發(fā)。C++語言中特有的類定義及文件操作功能,可以方便對源代碼進行掃描分析并存儲信息。為保證將工程的詳細(xì)信息輸出給用戶,主窗口采用了多呈現(xiàn)區(qū)域的設(shè)計,分別將模塊、代碼、變量在3個區(qū)域分別用樹狀圖、文本框、列表方式顯示給用戶。
進行故障注入的實驗對象為四位全加器,利用Xilinx公司的ISE開發(fā)套件生成四位全加器的Verilog源代碼,將源代碼導(dǎo)入VBFIT中進行故障注入,生成新的源代碼。
四位全加器原始代碼
always@(posedge clk or negedge nrst) begin
if(!nrst)
begin
en_tmp <= 4’hE;
end
else
begin
en_tmp <= {en_tmp[2:0],en_tmp[3]}; end end assignen = en_tmp; endmodule
新生成的四位全加器代碼如下:
//A BIT_FAULT INJECTED count <= count + 1; if(count ==12) begin en_tmp <= ({en_tmp[2:0],entmp[3]})^(1<<2); end else begin en_tmp <={en_tmp[2:0],entmp[3]}; end end end assignen = en_tmp; endmodule
在進行故障注入時,選擇對en_tmp變量的第3位、在第12個時鐘周期發(fā)生位翻轉(zhuǎn)故障,該部分代碼與未進行故障注入時的代碼進行比對,發(fā)現(xiàn)在聲明部分首先添加了一個周期計數(shù)器count,用來計算代碼注入的周期;在原來en_tmp的賦值語句處進行了代碼重構(gòu),使原變量的值根據(jù)故障類型進行重新運算,從而達到故障注入的目的。
為對比顯示故障注入效果,將兩個工程文件進行模擬仿真,得到仿真波形圖(見圖3和圖4)。
圖3 未故障注入時的模擬波形
圖4 故障注入后波形
從圖3中的波形可知,在第17個周期,系統(tǒng)輸出結(jié)果為6+7的數(shù)值,s值為13正確;從圖4可以看出,注入故障后,在第12個時鐘周期,en_tmp的值發(fā)生了錯誤,本應(yīng)為0111,卻為0011,第三位發(fā)生了位翻轉(zhuǎn)故障,同時第17個時鐘周期輸出的6+7的計算結(jié)果為5是錯誤的,證明了VBFIT實現(xiàn)了有效的故障注入。
本文基于Qt平臺設(shè)計了VBFIT故障注入工具,通過對Verilog HDL代碼的掃描,能夠?qū)崿F(xiàn)簡易的語法語義分析,得到各個信號和寄存器的語法樹,并以圖形化的方式展示給用戶。通過故障注入管理器,用戶可以實現(xiàn)對信號的精確故障注入,滿足用戶多種故障注入需求,從而實現(xiàn)對電路容錯機制的可靠性測試與評價。對于復(fù)雜的工程文件,需要加強對原代碼的實現(xiàn)能力,自動識別更多種語法結(jié)構(gòu),同時也需要增加更多功能,更好地滿足用戶的需求。