如果定义两个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