Inline Constraints in SystemVerilog
Table of Contents
- the inline constraint is written using with keyword
- during randomization, constraint solver will consider both inline constraints and constraints written inside the class
- the inline constraint will not override the constraints written inside the class
- the inline constraint shouldn’t conflict with the constraint written inside the class, else it will lead to randomization failure
- for example, constraint inside the class written as var < 5, and inline constraint written as var > 5
Inline constraint Syntax
object.randomize() with { .... };
Inline constraint examples
Only inline constraint
In the below example,
Class doesn’t have constraints defined in it. the inline constraint is used to constrain the variable addr.
class packet; rand bit [3:0] addr; endclass module inline_constr; initial begin packet pkt; pkt = new(); repeat(2) begin pkt.randomize() with { addr == 8;}; $display("\taddr = %0d",pkt.addr); end end endmodule
Simulator Output
addr = 8 addr = 8
Constraint inside the class and inline constraint
In the below example,
addr and data are the two random variables. The constraint for data is written inside the class, and the inline constraint is written for addr.
Conclusion: Both class and inline constraints are considered during randomization.
class packet; rand bit [3:0] addr; rand bit [3:0] data; constraint data_range { data > 0; data < 10; } endclass module inline_constr; initial begin packet pkt; pkt = new(); repeat(2) begin pkt.randomize() with { addr == 8;}; $display("\taddr = %0d data = %0d",pkt.addr,pkt.data); end end endmodule
Simulator Output
addr = 8 data = 2 addr = 8 data = 5
Conflict with inline constraint
In the below example,
The addr is the random variable. constraint inside the class written as addr < 5, and inline constraint written as addr > 5.
Conclusion: Conflict between the class and inline constraints leads to randomization failure.
class packet; rand bit [3:0] addr; constraint addr_range {addr < 5;}; endclass module inline_constr; initial begin packet pkt; pkt = new(); repeat(2) begin pkt.randomize() with { addr > 5;}; $display("\taddr = %0d",pkt.addr); end end endmodule
Simulator Output
Error-[CNST-CIF] Constraints inconsistency failure testbench.sv, 15 Constraints are inconsistent and cannot be solved. Please check the inconsistent constraints being printed above and rewrite them. addr = 0 ======================================================= Solver failed when solving following set of constraints rand bit[3:0] addr; // rand_mode = ON constraint addr_range // (from this) (constraint_mode = ON) (testbench.sv:7) { (addr < 4'h5); } constraint WITH_CONSTRAINT // (from this) (constraint_mode = ON) (testbench.sv:15) { (addr > 4'h5); } =======================================================
Class and inline constraints for the same random variable
In the below example,
The addr is the random variable. constraint inside the class written as addr between 6:12, and inline constraint is written as addr == 8.
Conclusion: Constraint solver considers both class and inline constraints.
class packet; rand bit [3:0] addr; constraint addr_range {addr inside {[6:12]};}; endclass module inline_constr; initial begin packet pkt; pkt = new(); repeat(2) begin pkt.randomize() with { addr == 8;}; $display("\taddr = %0d",pkt.addr); end end endmodule
Simulator Output
addr = 8 addr = 8