上回说到:
c2rtl验证delay cycle不固定的除法模块基本上验不出来。
这回使用sec(sequential equivalence check)来验。(前提你要有一个与你除法模块相似的spec模块,算法最好是差不多,流程结构最好是差不多,这样方便对比中间变量,如果不添加中间变量对比,也几乎验不出来)
假设除法模块参数如下:
module div(clk,rst,a,b,c,ivld,irdy,ovld,ordy)
bit [31:0] inner_value1;
bit [31:0] inner_value2;
bit [31:0] inner_value3;
bit [31:0] inner_value4;
endmodule
//假设除法模块中有几个关键的中间变量
恰好又有一个类似的golden rtl作为spec:
module div2(clk,rst,a,b,c,ivld,irdy,ovld,ordy)
bit [31:0] inner_v1;
bit [31:0] inner_v2;
bit [31:0] inner_v3;
bit [31:0] inner_v4;
endmodule
//假设除法模块中也有几个关键的中间变量
这就比c2rtl简单多了。
编写脚本文件如下:
check_sec -analyze -spec +incdir+ libdir -v2k {div2.v} -v2k {other.v}
check_sec -analyze -imp -v2k {div.v} ;
check_sec -elaborate -spec -top div2 ;
check_sec -elaborate -imp -top div ;
//clock reset
//IO映射
check_sec -map -spec {...} -imp {...}
//添加assumptions
//某个恒成立的 assertion
assert -helper {div.reg1 ==1 |->div.inner_value1 == div2.inner_v1}// 假设reg1==1时相等,在任何情况下都相等
task -create div -copy_assumes
//添加 task div 的三种断言
task -create div_pp -copy_assumes -source_task div
//假设正数除以正数时,div和div2的中间变量2相差两个cycle
assert -task div_pp {div.reg1 ==2 |->div.inner_value2 == $past(div2.inner_v1,2)}// 假设reg1==2时相差两个cycle时相等
task -create div_np -copy_assumes -source_task div
//假设负数除以正数时,div和div2的中间变量3正好对齐
assert -task div_np {div.reg1 ==3 |->div.inner_value3 == div2.inner_v3,2)}// 假设reg1==3时相差两个cycle时相等
//添加其他分组task
从脚本中可以看出,主要过程为
通过分析rtl波形,找出比较关键的中间变量,
分析rtl和spec中中间变量对比的cycle delay成立条件,
添加assertion,约束验证空间。
这种方法能够验全跑通。