【IC覆盖率】

覆盖率分享

  • 1 覆盖率提高策略
  • 2 覆盖率类型
    • 2.1 代码覆盖率
    • 2.2 功能覆盖率
    • 2.3 Waive提高覆盖率

覆盖率是用于衡量设计的完备性,进行指导分析发现没覆盖到的盲区,通过修改约束或者追加定向case来提到覆盖率;

1 覆盖率提高策略

1.首先最先的是每个case增加随机次数,从而得到更多的随机种子来提高覆盖率;
2.当发现种子数提高,但是覆盖率无提高时,细化原有约束;
3.当修改约束后,发现还是不行,追加定向case;
当然有的RTL代码属于冗余代码,可以和DE交互waive掉

2 覆盖率类型

2.1 代码覆盖率

代码覆盖率首先是最直观最省力的方法,由EDA直接自动生成,来检查RTL是否遍历;
1.行覆盖率
这个即RTL代码有多少行被执行到了;
2.条件覆盖率
当判定式中有多个条件时,要求每个条件的取值组合都要遍历到;
3.分支覆盖率
遍历代码中的分支覆盖;即
if-else;
case;
?:
以上三种情况;
区分条件覆盖率和分支覆盖率

if( con1 || con2) begin
	....
end else begin
	...
end

对于分支覆盖率来说:
两种情况就够了:
1.con1和con2 都为false;
2.con1为true,不care con2;

但是对于条件覆盖率来说:还需要增加
con1为true,con2为false;
con1为true,con2为true;

4.翻转覆盖率
即bit为哪些没有0–>1或者1–>0变化,常见于配置寄存器中;
5.有限状态机覆盖率
衡量状态机中的各个状态是否遍历到;
6.断言覆盖率
断言用于判定RTL代码预期,cover property来检查某些信号的时序关系;
assert某种意义上等价于一个case的作用;

2.2 功能覆盖率

功能覆盖率是自己主动写,对重要和感兴趣的点通过建仓来收集覆盖率衡量的方式;
如果对Spec足够理解,从而完备的功能收集仓,可以做到:某个功能在设计中被遗漏,代码覆盖率不能做到,他只能对已有的RTL默认为Golden的情况下做覆盖,而功能覆盖率可以做到检查现有RTL是否完成Spec上面所要求的功能;

功能覆盖率收集的前提是:测试用例通过;
1.主要关注模块的的输入输出接口信号和某些内部信号;

  • 对于输入,检测数据端的data和control信号组合情况;
  • 对于输出,检测是否有完整的Data pata和反馈时序;
  • 对于内部设计信号,需要检查的信号与验证计划中需要覆盖的点相对应。通过对信号的单一覆盖、交叉覆盖或时序覆盖来检查功能是否被触发,以及执行是否正确;

覆盖组covergroup概念:一旦被定义可以创建多个实例;覆盖组可以定义在module、program、interface以及class中;
每个覆盖组必须明确:
一个时钟事件可以用来同步对覆盖点的采样:一组覆盖点;覆盖点之间的交叉覆盖;可选的形式参数;覆盖率选项;
功能覆盖路策略:关注的地方着眼于感兴趣的状态;设计信号位宽较大,应拆分多个小范围再加上边界情况;
功能覆盖率比较耗时,只收集来分析重要和感兴趣的那部分;
最后目标是:同时追求高的代码覆盖率和高的功能覆盖率

2.3 Waive提高覆盖率

为不断提高覆盖率,经常和DE交互来进行Exclude一些RTL代码,这是不可避免的;
Tips: VCS 提供了一个-cm_hier选项,加上相应的配置文件,可以批量Exclude不关心的RTL层级。

-cm_hier xxx
//Eg
ELAB_OPT += -cm_hier /xx/xx/xx/xx/xx/XXX_cov_hier.fil
//Contents
begin line+cond+fsm+branch +tree rx_tb_top.dut 0 end
begin tgl +tree rx_tb_top.dut 1 end
begin line+cond+fsm+branch -tree rx_tb_top.dut.pcb_smp_wrap 0 end

1.+/-tree instance_name [level_number]
表示只收集或Exclude指定层级Instance的覆盖率,level为0或者不写level表示指定层级以下的全部子层级,level 1表示当前层级;
2.+/-file file_name
表示收集或者Exclude指定的文件中的代码
3.+/-library library_name
表示收集或者Exclude指定的库中的全部module;
4.+/-module module_name |entity_name
表示收集后者Exclude指定的module
5.+/-moduletree module_name [level_number]
表示收集或者Exclude指定层级下的对应的module
6.+/-node
表示收集或者Exclude某个信号的toggle覆盖率;

begin fsm+line +tree tb_top.dut1 end
仅收集dut层级以下全部的fsm和line覆盖率
begin line+tgl+cond -module bdev end
不收集名为bdev的module的line/tgl/toggle/condi覆盖率
begin cond+line -library gate end
begin tgl -tree tb_top.dut.L* end
不收集名为gate的库文件的所有module的cond和line覆盖率;
不收集以tb_top.dut.L开头的所有层级的toggle覆盖率
+tree tb.dut
begin line -module bdev end
收集dut及以下所有层级的覆盖率,不收集名为bdev的module的line覆盖率;

一些情况下,比如例化了多个Instance都需要保留,但是内部某些语句需要Exclude,如果一个一个waive,非常耗时。可以先将一个Instance手动Exclude然后保存.el文件,然后批量复制修改多个Instance的index,最后再重新加载进去即可

你可能感兴趣的:(IC,Verify)