[验证百花筒] 详细实例讲解如何将模块级的覆盖率合并到top级
引言
对于复杂模块,通常我们会专门搭建模块级的验证环境详细验证模块的功能,代码覆盖率通常都会达到100%或者指定的验收标准。验证完毕后,该模块又会作为更高一级的DUT例化在其中,姑且我们称之为top级DUT中的一个inst实例,而由于我们模块级已经完整验证了该模块的功能,系统级收集覆盖率的时候我们又不想完全把他exclude掉,或者说模块级我们只收集了一部分覆盖率,另一部分覆盖率我们留在系统级来收集,那么我们就需要将模块级收集的覆盖率与系统级收集的该模块的覆盖率进行合并。本文就用详细实例讲解如何实现上述需求。
仿真环境目录结构
仿真目录文件结构如下图所示:
其中rtl目录包含顶层设计B.v和模块级设计ip.v,需要merge的覆盖率就是ip模块的覆盖率
sim_module目录是模块级仿真目录,收集的覆盖率为sim_module/cov.vdb
sim_top目录为顶层仿真目录,,收集的覆盖率为sim_top/cov.vdb
两级仿真目录有各自的顶层testbench文件tb.sv以及相同的Makefile文件,flist为各自仿真编译需要吃的相关代码文件,cov_file指定覆盖率收集层次。
Makefile核心代码片段如下:
仿真文件介绍
相关文件详细介绍如下
1、最终需要merge的设计文件ip.v
2、模块级仿真(仿真目录sim_module,tb.u_ip)
3、模块级的覆盖率
4、top级代码B.v(例化了模块ip)
5、top级仿真(sim_top目录,tb.b_inst.u_ip)
6、top级覆盖率
7、将模块级ip的覆盖率结果merge到top级覆盖率结果上
模块级和top级各自生成coverage后,通过以下指令进行merge
urg -dir sim_top/cov.vdb sim_module/cov.vdb -dbname merge.vdb -map ip
以上指令分为三部分:
-dir 后面跟的是需要merge的vdb目录(包含若干个参数分别指向多个coverage目录,但是第一个参数作为汇总后的coverage,所以需要把top级的coverage目录作为第一个参数)
-dbname后面跟的是merge后的vdb名字
-map 后面跟的是需要merge coverage的模块名(没有将会报如下图所示的database mismatch)
merge之后的覆盖率结果如下图所示:
如果把模块级的coverage目录作为第一个参数,执行如下指令:
urg -dir sim_module/cov.vdb sim_top/cov.vdb -dbname merge.vdb -map ip
合并后的覆盖率如下图所示,可以发现也可以实现把ip的覆盖率进行合并,但是模块级覆盖率上没有的模块就不会在合并后的覆盖率结果上显示了,这也很好理解,就相当于把top级ip的覆盖率merge到了模块级
总结
本文提供了一种使用synopsys工具urg将模块级覆盖率结果merge到top级的方法,更多实用验证技巧,后面慢慢补上。