本文主要是介绍定义交叉覆盖率技巧——systemverilog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2022/03/18 此文章结论不正确。
纠正:当你在coverpoint中自己建仓了(设置了bin),系统就不会再自动建仓,覆盖率数值限制在你设置bin值得范围。
引言
定义两个coverpoint a,b,如果cross a和b,假定a中有4个bin,b中有5个bin,cross之后一定有20个bin吗?
不一定。如果a中的bin没有将所有可能的值涵盖完,那么系统会分配默认的bin,那么交叉出来就不止20个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。
见如下代码:
//mcdf中读写寄存器的读写指令和读写地址的收集
covergroup cg_mcdf_reg_write_read;addr: coverpoint reg_vif.mon_ck.cmd_addr {type_option.weight = 0;//权重为0bins slv0_rw_addr = {`SLV0_RW_ADDR};//SLV0_RW_ADDR是一个8位二进制bins slv1_rw_addr = {`SLV1_RW_ADDR};bins slv2_rw_addr = {`SLV2_RW_ADDR};bins slv0_r_addr = {`SLV0_R_ADDR };bins slv1_r_addr = {`SLV1_R_ADDR };bins slv2_r_addr = {`SLV2_R_ADDR };}cmd: coverpoint reg_vif.mon_ck.cmd {type_option.weight = 0;//权重为0bins write = {`WRITE};//WRITE是2位二进制的bins read = {`READ};bins idle = {`IDLE};}cmdXaddr: cross cmd, addr {//重新设置我们关心的binbins slv0_rw_addr = binsof(addr.slv0_rw_addr);bins slv1_rw_addr = binsof(addr.slv1_rw_addr);bins slv2_rw_addr = binsof(addr.slv2_rw_addr);bins slv0_r_addr = binsof(addr.slv0_r_addr );bins slv1_r_addr = binsof(addr.slv1_r_addr );bins slv2_r_addr = binsof(addr.slv2_r_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);bins write_slv2_rw_addr = binsof(cmd.write) && binsof(addr.slv2_rw_addr);bins read_slv0_rw_addr = binsof(cmd.read) && binsof(addr.slv0_rw_addr);bins read_slv1_rw_addr = binsof(cmd.read) && binsof(addr.slv1_rw_addr);bins read_slv2_rw_addr = binsof(cmd.read) && binsof(addr.slv2_rw_addr);bins read_slv0_r_addr = binsof(cmd.read) && binsof(addr.slv0_r_addr); bins read_slv1_r_addr = binsof(cmd.read) && binsof(addr.slv1_r_addr); bins read_slv2_r_addr = binsof(cmd.read) && binsof(addr.slv2_r_addr); }
endgroup
这篇关于定义交叉覆盖率技巧——systemverilog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!