[SV]SystemVerilog Solve Before Constraints

                                Solve Before Constraints

       Solve before is the constraint property. solve before is used inside the constraint block to specify the order of constraint solving. If the variables are dependent, due to the bidirectional nature of constraints value of one variable will influence the value of another variable.

  • solve before constraints are used to force the constraint solver to choose the order in which constraints are solved.
  • constraint solver will give equal weight-age to all the possible values. i.e On multiple randomization solver should assign all the possible values.
class pakcet;
  rand bit       a;
  rand bit [3:0] b;
 
  constraint a_b { 
    (a == 1) -> b == 0; 
  }

endclass

       Possible value of,

a -> 0 and 1;  // 2 possible values

b -> 0 to  15; // 16 possible values


       What if in some situations it is required to generate a value of ‘a’ to ‘1’ more frequently. by using ‘solve before’ it can be done.As ‘b’ value ranges 0:15, Probability of getting b == 0 is very less.
       so it will impact the value of a,  i.e if value of b != 0, which will lead to value of ‘a’ to become ‘0’.

       Writing below constraint will direct solver to solve ‘a’ first, so more frequently a will take value of 1.

constraint sab { 
  solve a before b;
}

一、Solve before constraint example

(1)without solve before

       The below example is the example explained above,this example is without solve before constraint, so we can see the simulation result that the occurrence of value a == 1 is less.

class packet;
  rand bit       a;
  rand bit [3:0] b;
 
  constraint a_b { (a == 1) -> b == 0; }
endclass
 
module inline_constr;
  initial begin
    packet pkt;
    pkt = new();
    repeat(10) begin
      pkt.randomize();
      $display("\tValue of a = %0d, b = %0d",pkt.a,pkt.b);
    end
  end
endmodule

Simulator Output 

Value of a = 0, b = 6
Value of a = 0, b = 3
Value of a = 1, b = 0
Value of a = 0, b = 15
Value of a = 0, b = 7
Value of a = 0, b = 2
Value of a = 0, b = 15
Value of a = 0, b = 4
Value of a = 0, b = 7
Value of a = 0, b = 11

(2)with solve before

       this example is to solve before constraint, so we can see the simulation result that the occurrence of value a == 1 is more than without solve before constraint.

class packet;
  rand bit       a;
  rand bit [3:0] b;
 
  constraint sab { solve a before b;}
  constraint a_b { (a == 1) -> b == 0;}
endclass
 
module inline_constr;
  initial begin
    packet pkt;
    pkt = new();
    repeat(10) begin
      pkt.randomize();
      $display("\tValue of a = %0d, b = %0d",pkt.a,pkt.b);
    end
  end
endmodule

 Simulator Output 

Value of a = 0, b = 9
Value of a = 0, b = 14
Value of a = 0, b = 3
Value of a = 0, b = 13
Value of a = 1, b = 0
Value of a = 1, b = 0
Value of a = 1, b = 0
Value of a = 0, b = 5
Value of a = 0, b = 3
Value of a = 0, b = 4

发布了141 篇原创文章 · 获赞 81 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/gsjthxy/article/details/105116483
今日推荐