Tutorials

As discussed in the bidirectional constraint, there is a possibility that the value of a variable can impact another variable value due to the bidirectional nature.

By default, a constraint solver has an equal probability solving algorithm. In certain cases, there is a requirement to solve constraints in a certain order. This changes the probability of value occurrence.

Important things to note:

1. The dependency order of variables should not be bidirectional.
For example:  solve x before y; and solve y before x;  // This is not allowed
2. Randc is not allowed.
3. Only integers are allowed.

## Example without solve before

``````class seq_item;
rand bit [7:0] val;
rand bit en;

constraint en_c { if(en == 1) { val inside {[0:100]}; } }
endclass

module constraint_example;
seq_item item;

initial begin
item = new();

repeat(5) begin
item.randomize();
\$display("en = %0d, val = %0d", item.en, item.val);
end
end
endmodule``````

Output:

``````en = 0, val = 150
en = 0, val = 115
en = 0, val = 64
en = 0, val = 209
en = 0, val = 18``````

## Example with solve before

``````class seq_item;
rand bit [7:0] val;
rand bit en;

constraint en_c { solve en before val;
if(en == 1) { val inside {[0:100]}; }
}
endclass

module constraint_example;
seq_item item;

initial begin
item = new();

repeat(5) begin
item.randomize();
\$display("en = %0d, val = %0d", item.en, item.val);
end
end
endmodule``````

Output:

``````en = 1, val = 11
en = 0, val = 115
en = 1, val = 32
en = 0, val = 209
en = 0, val = 18``````

System Verilog Tutorials