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

时间:2017-08-10 09:12:12

标签: system-verilog

我有一个有约束的代码 (((((= = 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

我得到输出为

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

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

2 个答案:

答案 0 :(得分:5)

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

"的 == " 是一个二元运算符,从左到右进行评估

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

(pkt.a == pkt.b)== pkt.c - 制作完整的表达式" true" pkt.c 必须等于 pkt.a == pkt.b 评估的结果,这意味着如果 pkt.a 不同来自 pkt.b pkt.c 的值为0,否则其值为1.

这意味着 pkt.c 将始终为 0 1 ,这样唯一一组满足的值pkt.a == pkt.b == pkt.c 全是1。在link

中也发现了类似的问题

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

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;})

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

  

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

答案 1 :(得分:1)

你应该参考Verilog和SystemVerilog陷阱:Stuart Sutherland和Don Mills的101常见编码错误。列出的书已经涵盖了上面的问题以及之前的问题,即fork-join_none。