System verilog Systemverilog交叉覆盖点语法问题

System verilog Systemverilog交叉覆盖点语法问题,system-verilog,uvm,System Verilog,Uvm,嗨,我是stackoverflow和systemverilog/uvm的新手。我目前正在尝试获取a交叉覆盖点,以捕获a==b&&c==d的条件,而不管它们是什么值。我试过下面的十字架,但没有一个有效 covergroup abcd_tracking with function sample (bit [7:0] a, bit [7:0] b, bit [7:0] c, bit [7:0] d); coverpoint a { bins a_bin[1] = {[0:$]};

嗨,我是stackoverflow和systemverilog/uvm的新手。我目前正在尝试获取a交叉覆盖点,以捕获a==b&&c==d的条件,而不管它们是什么值。我试过下面的十字架,但没有一个有效

covergroup abcd_tracking with function sample (bit [7:0] a, bit [7:0] b, bit [7:0] c, bit [7:0] d);
  coverpoint a {   
    bins a_bin[1] = {[0:$]};
  }
  coverpoint b {   
    bins b_bin[1] = {[0:$]};
  }
  coverpoint c {   
    bins c_bin[1] = {[0:$]};
  }
  coverpoint d {   
    bins d_bin[1] = {[0:$]};



   abcd_cross : cross a,b,c,d 
  {
    bins abcd_bin =  abcd_cross with( (a==b) && (c==d) );

  }

   abcd_cross_2 : cross a,b,c,d 
  {
    bins abcd_2_bin =  ( binsof(a) intersect(b)  && binsof(c) intersect(d) );

  }


   abcd_cross_3 : cross a,b,c,d 
  {
    bins abcd_3_bin =  ( binsof(a) intersect{[0:$]} with (a==b)  && binsof(c) intersect{[0:$]} with (c==d) );

  }

这实际上应该是一个非法的条件,永远不会被击中,但3个交叉覆盖点似乎总是被击中,即使检查我的日志文件,采样变量不符合我试图在交叉覆盖点中定义的条件。捕捉这种特殊情况的正确语法是什么:a==b&&c==d?

您有许多语法错误,但除此之外,我认为您对覆盖点和交叉点的工作方式有一些误解

对于所有可能的值,您的四个覆盖点只有一个箱子。这意味着每个箱子在第一个样本上都会被任何值击中,这是第一个样本上四个覆盖点的100%覆盖率。由于十字会为所有可能的箱子组合创建箱子,所以在第一个样品上只能得到一个十字箱子。因此,第一个样本涵盖了三个交叉点中的每一个

如果您希望coverpoint的每个值都有一个单独的存储箱,则需要写入

coverpoint a {   
    bins a_bin[256] = {[0:$]};
}
现在,a、b、c、d的简单交叉将创建256*256*257*256=232个交叉箱。十字的箱子是自动生成的,只有在希望合并或忽略箱子时才指定箱子。如果您只对a==b&&c==d的情况感兴趣,那么您必须忽略所有其他具有

abcd: cross a,b,c,d {
   ignore_bins not_equal = abcd with( a!=b || c!=d);
}