覆盖率选项
通常我们对项目只编译一次,然后进行多次仿真,那么生成的回归结果目录下(也即编译目录),关于覆盖率主要包含两部分信息:
1、编译设计及环境信息(包含设计层次的hierarchy信息)
该信息包含在使用编译选项-cm_dir指定的xxx_compile_path路径下的xxx.vdb中,参考编译命令如下:
vcs -cm line+tgl \
-cm_dir xxx_compile_path/xxx.vdb \
-f xxx_path/xxx.fl \
-l xxx_compile_path/xxx_compile.log
简单解释如下:
-cm line+tgl :表示收集代码行覆盖率和翻转覆盖率,除此之外还有cond|fsm|branch|assert
-cm_dir xxx_compile_path/xxx.vdb:指定生成的编译设计及环境信息的路径和名称
-f xxx_path/xxx.fl:指定吃进去的设计和验证环境文件列表
-l xxx_compile_path/xxx_compile.log: 指定生成的编译日志的路径和名称
通常这里的xxx_compile_path也就是regression的回归路径。
2、仿真及覆盖率信息
会有多个测试用例所对应的目录(学习过python课程中最后一个项目的同学应该知道我在说啥),每个测试用例的结果目录里都有对应的覆盖率信息,并且这些覆盖率信息包含在xxx.vdb目录中。
参考仿真命令如下:
simv -cm line+tgl \
-cm_dir xxx_compile_path/xxx_testcase_path/xxx.vdb \
-cm_name xxx_test_name \
-cm_test xxx_compile_path/xxx_testcase_path/xxx_test_name \
-l xxx_compile_path/xxx_testcase_path/sim.log
简单解释如下:
-cm line+tgl :表示收集代码行覆盖率和反转覆盖率
-cm_dir xxx_compile_path/xxx_testcase_path/xxx.vdb:指定生成的仿真覆盖率信息的路径和名称
-cm_name xxx_test_name :用于指定覆盖率信息在simv.vdb文件中的所在目录名称
-cm_test xxx_compile_path/xxx_testcase_path/xxx_test_name :类似-cm_name,后面会解释
-l xxx_compile_path/xxx_testcase_path/sim.log: 指定生成的仿真日志的路径和名称
默认情况下VCS会在仿真目录./simv.vdb/snps/coverage/db/testdata下产生以下xml后缀文件来指示覆盖率信息:
line.verilog.data.xml 用于指示 line coverage
fsm.verilog.data.xml 用于指示 FSM coverage
cond.verilog.data.xml 用于指示 condition coverage
tgl.verilog.data.xml 用于指示 toggle coverage
branch.verilog.data.xml 用于指示 branch coverage
但是也可以通过-cm_name配合-cm_test来指定在./simv.vdb/snps/coverage/db/testdata/xxx_test_name下产生上述覆盖率xml文件,这样当在同一个用例下进行仿真时,就可以通过不同的目录名字来区别每次仿真带来的覆盖率信息的不同,这样就可以知道某个信号的覆盖率是该测试用例下哪次仿真产生的(通常不同seed来仿真同一个测试用例)。
简单说,就是如果要在同一个case跑不同seed且要区分每次不同seed仿真的覆盖率信息的话,需要使用到编译选项-cm_name和-cm_test。
合并覆盖率
接着上面,如果要合并一次回归仿真的覆盖率,需要使用如下命令进行合并:
urg -dir xxx_compile_path/xxx.vdb \
-dir xxx_compile_path/xxx_testcase_path1/xxx.vdb \
-dir xxx_compile_path/xxx_testcase_path2/xxx.vdb \
...
-dir xxx_compile_path/xxx_testcase_pathN/xxx.vdb \
-dbname simv_merge.vdb
可以看到这里将一次回归中的多个仿真用例下的xxx.vdb进行了合并,最终得到了合并后的覆盖率信息simv_merge.vdb。
如果不想产生urgReport的话,可以加上-noreport选项。
如果是合并两次回归之后的simv_merge.vdb,则可以使用如下命令进行:
urg -dir xxx_path1/xxx_simv_merge1.vdb \
-dir xxx_path2/xxx_simv_merge2.vdb \
-dbname simv_merge.vdb
如果vdb文件很多的话,也可以通过指定filelist来合并:
urg -f xxx_path/xxx_vdb.fl \
-dbname simv_merge.vdb
有时候我们需要把两个不同的仿真环境的覆盖率进行合并,而且只是将其中一个环境中的某个模块的覆盖率合并到另一个,比如常见的模块级IP验证的覆盖率合并到SOC环境的整体覆盖率中,如图:
把右边的md3模块的覆盖率合并到左边的在mod1中例化的md3a和md3b模块中,可以参考使用如下命令:
urg -dir top1.vdb tbblk.vdb -map md3
这样就把tbblk模块中例化的md3子模块的覆盖率合并到左边的top1模块下的覆盖率中去了。
查看覆盖率
合并完之后,可以使用如下命令打开图形界面进行查看:
dve -cov -dir simv_merge.vdb &
如果要打开某一次回归中的某个测试用例产生的覆盖率,则使用如下命令来打开:
dve -cov \
-dir xxx_compile_path/xxx.vdb \
-dir xxx_compile_path/xxx_testcase_path1/xxx.vdb
这里的第一个-dir是为了读取编译设计及环境信息(包含设计层次的hierarchy信息)。
但是我想知道是哪个测试用例对特定的信号覆盖率进行覆盖,怎么办?
或者说,我想知道该测试用例对于提升覆盖率有没有帮助,帮助提升在哪了,或者我想把对覆盖率提升没有帮助的测试用例删除,想实现上述目标需要确切的知道覆盖率信息是由哪个测试用例带来的。
可以使用如下命令:
urg -dir xxx_compile_path/xxx.vdb \
-dir xxx_compile_path/xxx_testcase_path1/xxx.vdb \
-dir xxx_compile_path/xxx_testcase_path2/xxx.vdb \
...
-dir xxx_compile_path/xxx_testcase_pathN/xxx.vdb \
-dbname simv_merge.vdb \
-show tests
然后使用命令:
urg -dir simv_merge.vdb -grade testfile
此时会在当前目录的urgReport下产生一个gradedtests.txt文件,来告诉你测试用例对提升覆盖率的贡献排名,这样你就可以更方便的管理你写的测试用例。
然后使用如下命令打开Verid来查看:
verdi -cov -covdir simv_merge.vd
然后选中你想看的覆盖率类型,包括line/toggle/FSM/Condition/Branch/Assert,然后选中想看的目标,比如某行代码或者某个信号,然后右键选择show associated tests,即可在左下角的Test List窗口查看到是哪个测试用例对其进行的覆盖。
小结
一般情况下,掌握以上内容就足够了,实际工作中遇到具体细节问题再查看使用手册解决就好。