王 洁, 康俊杰, 侯 刚, 于健海
(1. 大连理工大学 软件学院, 辽宁 大连 116620; 2. 辽宁省泛在网络与服务软件重点实验室, 辽宁 大连 116620; 3. 梧州学院 电子与信息工程学院, 广西 梧州 543002)
电子产品在复杂多变的应用环境中发生故障的可能性增大,微处理器的可靠性和稳定性受到极大挑战[1-2]。容错技术能够有效保障微处理器的可靠性,但如何验证容错技术的有效性则是需要研究的问题[3-4]。故障注入是一种灵活、方便且易于操作的有效验证容错的技术,通过对电路注入故障,能够反馈微处理器注入故障后的反应,设计人员可记录故障数据并分析处理,最终用于评价容错机制的可靠性[5-7]。本文提出了基于Qt的Verilog故障注入工具VBFIT的设计方案,利用VBFIT可以实现Verilog HDL代码的扫描,通过语法语义分析对寄存器变量精确定位,用户能够根据自己的需求选取变量并对微处理器进行故障注入,以研究容错技术的可靠性。
电路的模拟故障注入主要有2种方式:一是通过仿真器命令进行故障注入,这种方式易于实现;二是改变源代码,从模型内部生成故障,这种方式较为复杂,但能够实现更多故障模型[8-9]。为了满足设计人员研究微处理器容错性能需求,VBFIT通过扫描Verilog设计源文件直接对源代码注入故障,具体功能如下:
(1) 源代码扫描分析:扫描整个Verilog工程文件,获得每个模块中的变量定义以及例化关系;
(2) 故障注入:根据使用者选择的故障点自动修改设计源文件;
(3) 图像显示:以图像化的方法显示故障注入的效果,并对结果进行分析。
故障注入工具主要分为2部分:(1)用于提供与用户交互的界面程序;(2)用于处理原工程文件、输出新的工程文件的后台执行程序。VBFIT工具总体框架设计如图1所示。
图1 总体框架设计
用户选择需要故障注入的工程后,界面程序将该路径传送给后台程序,后台程序将该文件路径进行扫描,通过语法语义分析器对Verilog源文件进行解析,并将每一个故障注入点以语法树的形式展现给用户。用户输入故障注入参数后,通过故障注入管理器,利用故障注入宏对源文件进行故障注入,生成新的工程文件。对新生成的工程文件进行模拟仿真,分析结果后反馈给用户,用于容错性能的评价。
从总体框架设计可以看出,VBFIT主要是由图形界面、语法语义分析器以及故障注入管理器等功能模块组成。
图形界面主要用于与用户交互,以图形化界面向用户展现工程文件的故障注入过程。通过图形界面,用户可将整个Verilog工程文件导入VBFIT工具,经过语法语义分析器处理后对用户展示可进行故障注入的每个位置。用户通过故障注入管理器输入故障参数,即可完成故障注入,最终生成新的源文件,用于容错性能测试。表1为图形界面的功能说明。
表1 VBFIT图形界面各模块的功能
语法语义分析器主要对Verilog文件进行解析,确定各个module间的层次关系,生成模型的语法分析列表,建立每个基本元素的语法树,最终得到所有可能的故障注入点。
以简单的Verilog语法语义分析器为例。该分析器并不对Verilog语言进行错误检查和编译,而只是对原文件进行扫描。识别器中可以注入故障的模块、寄存器、线网等基本电路元件,从而建立整个注入对象的语法结构树。
语法语义分析器包括代码扫描,保留字识别,标识符的识别、添加和修改、变量属性获取等4个子功能。为了保证对Verilog HDL灵活的语言规则的适配度,代码扫描功能采用了按字符扫描的方法,利用正则表达式、非确定性自动机(NFA)对Verilog HDL进行描述[10-12]。
Verilog代码中的保留字、标识符和空白的正则表达式定义如下:
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)+
将识别到的元素名称存在符号表中,用于识别各个元素之间的层次关系。根据分隔符和空白格对扫描到的单词进行判断(是否为关键字、标识符、数字等);保留字和标识符的识别功能通过容器(vector)类进行实现,通过对两个容器的增、删、改、查,对保留字和标识符进行添加、识别和修改;变量属性的获取主要是通过对已定义的标识符进行识别,然后再进行对单个标识符的属性修改,对于新定义标识符,会有相应的默认属性。根据扫描结果建立语法树,并通过图形界面展示给设计人员用于故障注入。
如图2所示,故障注入管理的主要功能是获取故障注入节点,与用户交互故障模型、故障周期、故障位等参数,并将参数传给底层函数,再利用底层函数将该故障精准注入。
图2 故障注入管理器工作原理
在故障注入管理器图形界面,用户可设置故障注入的参数有故障位、故障模型(置1,置0,翻转等)、故障注入周期等。用户收到Verilog语法语义分析器返回的数据后,根据该数据选择故障需要注入的位置,同时设置故障注入的周期和所注入的故障模型。将该数据提交给故障注入管理器后,管理器会判断用户提供的参数是否合法,如不合法(数据位不存在,或缺少相关参数等),将提示用户重新提交参数。
VBFIT工具是基于Qt平台开发的,整个程序功能部分代码使用C++语言开发。C++语言中特有的类定义及文件操作功能,可以方便对源代码进行扫描分析并存储信息。为保证将工程的详细信息输出给用户,主窗口采用了多呈现区域的设计,分别将模块、代码、变量在3个区域分别用树状图、文本框、列表方式显示给用户。
进行故障注入的实验对象为四位全加器,利用Xilinx公司的ISE开发套件生成四位全加器的Verilog源代码,将源代码导入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个时钟周期发生位翻转故障,该部分代码与未进行故障注入时的代码进行比对,发现在声明部分首先添加了一个周期计数器count,用来计算代码注入的周期;在原来en_tmp的赋值语句处进行了代码重构,使原变量的值根据故障类型进行重新运算,从而达到故障注入的目的。
为对比显示故障注入效果,将两个工程文件进行模拟仿真,得到仿真波形图(见图3和图4)。
图3 未故障注入时的模拟波形
图4 故障注入后波形
从图3中的波形可知,在第17个周期,系统输出结果为6+7的数值,s值为13正确;从图4可以看出,注入故障后,在第12个时钟周期,en_tmp的值发生了错误,本应为0111,却为0011,第三位发生了位翻转故障,同时第17个时钟周期输出的6+7的计算结果为5是错误的,证明了VBFIT实现了有效的故障注入。
本文基于Qt平台设计了VBFIT故障注入工具,通过对Verilog HDL代码的扫描,能够实现简易的语法语义分析,得到各个信号和寄存器的语法树,并以图形化的方式展示给用户。通过故障注入管理器,用户可以实现对信号的精确故障注入,满足用户多种故障注入需求,从而实现对电路容错机制的可靠性测试与评价。对于复杂的工程文件,需要加强对原代码的实现能力,自动识别更多种语法结构,同时也需要增加更多功能,更好地满足用户的需求。