CN109725900A - 寄存器传输级Verilog代码的SMV模型构建方法 - Google Patents
寄存器传输级Verilog代码的SMV模型构建方法 Download PDFInfo
- Publication number
- CN109725900A CN109725900A CN201910010500.6A CN201910010500A CN109725900A CN 109725900 A CN109725900 A CN 109725900A CN 201910010500 A CN201910010500 A CN 201910010500A CN 109725900 A CN109725900 A CN 109725900A
- Authority
- CN
- China
- Prior art keywords
- node
- variable
- sentence
- exp
- case
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种寄存器传输级Verilog代码的SMV模型构建方法,用于解决现有寄存器传输级的SMV模型构建方法独立性差的技术问题。技术方案是采用静态分析Verilog代码的方法得到每个模块对应的控制流图,深度遍历控制流图得到模块中每个变量的<pc,exp>列表,利用<pc,exp>列表构建模块对应的SMV模型。其中,pc是路径条件,exp是在pc为真的情况下变量的表达式。本发明在读入Verilog代码后,针对生成的Verilog代码的解析树,不需要依赖第三方工具进行数据格式的转换和存储,可以作为一个独立的方法将输入的Verilog代码直接转换为SMV模型,实用性好。
Description
技术领域
本发明涉及一种寄存器传输级的SMV模型构建方法,特别涉及一种寄存器传输级Verilog代码的SMV模型构建方法。
背景技术
现有的模型检测大多针对门级电路进行建模,建立的模型相对寄存器传输级会复杂很多,也不利于设计者分析验证的结果。目前公布的技术和文献中,针对寄存器传输级的硬件设计安全的模型检测验证方法非常有限。
文献“Verilog2SMV:A tool for word-level verification,2016Design,Automation&Test in Europe Conference&Exhibition(DATE),Dresden,2016,pp.1156-1159”公开了一种寄存器传输级的Symbolic Model Verifier(以下简称SMV)模型构建方法,用于验证寄存器传输级Verilog代码。该方法首先利用开源综合工具Yosys将寄存器传输级Verilog代码平面化,然后依据平面化的结果利用Yosys综合成寄存器传输级电路。寄存器传输级电路输入到一个新的Yosys模块,这个模块将输入的寄存器传输级电路转换成一个对应的SMV模型。这种方法间接地构造出SMV模型,过分依赖于第三方专用工具Yosys,需要依靠Yosys进行数据的转换和存储,相当于Yosys的一个扩展功能模块,独立性较差。
发明内容
为了克服现有寄存器传输级的SMV模型构建方法独立性差的不足,本发明提供一种寄存器传输级Verilog代码的SMV模型构建方法。该方法采用静态分析Verilog代码的方法得到每个模块对应的控制流图,深度遍历控制流图得到模块中每个变量的<pc,exp>列表,利用<pc,exp>列表构建模块对应的SMV模型。其中,pc是路径条件,exp是在pc为真的情况下变量的表达式。本发明在读入Verilog代码后,针对生成的Verilog代码的解析树,不需要依赖第三方工具进行数据格式的转换和存储,可以作为一个独立的方法将输入的Verilog代码直接转换为SMV模型,实用性好。
本发明解决其技术问题所采用的技术方案:一种寄存器传输级Verilog代码的SMV模型构建方法,其特点是包括以下步骤:
步骤一、设计控制流图中的语句结点类型:ALWAYS,ALWAYS_END,IF,ELSE,IF_END,CASE,CASEX,CASEZ,CASE_ITEM,CASE_END,FOR,FOR_END,TASK,TASK_END,ASSIGN_BLOCK,ASSIGN_NONBLOCK,ASSIGN_CONTINUOUS,INSTANTIATION。整个代码的开始增加一个ENTER结点,对应module语句,结束增加一个EXIT结点,对应endmodule,不确定类型是NONE结点,其中always,if,casex,casez,for,task所对应的结点为控制结点,ENTER和EXIT是控制结点,阻塞赋值、非阻塞赋值和连续赋值为赋值结点。
采用开源的antlr4以及Terence Parr撰写的verilog2001.g4,解析Verilog寄存器传输级设计代码的语法。
依次提取每条Verilog语句的语法信息进行分析,设计生成控制流图的语句结点。一条语句对应控制流图中的一个结点,语句结点的类型针对Verilog可综合的语句设定。根据语句结点类型建立语句结点之间的前驱和后继关系:语句结点之间的控制流关系体现在控制结点之间以及控制结点和赋值结点之间的连接,对于赋值结点之间的连接,不表示控制关系,只是表示出赋值结点代表的语句在代码中的位置关系,添加的ENTER结点是整个模块的开始结点,EXIT结点是整个模块的结束结点,always语句段,例化语句和连续赋值语句之间是并行关系,always语句段内的if、casex,casez、for语句之间存在着语法相关的控制区间和控制顺序的关系;根据控制区间和控制关系确定出各个语句结点之间的前驱和后继关系。依据每个语句结点之间的前驱和后继关系,采用广度优先遍历,生成Verilog代码的控制流图。
得到Verilog模块对应的控制流图后,生成Verilog代码的路径条件pc和对应表达式exp的关系对<pc,exp>,每一个赋值表达式的左边变量拥有一个或者多个<pc,exp>。深度遍历Verilog模块对应的控制流图,如果遍历结束则步骤一结束。如果遍历没有结束则取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode。判断node的类型,如果node的结点类型是ALWAYS,则always语句的事件列表加入到node的路径条件中。如果node的结点类型是IF,则将控制结点controlNode的路径条件列表合并上当前if语句的条件,作为node的路径条件列表。如果node的结点类型是ELSE,则controlNode路径条件列表中最后一个条件取反作为node的路径条件。如果node的结点类型是CASE,则将controlNode的路径条件列表作为node的路径条件列表。如果node的结点类型是CASE_ITME,并且是default语句结点时,controlNode的路径条件列表合并上case语句默认路径条件作为node的路径条件列表;当不是default语句结点时,controlNode的路径条件列表合并上node的语句条件作为node的路径条件列表。如果是赋值语句,controlNode的路径条件列表作为node的路径条件列表,同时node的路径条件列表作为pc,node的赋值表达式作为exp,构成node左边变量的<pc,exp>。其他情况下,controlNode的路径条件列表作为node的路径条件列表。判断是否所有结点都访问完,如果没有访问完,则继续取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode,然后判断node的类型进行相应的处理。如果所有结点都访问完,深度优先遍历控制流图结束。
步骤二、根据步骤一生成变量的<pc,exp>列表,Verilog代码中的变量定义、参数常量定义等信息构建模型检测用的SMV模型。将Verilog代码中的reg,wire,tri和integer类型变量转换为NuSMV的VAR类型变量,VAR变量写入字符串smv。将Verilog代码中的parameter类型转换为NuSMV的DEFINE标识符,将DEFINE标识符添加到smv。将例化语句转换为NuSMV的函数语句,函数语句添加到smv。处理变量的<pc,exp>列表,如果变量是在连续赋值语句中,则设定字符串变量nusmv_string等于表达式variable:=exp的NuSMV形式。如果变量是在组合逻辑中的阻塞赋值语句中,则设定变量nusmv_string等于表达式variable:=case;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式variable:=case;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式next(variable):=case。如果变量是在时序逻辑中的非阻塞赋值语句中,则设定变量nusmv_string等于表达式next(variable):=case;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式variable:=case;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式next(variable):=case。依据<pc,exp>将Verilog阻塞赋值语句和非阻塞赋值语句构建为NuSMV的case语句,即一个<pc,exp>表达为pc:exp的形式。一个变量的<pc,exp>列表都转换添加到变量nusmv_string。将每个变量的nusmv_string添加到字符串smv。将字符串smv的内容写入到SMV文件,生成SMV模型。
步骤三、依据硬件设计规范,设定待验证硬件设计的属性,用计算树逻辑CTL表达。
步骤四、对步骤二中得到的SMV模型,利用NuSMV验证步骤三中设定的属性。如果验证结果为真,则步骤三的属性得到满足,验证通过。如果验证结果为假,则会有一个反例输出,验证不通过。反例包含了一个状态序列,该序列中的每一个状态都具体表明了Verilog代码中每一个变量的值。
步骤五、依据步骤四中得到的反例,确定出Verilog代码中的不安全代码。
本发明的有益效果是:该方法采用静态分析Verilog代码的方法得到每个模块对应的控制流图,深度遍历控制流图得到模块中每个变量的<pc,exp>列表,利用<pc,exp>列表构建模块对应的SMV模型。其中,pc是路径条件,exp是在pc为真的情况下变量的表达式。本发明在读入Verilog代码后,针对生成的Verilog代码的解析树,不需要依赖第三方工具进行数据格式的转换和存储,可以作为一个独立的方法将输入的Verilog代码直接转换为SMV模型,实用性好。
下面结合附图和具体实施方式对本发明作详细说明。
附图说明
图1是本发明寄存器传输级Verilog代码的SMV模型构建方法的流程图。
图2是本发明方法实施例中Verilog代码变量的<pc,exp>列表生成流程示意图。
图3是本发明方法实施例构建SMV模型流程示意图。
图4是本发明方法实施例中对应u_xmit.v文件的第60-67行代码的控制流图。
具体实施方式
参照图1-4。本发明寄存器传输级Verilog代码的SMV模型构建方法具体步骤如下:
选取Trust-Hub上的RS232-T600为分析对象,其中包含了三个Verilog文件:uart.v,u_xmit.v和u_rec.v。此三个Verilog文件如下文所示。在文件u_xmit.v中有硬件木马。该硬件木马是一个有限状态机,它检测发送数据序列,当出现序列8’hAA,8’h55,8’h00和8’hFF的时候,木马被激活,输出变量xmit_doneH被置“1”,并且传输数据的第7个bit位被替换。
1.uart.v程序源码:
2.u_xmit.v程序源码:
3.u_rec.v程序源码:
步骤一、变量<pc,exp>列表的生成。
以u_xmit.v的第60-67行代码为例,其对应的控制流图以ENTER_3为根结点,以EXIT_215为最后的结点。结点名称的格式为“结点类型_源码行号”。ENTER_3代表了在u_xmit.v文件中的第三行代码:“module u_xmit(sys_clk,
sys_rst_l,uart_xmitH,xmitH,xmit_dataH,xmit_doneH);”,EXIT_215结点代表了在u_xmit.v文件中的第215行代码:“endmodule”。ALWAYS_60代表的第60代码的后继代码是第61行“case”语句CASE_61,CASE_61有五个分支后继,分别是CASE_ITME_62到CASE_ITME_66。分支CASE_ITEM_62的后继语句是第62行的阻塞赋值语句ASSIGN_BLOCK_62。ASSIGN_BLOCK_62的后继语句是第67行的“endcase”语句CASE_END_67。CASE_END_67的后继语句是always语句结束结点ALWAYS_END_67。其他分支具有相同解释。
具体生成u_xmit.v文件第60-67行代码的控制流图的过程如下:
1)深度遍历u_xmit.v文件的语法解析树,获取语句结点的信息。得到的语句信息是:
(1)第0个结点,ENTER结点ENTER_3,索引值0,控制区间[3,215](3和215表示语句所在的行号,后继步骤方括号中数值表示相同含义);
(2)第1个结点,always结点ALWAYS_60,对应第60行的always语句,索引值1,控制区间[60,67],其控制结点为ENTER_3,ENTER_3的控制区间为[3,215];
(3)第2个结点,case结点CASE_61,对应第61行的case语句,索引值2,控制区间[61,67],其控制结点为ALWAYS_60,ALWAYS_60的控制区间为[60,67];
(4)第3个结点,case_itme结点CASE_ITEM_62,索引值3,控制区间[62,62],其控制结点为CASE_61,CASE_61的控制区间为[61,67];
(5)第4个结点,阻塞赋值结点ASSIGN_BLOCK_62,索引值4,其控制结点为CASE_ITEM_62,CASE_ITEM_62结点控制区间为[62,62];
(6)第5个结点,endcase结点CASE_END_67,索引值5,控制区间[67,67],其控制结点为CASE_61,CASE_61的控制区间为[61,67];
(7)第6个结点,always结束结点ALWAYS_END_67,索引值6,控制区间[67,67],其控制结点为ALWAYS_60,ALWAYS_60的控制区间为[60,67];
(8)第7个结点,case_item语句结点CASE_ITEM_63,索引值7,控制区间[63,63],其控制结点为CASE_61,CASE_61的控制区间为[61,67];
(9)第8个结点,阻塞赋值结点ASSIGN_BLOCK_63,索引值8,其控制结点为CASE_ITEM_63,CASE_ITEM_63结点的控制区间为[63,63];
(10)以此类推,分析完剩余的三个分支和剩余的u_xmit.v中的代码。
(11)最后一个结点是模块结束语句结点EXIT_215,索引值191,控制区间[215,215],其控制结点为ENTER_3,ENTER_3的控制区间为[3,215];
2)通过语句结点之间的控制区间所属关系,建立各个结点之间的前驱和后继关系。对于1)中得到的语句结点,
(1)结点0为ENTER_3结点,是根结点;
(2)结点1为always结点ALWAYS_60,因为其控制结点0为ENTER_3,所以结点1的前驱包含结点0,结点0的后继包含结点1;
(3)结点2为case结点CASE_61,因为其控制结点1为ALWAYS_60,所以结点2的前驱包含结点1,结点1的后继包含结点2;
(4)结点3为case_itme结点CASE_ITEM_62,因为其控制结点2为CASE_61,所以结点3的前驱包含结点2,结点2的后继包含结点3;
(5)结点4为阻塞赋值结点ASSIGN_BLOCK_62,因为其控制结点3为CASE_ITEM_62,所以结点4的前驱包含结点3,结点3的后继包含结点4;
(6)结点5为endcase结点CASE_END_67,因为其为语句段结束结点,所以结点5的前驱包含结点4,结点4的后继包含结点5;
(7)结点6为always结束结点ALWAYS_END_67,因为其语句段结束结点,所以结点6的前驱包含结点5,结点5的后继包含结点6;
(8)结点191为模块结束语句结点EXIT_215,因为其为结束结点,所以结点191的前驱包含结点6,结点6的后继包含结点191;
(9)结点7为case_item语句结点CASE_ITEM_63,因为其控制结点2为CASE_61,所以结点7的前驱包含结点2,结点2的后继包含结点7;
(10)结点8为阻塞赋值结点ASSIGN_BLOCK_63,因为其控制结点7为结点CASE_ITEM_63,所以结点8的前驱包含结点7,结点7的后继包含结8;
(11)以此类推,分析完剩余的三个分支中语句结点的前驱和后继关系。
3)根据广度优先算法进行遍历,最后得到u_xmit.v文件中第60-67行代码的控制流图。
整过控制流图的生成过程首先采用开源的antlr4以及Terence Parr撰写的verilog2001.g4,解析Verilog寄存器传输级设计代码的语法。依次提取每条Verilog语句的语法信息进行分析,设计生成控制流图的语句结点。一条语句对应控制流图中的一个结点,语句结点的类型针对Verilog可综合的语句设定。根据语句结点类型建立语句结点之间的前驱和后继关系:语句结点之间的控制流关系体现在控制结点之间以及控制结点和赋值结点之间的连接,对于赋值结点之间的连接,不表示控制关系,只是表示出赋值结点代表的语句在代码中的位置关系,添加的ENTER结点是整个代码的开始结点,EXIT结点是整个代码的结束结点,always语句段,例化语句和连续赋值语句之间是并行关系,always语句段内的if、case、for语句之间存在着语法相关的控制区间和控制顺序的关系;根据控制区间和控制关系确定出各个语句结点之间的前驱和后继关系。依据每个语句结点之间的前驱和后继关系,采用广度优先遍历,最终生成Verilog代码的控制流图。
以下步骤表明了变量uart_xmitH的<pc,exp>列表的生成。
(1)u_xmit模块对应控制流图的根结点是ENTER_3。使node=ENTER_3。
(2)深度遍历控制流图,还有结点没有被访问,取ENTER_3的后继结点ALWAYS_60,使node=ALWAYS_60。现在node的控制结点是ENTER_3,使controlNode=ENTER_3。
(3)判断node的类型。当前node类型为ALWAYS语句,则使node(ALWAYS_60)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)。
(4)深度遍历控制流图,还有结点没有被访问,取ALWAYS_60的后继结点CASE_61,使node=CASE_61。现在node的控制结点是ALWAYS_60,使controlNode=ALWAYS_60。
(5)判断node的类型。当前node类型为CASE语句,则使node(CASE_61)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)。
(6)深度遍历控制流图,还有结点没有被访问,取CASE_61的后继结点CASE_ITEM_62,使node=CASE_ITEM_62。现在node的控制结点是CASE_61,使controlNode=CASE_61。
(7)判断node的类型。当前node类型为CASE_ITEM语句,则使node(CASE_ITEM_62)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)&(xmitDataSelH==x_STARTbit)。
(8)深度遍历控制流图,还有结点没有被访问,取CASE_ITEM_62的后继结点ASSIGN_BLOCK_62,使node=ASSIGN_BLOCK_62。现在node的控制结点是CASE_ITEM_62,使controlNode=CASE_ITEM_62。
(9)判断node的类型。当前node类型为ASSIGN_BLOCK语句,则使node(ASSIGN_BLOCK_62)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)&(xmitDataSelH==x_STARTbit)。得到变量uart_xmitH的一个<pc,exp>对,其中pc=(xmit_ShiftRegH orxmitDataSelH)&(xmitDataSelH==x_STARTbit);exp=(uart_xmitH=LO)。
(10)深度遍历控制流图,还有结点没有被访问,取ASSIGN_BLOCK_62的后继结点CASE_END_67,使node=CASE_END_67。现在node的控制结点是CASE_61,使controlNode=CASE_61。
(11)判断node的类型。当前node类型为CASE_END语句,则使node(CASE_END_67)的路径条件列表=xmit_ShiftRegH or xmitDataSelH。
(12)深度遍历控制流图,还有结点没有被访问,取CASE_END_67的后继结点ALWAYS_END_67,使node=ALWAYS_END_67。现在node的控制结点是ALWAYS_60,使controlNode=ALWAYS_60。
(13)判断node的类型。当前node类型为ALWAYS_END语句,则使node(ALWAYS_END_67)的路径条件列表=xmit_ShiftRegH or xmitDataSelH。
(14)深度遍历控制流图,还有结点没有被访问,取CASE_61的后继结点CASE_ITEM_63,使node=CASE_ITEM_63。现在node的控制结点是CASE_61,使controlNode=CASE_61。
(15)判断node的类型。当前node类型为CASE_ITEM语句,则使node(CASE_ITEM_63)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)&(xmitDataSelH==x_STOPbit)。
(16)深度遍历控制流图,还有结点没有被访问,取CASE_ITEM_63的后继结点ASSIGN_BLOCK_63,使node=ASSIGN_BLOCK_63。现在node的控制结点是CASE_ITEM_63,使controlNode=CASE_ITEM_63。
(17)判断node的类型。当前node类型为ASSIGN_BLOCK语句,则使node(ASSIGN_BLOCK_63)的路径条件列表=(xmit_ShiftRegH or xmitDataSelH)&(xmitDataSelH==x_STOPbit)。得到变量uart_xmitH的一个<pc,exp>对,其中pc=(xmit_ShiftRegH orxmitDataSelH)&(xmitDataSelH==x_STOPbit);exp=(uart_xmitH=HI)。
(18)深度遍历控制流图,还有结点没有被访问。后继依次取CASE_ITEM_64,CASE_ITEM_65,CASE_ITEM_66分支遍历。最终得到变量uart_xmitH的所有<pc,exp>对。
得到Verilog模块对应的控制流图后,深度遍历Verilog模块对应的控制流图,如果遍历结束则步骤一结束。如果遍历没有结束则取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode。判断node的类型,如果node的结点类型是ALWAYS,则always语句的事件列表加入到node的路径条件中。如果node的结点类型是IF,则将控制结点controlNode的路径条件列表合并上当前if语句的条件,作为node的路径条件列表。如果node的结点类型是ELSE,则controlNode路径条件列表中最后一个条件取反作为node的路径条件。如果node的结点类型是CASE,则将controlNode的路径条件列表作为node的路径条件列表。如果node的结点类型是CASE_ITME,并且是default语句结点时,controlNode的路径条件列表合并上case语句默认路径条件作为node的路径条件列表;当不是default语句结点时,controlNode的路径条件列表合并上node的语句条件作为node的路径条件列表。如果是赋值语句,controlNode的路径条件列表作为node的路径条件列表,同时node的路径条件列表作为pc,node的赋值表达式作为exp,构成node左边变量的<pc,exp>。其他情况下,controlNode的路径条件列表作为node的路径条件列表。判断是否所有结点都访问完,如果没有访问完,则继续取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode,然后判断node的类型进行相应的处理。如果所有结点都访问完,深度优先遍历控制流图结束。
步骤二、SMV模型的构建。
1)VAR变量定义。
Uart.v文件中第6-9行的变量定义,对应的SMV模型为VAR类型。具体定义的SMV模型代码为:
Verilog模块中所有wire,reg,tri,integer类型转换完成,写入到字符串smv中。
2)DEFINE常量定义。
Uart.v文件中第30-33行的parameter类型,对应的SMV模型为DEFINE类型。
具体定义的SMV模型代码为:
Verilog模块中所有parameter类型转换完成,添加到字符串smv中。
3)函数语句定义。
Uart.v文件中,第60-66行的例化语句,其SMV模型代码如下:
MODULE u_xmit(sys_clk,sys_rst_l,uart_xmitH,xmitH,xmit_dataH,xmit_doneH)
Verilog模块中所有例化语句转换完成,添加到字符串smv中。
4)其他Verilog语句的SMV模型定义。
处理变量的<PC,EXP>列表,变量REC_DATAH是在连续赋值语句中,则设定字符串变量NUSMV_STRING等于表达式“REC_DATAH:=PAR_DATAH;”。U_REC.V中第60行,变量REC_DATAH对应的SMV模型如表1所示。表1的字符串内容添加到NUSMV_STRING,NUSMV_STRING添加到字符串SMV。
表1:连续赋值语句的SMV模型
U_XMIT.V中第60-67行的组合逻辑语句,变量UART_XMITH是在组合逻辑中的阻塞赋值语句中,则设定字符串NUSMV_STRING等于表达式“UART_XMITH:=CASE”。依据步骤一最后得到的变量UART_XMITH的<PC,EXP>列表,UART_XMITH对应的SMV模型如表2所示。表2的字符串内容添加到NUSMV_STRING,NUSMV_STRING添加到字符串SMV。
表2:组合逻辑语句的SMV模型
U_XMIT.V中第69-72行的时序逻辑语句,变量是在时序逻辑中的非阻塞赋值语句中,则设定变量NUSMV_STRING等于表达式“NEXT(BITCELL_CNTRH):=CASE”,变量BITCELL_CNTRH对应的SMV模型如表3所示。表3的字符串内容添加到NUSMV_STRING,NUSMV_STRING添加到字符串SMV。
表3:时序逻辑语句的SMV模型
每个变量生成的SMV模型保存在字符串nusmv_string中,将每个变量的nusmv_string逐个添加到字符串smv中。最终,字符串smv中包含了Verilog模块对应的完整SMV模型,将字符串smv输出为SMV文件。
根据步骤一生成变量的<pc,exp>列表、Verilog代码中的变量定义、参数常量定义等信息构建模型检测用的SMV模型。将Verilog代码中的reg和wire类型变量转换为NuSMV的VAR类型变量,VAR变量写入字符串smv;将Verilog代码中的parameter类型转换为NuSMV的DEFINE标识符,将DEFINE标识符添加到smv;将例化语句转换为NuSMV的函数语句,函数语句添加到smv。处理变量的<pc,exp>列表,如果变量是在连续赋值语句中,则设定字符串变量nusmv_string等于表达式“variable:=exp的NuSMV形式;”。如果变量是在组合逻辑中的阻塞赋值语句中,则设定变量nusmv_string等于表达式“variable:=case”;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式“variable:=case”;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式“next(variable):=case”。如果变量是在时序逻辑中的非阻塞赋值语句中,则设定变量nusmv_string等于表达式“next(variable):=case”;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式“variable:=case”;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式“next(variable):=case”。依据<pc,exp>将Verilog阻塞赋值语句和非阻塞赋值语句构建为NuSMV的case语句,即一个<pc,exp>表达为“pc:exp”的形式。一个变量的<pc,exp>列表都转换添加到变量nusmv_string。将每个变量的nusmv_string添加到字符串smv。将字符串smv的内容写入到SMV文件,生成SMV模型。
步骤三、依据硬件设计规范,设定待验证硬件设计的属性,使用计算树逻辑CTL表达。
现设定验证属性:
AG((sys_rst_l=0ud1_1)&(xmit_doneH=0ub1_1)&
(rec_readyH=0ub1_1)&(xmitH=0ub1_0)
->(xmit_dataH=rec_dataH))
该属性在uart.v对应的SMV模型uart.smv中进行验证,uart.smv中包含了u_xmit.smv和u_rec.smv模型。属性中的变量名称对应着uart.v文件中的变量名,并保持一致。
该属性的含义是:在复位信号sys_rst_l置“1”后,如果发送端(u_xmit.smv)数据数据已经发送完(xmit_doneH=0ub1_1),并且接收端(u_rec.smv)也已经接收完,在还没有新的数据开始传输前(xmitH=0ub1_0),发送和接收到的数据应该是一样的(xmit_dataH=rec_dataH)。这个属性应该是被一直满足的(AG)。
步骤四、对步骤二中得到的SMV模型,利用NuSMV验证步骤三中设定的属性。验证结果为假,输出一个反例,验证不通过。在反例的状态序列中出现了输入数据为8’hAA,8’h55,8’h00和8’hFF的序列。
步骤五、依据步骤四中得到的反例,确定出Verilog代码中的不安全代码。从反例中得到的输入数据8’hAA,8’h55,8’h00和8’hFF的序列,确定出u_xmit.v中的116-147行的状态机为不安全代码。在反例显示的最终状态中,sys_rst_l=0ud1_1,xmit_doneH=0ud1_1,rec_readyH=0ub1_1,xmitH=0ub1_0,xmit_dataH=0ud8_255,rec_dataH=0ud8_0。出现这种状态的原因是,木马在输入数据出现8’hAA,8’h55,8’h00和8’hFF序列时,提前将xmit_doneH置“1”,导致接收端误判数据0xFF已经发送完,而实际上没有发送完。
Claims (1)
1.一种寄存器传输级Verilog代码的SMV模型构建方法,其特征在于包括以下步骤:
步骤一、设计控制流图中的语句结点类型:ALWAYS,ALWAYS_END,IF,ELSE,IF_END,CASE,CASEX,CASEZ,CASE_ITEM,CASE_END,FOR,FOR_END,TASK,TASK_END,ASSIGN_BLOCK,ASSIGN_NONBLOCK,ASSIGN_CONTINUOUS,INSTANTIATION;整个代码的开始增加一个ENTER结点,对应module语句,结束增加一个EXIT结点,对应endmodule,不确定类型是NONE结点,其中always,if,casex,casez,for,task所对应的结点为控制结点,ENTER和EXIT是控制结点,阻塞赋值、非阻塞赋值和连续赋值为赋值结点;
采用开源的antlr4以及Terence Parr撰写的verilog2001.g4,解析Verilog寄存器传输级设计代码的语法;
依次提取每条Verilog语句的语法信息进行分析,设计生成控制流图的语句结点;一条语句对应控制流图中的一个结点,语句结点的类型针对Verilog可综合的语句设定;根据语句结点类型建立语句结点之间的前驱和后继关系:语句结点之间的控制流关系体现在控制结点之间以及控制结点和赋值结点之间的连接,对于赋值结点之间的连接,不表示控制关系,只是表示出赋值结点代表的语句在代码中的位置关系,添加的ENTER结点是整个模块的开始结点,EXIT结点是整个模块的结束结点,always语句段,例化语句和连续赋值语句之间是并行关系,always语句段内的if、casex,casez、for语句之间存在着语法相关的控制区间和控制顺序的关系;根据控制区间和控制关系确定出各个语句结点之间的前驱和后继关系;依据每个语句结点之间的前驱和后继关系,采用广度优先遍历,生成Verilog代码的控制流图;
得到Verilog模块对应的控制流图后,生成Verilog代码的路径条件pc和对应表达式exp的关系对<pc,exp>,每一个赋值表达式的左边变量拥有一个或者多个<pc,exp>;深度遍历Verilog模块对应的控制流图,如果遍历结束则步骤一结束;如果遍历没有结束则取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode;判断node的类型,如果node的结点类型是ALWAYS,则always语句的事件列表加入到node的路径条件中;如果node的结点类型是IF,则将控制结点controlNode的路径条件列表合并上当前if语句的条件,作为node的路径条件列表;如果node的结点类型是ELSE,则controlNode路径条件列表中最后一个条件取反作为node的路径条件;如果node的结点类型是CASE,则将controlNode的路径条件列表作为node的路径条件列表;如果node的结点类型是CASE_ITME,并且是default语句结点时,controlNode的路径条件列表合并上case语句默认路径条件作为node的路径条件列表;当不是default语句结点时,controlNode的路径条件列表合并上node的语句条件作为node的路径条件列表;如果是赋值语句,controlNode的路径条件列表作为node的路径条件列表,同时node的路径条件列表作为pc,node的赋值表达式作为exp,构成node左边变量的<pc,exp>;其他情况下,controlNode的路径条件列表作为node的路径条件列表;判断是否所有结点都访问完,如果没有访问完,则继续取出控制流图中还没有被访问过的结点node,得到node的控制结点controlNode,然后判断node的类型进行相应的处理;如果所有结点都访问完,深度优先遍历控制流图结束;
步骤二、根据步骤一生成变量的<pc,exp>列表,Verilog代码中的变量定义、参数常量定义等信息构建模型检测用的SMV模型;将Verilog代码中的reg,wire,tri和integer类型变量转换为NuSMV的VAR类型变量,VAR变量写入字符串smv;将Verilog代码中的parameter类型转换为NuSMV的DEFINE标识符,将DEFINE标识符添加到smv;将例化语句转换为NuSMV的函数语句,函数语句添加到smv;处理变量的<pc,exp>列表,如果变量是在连续赋值语句中,则设定字符串变量nusmv_string等于表达式variable:=exp的NuSMV形式;如果变量是在组合逻辑中的阻塞赋值语句中,则设定变量nusmv_string等于表达式variable:=case;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式variable:=case;如果变量是在组合逻辑中的非阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式next(variable):=case;如果变量是在时序逻辑中的非阻塞赋值语句中,则设定变量nusmv_string等于表达式next(variable):=case;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式variable:=case;如果变量是在时序逻辑中的阻塞赋值语句中,并且如果exp右边部分中的变量没有在相同的always语句块中被赋值,则设定变量nusmv_string等于表达式next(variable):=case;依据<pc,exp>将Verilog阻塞赋值语句和非阻塞赋值语句构建为NuSMV的case语句,即一个<pc,exp>表达为pc:exp的形式;一个变量的<pc,exp>列表都转换添加到变量nusmv_string;将每个变量的nusmv_string添加到字符串smv;将字符串smv的内容写入到SMV文件,生成SMV模型;
步骤三、依据硬件设计规范,设定待验证硬件设计的属性,用计算树逻辑CTL表达;
步骤四、对步骤二中得到的SMV模型,利用NuSMV验证步骤三中设定的属性;如果验证结果为真,则步骤三的属性得到满足,验证通过;如果验证结果为假,则会有一个反例输出,验证不通过;反例包含了一个状态序列,该序列中的每一个状态都具体表明了Verilog代码中每一个变量的值;
步骤五、依据步骤四中得到的反例,确定出Verilog代码中的不安全代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910010500.6A CN109725900B (zh) | 2019-01-07 | 2019-01-07 | 寄存器传输级Verilog代码的SMV模型构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910010500.6A CN109725900B (zh) | 2019-01-07 | 2019-01-07 | 寄存器传输级Verilog代码的SMV模型构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109725900A true CN109725900A (zh) | 2019-05-07 |
CN109725900B CN109725900B (zh) | 2021-01-05 |
Family
ID=66298817
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910010500.6A Active CN109725900B (zh) | 2019-01-07 | 2019-01-07 | 寄存器传输级Verilog代码的SMV模型构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109725900B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814417A (zh) * | 2020-06-11 | 2020-10-23 | 杭州电子科技大学 | 一种基于字符分隔值文件转换Verilog代码的方法 |
CN112445492A (zh) * | 2020-12-02 | 2021-03-05 | 青岛海洋科学与技术国家实验室发展中心 | 一种基于antlr4的源码翻译方法 |
CN113568598A (zh) * | 2021-09-26 | 2021-10-29 | 中科亿海微电子科技(苏州)有限公司 | 基于yosys实现求和运算的FPGA逻辑综合方法及装置 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6665848B2 (en) * | 2001-01-12 | 2003-12-16 | International Business Machines Corporation | Time-memory tradeoff control in counterexample production |
US7146605B2 (en) * | 2001-01-15 | 2006-12-05 | International Business Machines Corporation | Automatic abstraction of software source |
US20130103321A1 (en) * | 2011-10-24 | 2013-04-25 | Somalogic, Inc. | Selection of Preferred Sample Handling and Processing Protocol for Identification of Disease Biomarkers and Sample Quality Assessment |
US8726241B1 (en) * | 2007-06-06 | 2014-05-13 | Rockwell Collins, Inc. | Method and system for the development of high-assurance computing elements |
CN107367686A (zh) * | 2017-06-19 | 2017-11-21 | 西北工业大学 | 一种rtl硬件木马测试向量的生成方法 |
CN109002601A (zh) * | 2018-07-06 | 2018-12-14 | 西安电子科技大学 | 一种基于Petri网的FPGA系统的验证模型建模方法 |
CN109101239A (zh) * | 2018-08-30 | 2018-12-28 | 杭州电子科技大学 | 一种在线Verilog代码自动判决系统的标准答案生成方法 |
-
2019
- 2019-01-07 CN CN201910010500.6A patent/CN109725900B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6665848B2 (en) * | 2001-01-12 | 2003-12-16 | International Business Machines Corporation | Time-memory tradeoff control in counterexample production |
US7146605B2 (en) * | 2001-01-15 | 2006-12-05 | International Business Machines Corporation | Automatic abstraction of software source |
US8726241B1 (en) * | 2007-06-06 | 2014-05-13 | Rockwell Collins, Inc. | Method and system for the development of high-assurance computing elements |
US20130103321A1 (en) * | 2011-10-24 | 2013-04-25 | Somalogic, Inc. | Selection of Preferred Sample Handling and Processing Protocol for Identification of Disease Biomarkers and Sample Quality Assessment |
CN107367686A (zh) * | 2017-06-19 | 2017-11-21 | 西北工业大学 | 一种rtl硬件木马测试向量的生成方法 |
CN109002601A (zh) * | 2018-07-06 | 2018-12-14 | 西安电子科技大学 | 一种基于Petri网的FPGA系统的验证模型建模方法 |
CN109101239A (zh) * | 2018-08-30 | 2018-12-28 | 杭州电子科技大学 | 一种在线Verilog代码自动判决系统的标准答案生成方法 |
Non-Patent Citations (4)
Title |
---|
DEXI WANG等: "Deadlock Detection in FPGA Design: A Practical Approach", 《TSINGHUA SCIENCE AND TECHNOLOGY》 * |
沈利香: "基于GA与BP神经网络的网络入侵检测组合模型研究", 《常州工学院学报》 * |
逄涛: "WISHBONE片上总线符号模型检测", 《计算机研究与发展》 * |
黄兴利等: "一种精确故障效应传播的形式化模型", 《西北工业大学学报》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814417A (zh) * | 2020-06-11 | 2020-10-23 | 杭州电子科技大学 | 一种基于字符分隔值文件转换Verilog代码的方法 |
CN111814417B (zh) * | 2020-06-11 | 2023-09-26 | 杭州电子科技大学 | 一种基于字符分隔值文件转换Verilog代码的方法 |
CN112445492A (zh) * | 2020-12-02 | 2021-03-05 | 青岛海洋科学与技术国家实验室发展中心 | 一种基于antlr4的源码翻译方法 |
CN112445492B (zh) * | 2020-12-02 | 2024-03-29 | 青岛海洋科技中心 | 一种基于antlr4的源码翻译方法 |
CN113568598A (zh) * | 2021-09-26 | 2021-10-29 | 中科亿海微电子科技(苏州)有限公司 | 基于yosys实现求和运算的FPGA逻辑综合方法及装置 |
CN113568598B (zh) * | 2021-09-26 | 2021-12-14 | 中科亿海微电子科技(苏州)有限公司 | 基于yosys实现求和运算的FPGA逻辑综合方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109725900B (zh) | 2021-01-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101464905B (zh) | 一种网页信息抽取的系统及方法 | |
Maler et al. | Monitoring properties of analog and mixed-signal circuits | |
CN109725900A (zh) | 寄存器传输级Verilog代码的SMV模型构建方法 | |
CN104169909B (zh) | 上下文解析装置及上下文解析方法 | |
CN106446232A (zh) | 一种基于规则的敏感文本过滤方法 | |
CN103473056B (zh) | 一种遥测配置文件自动生成方法 | |
US20070006128A1 (en) | Method for evaluating dynamic expressions | |
CN106067094A (zh) | 一种动态评估方法及系统 | |
CN107367686B (zh) | 一种rtl硬件木马测试向量的生成方法 | |
CN104991863A (zh) | 一种基于功能块图测试模型自动生成测试用例的方法 | |
CN103559122A (zh) | 基于程序行为切片的测试案例约减方法 | |
US8838559B1 (en) | Data mining through property checks based upon string pattern determinations | |
CN107609325A (zh) | 基于sat的故障树求解最小割集的方法 | |
CN108279885A (zh) | 一种对多个模型代码进行软件集成的方法及装置 | |
CN105279345B (zh) | 一种航天器用数字软ip核评测方法 | |
US20090319246A1 (en) | Detection program, detecting device, and detecting method | |
CN110162297A (zh) | 一种源代码段自然语言描述自动生成方法及系统 | |
CN107656921A (zh) | 一种基于深度学习的短文本依存分析方法 | |
CN109783565A (zh) | 一种excel数据快速导入的方法和系统 | |
CN105224455B (zh) | 一种自动生成字符串类型测试用例的方法 | |
CN110471835A (zh) | 一种基于电力信息系统代码文件的相似度检测方法及系统 | |
Tappler et al. | Active model learning of stochastic reactive systems | |
CN107247827A (zh) | 基于机器学习的虚端子模型建模及自动连线方法 | |
CN106598843B (zh) | 一种基于程序分析的软件日志行为自动识别方法 | |
CN106021631A (zh) | 交互式数字集成电路仿真验证方法、服务器、客户端及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20201012 Address after: No. 127 Youyi West Road, Shaanxi, Xi'an Applicant after: Northwestern Polytechnical University Applicant after: Huaxin Anxin (Beijing) Technology Co., Ltd Address before: 710072 Xi'an friendship West Road, Shaanxi, No. 127 Applicant before: Northwestern Polytechnical University |
|
GR01 | Patent grant | ||
GR01 | Patent grant |