随着模型变得复杂,c model中分支代码可能越来越多。为了减少验证复杂度,c2rtl引入了代码剪裁(code pruning)特征。
c2rtl通过constant propagation和形式化分析,找到不影响cmodel 输出或者用户定义的assertion的代码,尽可能将其剪裁掉。
基于constant propagation的代码剪枝:
在cmodel中可能存在一些情况,例如,某些分支的走向可以在运行代码之前分析出来,或者某些变量与输出并不相关。比如:
代码中,select变量值已经确定,if-else分支会走false分支。因此,c2rtl不会分析true分支,同时,select变量也会忽略。
基于 Dynamic Path pruning 的代码剪枝:
1. if-else分支剪枝
在验证过程中,cmodel中的变量取值并不完全,变量中某些bit取值可能是不变的,而这些特性需要进行形式化分析才能得出结论,这一过程是在RTL synthesis之前完成的。
上图中,如果cond经过形式化分析,只有0x0,0x1分支能够取到,则后两个分支也会被忽略。
2.for 剪枝
形式化验证过程中,c2rtl前端在综合之前需要将for循环展开成并行执行的语句。默认情况下,for循环会展开256次。但是某些for循环由变量来控制循环次数,对于这些for循环,c2rtl可以通过分析代码来确定一个展开的上界N。
在上图中,N为一个4bit的变量,因此可以确定for循环展开不会超过16次。
用户可以自定义for循环展开的次数,使用:
check_c2rtl -compile... -unwind_limit <N>
或更精确的自定义展开:
check_c2rtl -set_bound -loop -file <filename> -line <line_num> -bound <bound>
check_c2rtl -set_unwind_limit -loop -file <filename> -name <name> -bound <bound>