我有一个有约束的代码 (((((= = 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我不明白。
答案 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。