[SV] cross bin 的一种用法

如果定义两个coverpoint a,b,如果cross a和b,假定a中有2个bin,b中有2个bin,cross之后一定只有4个bin吗?
不一定。如果a中的bin没有将所有可能的值涵盖完,那么系统会分配默认的bin,那么交叉出来就不止4个bin。

1.为什么要设置权重为0?
先将需要交叉的两个coverpoint (addr和cmd )中添加“type_option.weight = 0; ”这段代码,表示覆盖率收集时不关心这两个coverpoint的bin。
当addr和cmd中设置权重为0时,cross时addr和cmd ,默认不会生成任何的bin。即我们可以定义任何我们关心的组合bin,而不会产生我们不关心的组合,以免干扰覆盖率的收集。
然后再重新定义这些bin,就可以让我们指定我们关心的组合的bin,而不会生成那些我们不希望出现的bin。


2.如果不设置权重为0会怎样?


当addr(8位二进制的变量)和cmd(2位二进制的变量)中没有设置权重为0时,将addr和cmd交叉覆盖时,真的只会出现6 X 3= 18bin吗?
不会,因为address是一个8位二进制的变量,所以它的取值范围是2^8 = 256个。所以addr这个covergroup中有6个指明的bin,但还有256-6 = 250个可能的取值范围,所以还有很多系统默认分配的bins。而最大默认bin是64个,也就是还有58个(64-6)默认bin(剩下的250个可能值会分配到剩余的58个bin中);同样的cmd中也还有1个default bin。
这些值在cross时都会出现,所以addr和cmd在cross时会远远超过18个bin。

covergroup cg_mcdf_reg_write_read;
      addr: coverpoint reg_vif.mon_ck.cmd_addr {
        option.weight = 0;//权重为0
        bins slv0_rw_addr = {`SLV0_RW_ADDR};//SLV0_RW_ADDR是一个8位二进制
        bins slv1_rw_addr = {`SLV1_RW_ADDR};

      }
      cmd: coverpoint reg_vif.mon_ck.cmd {
        option.weight = 0;//权重为0
          bins write = {`WRITE};//WRITE是2位二进制的
        bins read  = {`READ};
        bins idle  = {`IDLE};
      }
      cmdXaddr: cross cmd, addr {
        //重新设置我们关心的bin
        bins slv0_rw_addr = binsof(addr.slv0_rw_addr);
        bins slv1_rw_addr = binsof(addr.slv1_rw_addr);
      
        bins write        = binsof(cmd.write);
        bins read         = binsof(cmd.read );
        bins idle         = binsof(cmd.idle );
        bins write_slv0_rw_addr  = binsof(cmd.write) && binsof(addr.slv0_rw_addr);
        bins write_slv1_rw_addr  = binsof(cmd.write) && binsof(addr.slv1_rw_addr);
        
      }
endgroup

法二:

covergroup cg_mcdf_reg_write_read;
      addr: coverpoint reg_vif.mon_ck.cmd_addr {
        
        bins slv0_rw_addr = {`SLV0_RW_ADDR};//SLV0_RW_ADDR是一个8位二进制
        bins slv1_rw_addr = {`SLV1_RW_ADDR};

      }
      cmd: coverpoint reg_vif.mon_ck.cmd {
          bins write = {`WRITE};//WRITE是2位二进制的
          bins read  = {`READ};
          bins idle  = {`IDLE};
      }
      cmdXaddr: cross cmd, addr {
        //设置我们关心的bin
        option.cross_auto_bin_max = 0;

        bins write_slv0_rw_addr  = binsof(cmd.write) && binsof(addr.slv0_rw_addr);
        bins write_slv1_rw_addr  = binsof(cmd.write) && binsof(addr.slv1_rw_addr);
        
      }
endgroup

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值