IC验证代码覆盖率(code coverage)简析
IC验证的时候会基于验证环境开发很多test case,但是如何衡量那些test case的质量? 或者说一个IP(或SOC)需要开发多少test case 才可以说这个IP(或SOC)的验证已经充分了?答案就是覆盖率。
覆盖率从大的方面分为两类,一类是功能覆盖率(function coverage),另一类是代码覆盖率(code coverage)。
其中功能覆盖率又分为覆盖点(coverage points)和断言(assertion)等,而代码覆盖率又分为行覆盖(line coverage),翻转覆盖(toggle coverage),分支覆盖(branch coverage),条件覆盖(condition coverage),状态机覆盖(FSM coverage)等。
行覆盖(line coverage):这个比较通俗易懂,即DUT的每行代码都要被执行过(即覆盖)。如图1-1,这个模块共有8行代码需要被覆盖,而且实际这8行也都有被覆盖,所以这个模块的line coverage 就是100%。
1-1 line coverage翻转覆盖(toggle coverage):即DUT的每个模块的信号(包括端口信号和内部信号)都有被翻转过(即每一个信号都从0>1,1>0变化过)。如图1-2,我们可以看出rst_n这个信号只从0到1翻转过,但没有从1到0翻转过,所以这个信号没有被toggle。
1-2 toggle coverage分支覆盖(branch coverage):即DUT的所有模块的每个条件分支否有被执行过(包括if,else和case等),如图1-3,即为一个branch ,共两个覆盖点,一个if ,一个else。而这两个分支也都有被覆盖,即它的branch coverage也是100%。
1-3 branch coverage条件覆盖(condition coverage):这个和分支覆盖容易混淆,条件覆盖指可能进入某个分支的所有条件的组合都应该被遍历到。如图1-4,可能进入这个分支的情况共有三种组合,分别为count<8'h05成立,但rst_n不成立;count<8'h05不成立,但rst_n成立;count<8'h05,和rst_n都成立。在这里三种情况也都有被遍历 ,所以这个分支的条件覆盖率也为100%。
1-4 condition coverage状态机覆盖(FSM coverage):这个也比较好理解,即状态机里所有可能发生的状态跳转都要被遍历到。如图1-5,所有状态机的可能发生的跳转状态为6种,但实际上只发生了4种状态跳转,所以这个状态机的覆盖率为66.67%。
1-5 FSM coveragecoverage一般在所有的test case开发完毕或即将开发完毕的时候才会统计,如果使用的仿真器是VCS,那么需要在仿真命令行加上-cm line+tgl+cond+fsm+branch 选项,注意,如果原先的仿真命令行的编译和运行仿真是分开的话,那么在编译和仿真的命令行都要加上这个覆盖率的dump选项。
然后,运行每一支test case的仿真后都会生成一个simv.vdb的覆盖率文件夹,所以run regression的时候,要把这些覆盖率文件夹统一放在一个路径下,等所有的test case 仿真结束后将他们merge在一起 生成一个覆盖率文件夹。merge指令为,urg -dir *.vdb -report both这样就会生成一个merge后的覆盖率文件夹.
1-6 both如图1-6 merge后的文件夹里会有一些html后缀的merge后的覆盖率文件,可以使用火狐浏览器打开这些文件做覆盖率的分析,命令为firefox hierarchy.html & 打开后如图1-7(因为这是一个示例,所以模块比较少),之后就可点击进入NAME列的每一个子模块,进行详细的覆盖率分析。
如果使用的仿真工具是NC,那么需要在仿真命令行上加上,-coverage all 选项,然后根据需求 可以选择dump覆盖率的模块 -covdut dutname ,或者加上生成覆盖率的test的名字 -covtest test_name 等,这样运行每一支test case的仿真后都会生成一个覆盖率文件夹,一般位置在~/cov_work/scope/*里,在文件夹的顶层有一个公共的model文件(.ucm),然后每个具体的test_name文件夹里有一个data(.ucd)文件 ,注意,这个data的文件理论上和公共model的文件同名,只是后缀不同,一个是.ucm后缀一个是.ucd后缀。
和使用VCS仿真一样,当所有的test case使用NC仿真完成后,将这些覆盖率文件merge在一起,merge分两步,一,进入imc的batch模式,使用imc -batch指令,二,使用merge cov_work/scope/* -out all指令将所有test case 的覆盖率文件merge在一起,merge后会生成一个all文件夹,里面含有merge后的model和data文件。然后使用imc -gui &指令启动imc 将merge后的文件夹吃进去进行覆盖率的分析。
覆盖率用于衡量test case的质量和衡量IP(或SOC)的验证充分程度,理论上code coverage要达到100%,但随着IP和SOC的复杂程度的增加,这几乎是一个不可能完成的事情,所以不同公司对代码覆盖率最终要达到的百分比要求也不一样。通过coverage的分析,可以找到DUT里还没有覆盖的一些盲点,可以通过修改或增加test case的方式去覆盖那些盲点,当然如果有盲点无法被test case覆盖,也可以通过文档记录的方式,将不可覆盖的原因记录下来。