嗨,我是stackoverflow和systemverilog / uvm的新手。我目前正在尝试获取交叉保护点以捕获(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) );
}
这实际上应该是一个永远不会受到打击的非法条件,但是即使检查我的日志文件,采样的变量也不符合我试图在我的环境中定义的条件,但三个交叉覆盖点似乎一直在受到打击交叉掩护点。捕获此特定条件的正确语法是什么:“(a == b)&&(c == d)”?
答案 0 :(得分:0)
您有许多语法错误,但除此之外,我认为您对掩盖点和交叉点的工作方式有一些误解。
您的四个Coverpoint对于所有可能的值都只有一个bin。这意味着每个bin都会以任何值命中第一个样本,这是第一个样本的四个覆盖点中的每个覆盖点的100%覆盖率。而且,由于交叉会为所有可能的垃圾箱组合创建垃圾箱,因此您在第一个样本上只会得到一个交叉垃圾箱。因此,三个十字中的每个十字都覆盖在第一个样本上。
如果您要为Coverpoint的每个值使用单独的bin,则需要编写
coverpoint a {
bins a_bin[256] = {[0:$]};
}
现在,简单地对a,b,c,d进行交叉将创建256 * 256 * 257 * 256 = 2 32 交叉箱。十字架的箱将自动生成,并且仅当您希望合并或忽略箱时才指定它们。如果仅对(a == b)&&(c == d)的情况感兴趣,则可以忽略所有其他bin
abcd: cross a,b,c,d {
ignore_bins not_equal = abcd with( a!=b || c!=d);
}