定义交叉覆盖率技巧

您所在的位置:网站首页 coverage机制 定义交叉覆盖率技巧

定义交叉覆盖率技巧

2023-10-26 20:31| 来源: 网络整理| 查看: 265

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;//权重为0 bins 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;//权重为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 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


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3