Looking over verification forums, I found a thread where the author was wondering how does a==b==c constraint get evaluated since the result was not the one he was expecting.
The scenario is like this: three variables need to be randomized and you want to constraint them to the same value. If you are thinking to use the a==b==c expression, like in the code below, you’ll find out that this is not a good idea.
class abc;
rand int unsigned a,b,c;
constraint abc_constr{
a==b==c;
}
endclass
module top;
initial begin
abc abc_inst = new();
if(abc_inst.randomize())
$display("a = %0d, b = %0d, c = %0d", abc_inst.a, abc_inst.b, abc_inst.c);
else
$display("ERR: Could not randomize abc_inst");
end
endmodule
This example will run without error (i.e. the randomization succeeded) although the three variables are not equal! For example, one of the runs generated following values: a=416024649, b=2651484123, c=0 without any error.
Furthermore, if you want to constraint them to a certain value and you choose to constraint c to that specific value…again, you’ll discover that randomization fails:
if(abc_inst.randomize() with {
c==10;
})
$display("a=%0d, b=%0d, c=%0d", abc_inst.a, abc_inst.b, abc_inst.c);
else
$error("Could not randomize abc_inst");
If you run the example above you get Could not randomize abc_inst message.
How can you explain this behaviour? Well, in order to get the constraint satisfied, expression a==b==c should be evaluated TRUE. The “Gotcha” is: due to == binary operator, the expression is evaluated from left to right, as follows:
- a==b – if a has the same value as b then the result of the evaluation is 1, otherwise the result is 0
- (a==b)==c – in order to make the hole expression TRUE, then c will have to be equal to the result of a==b evaluation, meaning that if a is different from b, c will have the value 0, otherwise it will have the value 1.
This means that c will always be either 0 or 1, such that the only set of values that satisfy a==b==c is all 1’s.
The workaround is to split the expression in two separate constraints:
constraint abc_constr{
a==b;
b==c;
}
The variables will get the same value; it also works in case c is constrained to a certain value.
Another “Gotcha” is busted!