type_option.weight和option.weight对覆盖率计算的影响

一:覆盖率计算方法:sv参考手册上给出的计算方法如下:

        其中merge of coverage of coverpoint from all instace的计算方法是(所有实例中,该coverpoint的仓命中总和)/(该coverpoint的总仓数);

        比如:某个coverpoint一共有7个bins:如在covergroup实例1中该coverpoint的bins_1bins_2命中,在covergroup实例2中bins2和bins_3命中。则该coverpoint一共有bins_1,bins_2,bins_3命中,那么,merge of coverage of coverpoint from all instace=3/7.

        上述Type g1的覆盖计算方法的前提是使用type_option.merge_instances =  1的情况下。当type_option.merge_instances = 0时,Type g1的覆盖率计算方法如下:

Note:仿真中发现,VCS不支持type_option.merge_instances,但是在覆盖率报告中仍然两种类型的type coverage。接下来我们还是使用type_option.merge_instances区分两种覆盖率。仿真结果如下:

二:测试代码

program cov_test;
  class transaction;
    bit[3:0] parama;
    bit[3:0] paramb;
    bit[3:0] paramc;
    bit[3:0] paramd;
  endclass

  covergroup CovPort(ref transaction tr,input int num);
    option.per_instance=1;
    option.weight = num;
    parama:coverpoint tr.parama{
      option.auto_bin_max = 1;
    }

    paramb:coverpoint tr.paramb{
      bins lo = {[0:2]};
      bins mid = {[3:5]};
      bins hi = {[6:8]};
    }
    paramc:coverpoint tr.paramc[1:0]{
      bins staus[] = (0,1,2 =>0);
    }
    paramd:coverpoint tr.paramd{
      type_option.weight = 0;
      option.auto_bin_max =3 ;
      type_option.comment="don't care this coverpoint";
    }
  endgroup

  initial begin
    CovPort ck1 ;
    CovPort ck2 ;
    transaction tr ;
    tr =new();
    ck1=new(tr,1);
    ck2=new(tr,2);
    begin
      #1ns;
      tr.parama=1;
      tr.paramb=2;
      tr.paramc=1;
      tr.paramd=1;
      ck1.sample();

      #1ns
      tr.parama=2;
      tr.paramb=4;
      tr.paramc=0;
      tr.paramd=5;
      ck1.sample();
      ck2.sample();
      
  
    end
  end

endprogram

 三:仿真结果:

1:覆盖率报告主界面

使用$get_coverage函数,得到覆盖率58.33. 

上图只作为解释含义使用,与下面的覆盖率报告无关联。

上图中:Group中的goal使用type_option指定。Instances在的goal使用option指定。两者均在covergroup层次。

2:covergroup不同实例的覆盖率报告

3:covergroup整体覆盖率报告 

 

上图中,goal参数也由type_option.goal指定

四:覆盖率函数

常见的覆盖率相关的函数如下

 get_coverage和get_inst_coverage两个函数都可以用于covergroup,coverpoint和cross层次。首先讨论get_coverage的用法:

1:get_coverage(ref int , ref int)的用法

1.1在covergroup层次调用,返回的是type coverage。此外,该函数的第一个ref参数返回的是所有实例下已经命中的仓,第二个参数返回的是所有实例下仓的个数

1.2在coverpoint、cross层次调用:返回的是所有实例中该coverpoint/cross的覆盖率。第一个参数返回的是所有实例下该coverpoint/cross的命中仓数,第二个参数返回的是所有实例下该coverpoint/cross的仓数。同一covergroup类型的不同实例调用get_coverage(),得到的结果均一样的。

        

2:get_inst_coverage(ref int,ref int)的用法

2.1:在covergroup层次调用,返回的是单个实例的覆盖率。第一个参数返回的在该实例下,仓的命中个数;第二个参数是在该实例下,仓的总数。

2.2:在covergpoint/cross层次调用,返回的是该实例的某个coverpoint/cross的覆盖率。第一个参数返回的是该实例下某coverpoint/cross的仓的命中个数,第二个参数返回的是该实例下某coverpoint/cross的仓的总数。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值