我有一个有约束的代码((((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我不明白.
您已经找到了SystemVerilog约束的典型问题让我解释一下,
" == " 是一个二元运算符,从左到右进行求值
例如:pkt.a == pkt.b - 如果pkt.a具有相同的pkt.b值,则评估结果为1,否则结果为0
(pkt.a == pkt.b)== pkt.c - 使整个表达式"真实" 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.链接上也有类似的问题
对此的解决方案是,如下所述单独拆分约束以获得所需结果.
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);
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |