文章目录
学习历程
最近在公司接触一个项目,目前testcase已经做完了,在跑代码覆盖率的时候发现覆盖率有些低基本在80%左右,TOGGLE在60%左右,正好趁着这个机会好好学习一下覆盖率的一些知识,也分享给大家,有不对的地方希望大家指正出来。
代码覆盖率
代码覆盖率包括行覆盖率(line),翻转覆盖率(toggle),有限状态机覆盖率(FSM),条件覆盖率(condition),分支覆盖率(branch)。个人感觉白皮书上说的路径覆盖率就是分支覆盖率。上面五个属于代码覆盖率是可以由软件直接生成(本人用的是DVE),不需要添加任何额外的HDL代码,工具会自动帮你完成代码覆盖率的统计。
这里总结一下VCS生成代码覆盖率一些常用的命令:
urg -full64 -dir $(PATH)*.vdb -dbname merged.vdb
urg:可产生覆盖率报告,会将目录下生成的所有vdb文件整合成为一个merged.vdb文件
dve -full64 -cov -covdir $(PATH)/merged.vdb
此命令是将整合后的merged.vdb文件用DVE打开以查看详细覆盖率情况
-cm line+cond+branch+tgl+fsm+assert
-cm选项可控制是否产生上述几种coverage,可以不都添加
-cm_dir $(PATH)
vcs编译完毕后,默认会在编译目录,生成simv.vdb文件夹。该文件夹里面,包含了coverage model。可以通过-cm_dir选项,更改默认的coverage model生成的目录。
-cm_name $(PATH)
对于每一个test,生成的coverage数据,默认是在simv.vdb/snps/coverage/db/testdata/test目录下默认coverage数据,是在test目录下,可以通过-cm_name选项,修改默认的test目录。上述代码会生成在PATH路径下。个人认为设置完
-cm_dir后就不需设置-cm_name了。
功能覆盖率
代码覆盖率是由软件自动生成并不需要手动添加代码而功能覆盖率都需要人为添加覆盖组和覆盖点。
覆盖组与覆盖点
覆盖组与类相似一次定义后可进行多次实例化,且必须实例化后才能生效,它含有覆盖点,交叉覆盖点。
一个覆盖组包含一个或多个覆盖点,全都在同一时间采集。覆盖组可以在程序,模块和类里定义。
覆盖组的两个主要部分是采样的数据和数据被采样的时刻。
覆盖率的收集可以直接使用sample函数来完成,如下代码所示
covergroup fifo_init
WD_init_finish : coverpoint Datacode_vif.init_finish;
endgroup
fifo_init cov_inst = new();
cov_inst.sample(); //sample函数收集覆盖率
断言覆盖率
个人认为断言覆盖率是一种面向控制的覆盖率,用来检查行为序列是否已经发生,由于这种覆盖率本人接触较少在此就不做过多介绍,后续接触到会更新。