为什么至少没有为约束求解器求解== b约束

Sha*_*rji 1 system-verilog

我有一个有约束的代码((((a == b)== c)== d)== e)

我能理解c,d和e所取的值.但由于a == b是一个约束,为什么解算器不能解决== b.Atle和a b应具有相同的值.

module tb;
  class packet;
    rand bit [4:0] a,b,c,d,e;

  endclass

  initial
  begin
    packet pkt;
    pkt = new();
    if(pkt.randomize() with {pkt.a == pkt.b == pkt.c == pkt.d == pkt.e;})
      $display("a is %h, b is %h, c is %h,d is %h, e is %d \n", pkt.a, pkt.b, pkt.c, pkt.d, pkt.e);
    if(pkt.randomize() with {pkt.a == pkt.b == pkt.c;})
      $display("a is %h, b is %h, c is %h,d is %h \n", pkt.a, pkt.b, pkt.c, pkt.d);

  end  

endmodule
Run Code Online (Sandbox Code Playgroud)

我把输出作为

a is 00, b is 08, c is 1c,d is 00, e is  1 

a is 0d, b is 1d, c is 00,d is 09
Run Code Online (Sandbox Code Playgroud)

我可以将c,d和e所取的值联系起来.Bu值a和b我不明白.

Emm*_*man 5

您已经找到了SystemVerilog约束的典型问题让我解释一下,

" == " 是一个二元运算符,从左到右进行求值

例如:pkt.a == pkt.b - 如果pkt.a具有相同的pkt.b值,则评估结果为1,否则结果为0

(pkt.a == pkt.b)== pkt.c - 使整个表达式"真实" pkt.c必须等于pkt.a == pkt.b评估的结果,这意味着如果pkt.apkt.b不同,pkt.c的值为0,否则值为1.

这意味着pkt.c将始终为01,因此满足pkt.a == pkt.b == pkt.c的唯一值集合均为1.链接上也有类似的问题

对此的解决方案是,如下所述单独拆分约束以获得所需结果.

if(pkt.randomize() with {pkt.a == pkt.b; pkt.b == pkt.c; pkt.c == pkt.d; pkt.d == pkt.e;})


if(pkt.randomize() with {pkt.a == pkt.b; pkt.b == pkt.c;})
Run Code Online (Sandbox Code Playgroud)

为了更容易理解并避免混淆保持相同的打印格式,我发现在您的示例中有十六进制和十进制格式的混合

$ display("a是%h,b是%h,c是%h,d是%h,e是%d \n",pkt.a,pkt.b,pkt.c,pkt.d,pkt. E);