功能覆盖率漫谈

来源:互联网 发布:海外学历认证 知乎 编辑:程序博客网 时间:2024/05/15 23:51

以下内容均以使用vcs工具为前提。

(一)跨group交叉覆盖率

vcs支持跨covergroup交叉覆盖率,意味着:

interface cov_if;    logic a;    logic b;    logic c;endinterfaceclass coverage;    virtual cov_if cov_port;    covergroup cg_a;        option.per_instance = 1;        cp_a : coverpoint cov_port.a;    endgroup    covergroup cg_b;        option.per_instance = 1;        cp_b : coverpoint cov_port.b;        cp_c : coverpoint cov_port.c;    endgroup    covergroup cg_axb;        option.per_instance = 1;        cx_a_b : cross cg_a.cp_a, cg_b.cp_b;        cx_a_c : cross cg_a.cp_a, cg_b.cp_c;    endgroup    function new ();        cg_a = new();        cg_b = new();        cg_axb = new();    endfunction : new    function void sample ();        cg_a.sample();        cg_b.sample();    endfunction : sampleendclass : coverage

是可以跑起来的,书写上的便利可以让组合更自由。这种写法有几个地方要注意:

1.需要在vcs elaborate时加上-lca(limited customer availability)选项。

2.上述covergroup只能写在class里, 作为全局的covergroup就无法使用该功能。

3.cov_axb只需要new即可,会自动sample,如果同时调用cg_a, cg_b, cov_axb的sample会报warning:Warning-[FCPSHCG] Sampling hierarchical covergroup.Procedural sampling of hierarchical covergroup instances will be ignored.


(二)covergroup option/type_option

  很多时候我们只看到书上那么写,别人那么用,却很少关注为什么要这么写。下面从最常见的一些开关开始介绍:

(1) per_instance

  默认的时候这个选项是0,是关闭的。instance,指covergroup的instance, 如果这个开关打开,那么每一个instance的覆盖率会被列出,否则只能看到一个综合的结果。这里问题来了,什么时候需要有多个covergroup的instance?答案是需要复用的时候。假如说系统中有两个一模一样的port, 需要对他们都进行覆盖率采样分析,那么完全可以之写一个covergroup, 实例化两次,传入不同的port.还是以上面的例子为例,这一次加入驱动的细节:

module top;coverage cov0;coverage cov1;cov_if cov_port0();cov_if cov_port1();initial begincov0 = new();cov0.cov_port = cov_port0;cov_port0.a <= 1;cov_port0.b <= 0;cov_port0.c <= 0;cov1 = new();cov1.cov_port = cov_port1;cov_port1.a <= 1;cov_port1.b <= 1;cov_port1.c <= 1;#20;$finish;endalways #1 cov_port0.a = ~cov_port0.a;always #2 cov_port0.b = ~cov_port0.b;always #1 cov_port0.c = ~cov_port0.c;always #1 cov0.sample();always #1 cov_port1.a = ~cov_port1.a;always #2 cov_port1.b = ~cov_port1.b;always #1 cov_port1.c = ~cov_port1.c;always #1 cov1.sample();endmodule : top
会看到这样的波形:

port0中a和c完全反相,而port1中则完全同相,这个时候cross a,c,两个port都会各有两种情形覆盖不到,而他们的总和,却是四种情况都覆盖到了。如果加了per_instance参数,那么我们看到的报告会包含下面这两个部分:

否则只能看到一个总的部分:


(2) goal

预期的目标,会作为分数计算的依据,具体见LRM的公式。

这里特别注意type_option与option的区别,type_option会影响最后总和的结果,而option影响的是每个intance内的结果。这一点对于weight, comment等其他参数也一样。


(3)name & comment

这里指instance的name

group instance后的名字

comment也有相应的标示


(4)type_option.merge_instances

将所有的instence的hit情形合并到一起,例如inst1 hit了0个,inst2 hit了全部,那么分数就会是100.如果不打开此选项,则计算instence的加权平均分。这个选项vcs不支持。


(5)distribute_first

vcs还是不支持,想要自定义bin的顺序目前看来是不可能了,但是with语法还是可以部分支持的。

0 0
原创粉丝点击