覆盖率分为代码覆盖率和功能覆盖率,代码覆盖率常用来作为测试好坏的指标,包含:行覆盖率、条件覆盖率、fsm状态覆盖率、翻转覆盖率和分支(branch)覆盖率5种。
行覆盖率
又称为语句覆盖,用于度量被测量代码中的每个“可执行语句”是否被执行到了,“可执行语句”不会包括代码注释、空行等。
翻转覆盖率
翻转覆盖率的检测检查0-1,1-0跳变,确保每个节点都有0-1,1-0跳变,其检查的对象有:寄存器 、线网变量、 存储单元(需要在编译时打开+memcbk选项)
需要注意的是:x-1和x-0跳转不会做统计。此外,翻转覆盖率消耗更多的资源。
条件覆盖率
条件覆盖率会统计未覆盖到的条件。
状态覆盖率
会查看所有的状态是否被覆盖到,但所有的状态都覆盖到不代表状态之间的跳转覆盖了,还要看各个状态之间的跳转是否满足。
路径覆盖率
代码中一条令下有多个if语句时相当于&,这样的路径才能进一步往后走,if越多路径越长,此时需要判断所有路径都被覆盖到。
覆盖率的查看需要在编译(compile)和仿真(simulation)时设置开关选项,设置的开关选项核心为两个:
-cm <file_type>: -cm <file_type>
用于指定要统计的覆盖率类型,以下列指令为例:-cm line+tgl+fsm+branch+cond 添加该指令后,会统计指定类型的覆盖率信息。
-cm_dir <file_dir> -cm_dir <file_dir>
用于指定转储生成的统计文件的目录,以下列指令为例:-cm_dir ./{OUTPUT}.vdb目录,该目录中存放统计信息文件。如果不添加该指令的话,默认生成的保存覆盖率文件的目录为simv.vdb 在统计时需要的指令为:
dve -covdir simv.vdb &
接下来以一个代码工程为例(源代码后台回复:Coverage获取)进行演示说明:
首先是编译:
vcs ../tb/fsm_top.v ..tb/hello.c ../rtl/fsm_moore.v -debug_all -cm line+tgl+fsm+cond+branch -timescale=1ns/1ns
然后是仿真:
./simv -cm line+tgl+fsm+cond+branch
最后查看覆盖率:
dve -covdir simv.vdb &
演 示
(源代码获取方式,后台回复:Coverage)