System Verilog rand_mode() and constraint_mode()

rand_mode():

Variables who is having random nature declared as rand or randc can be turned on or off dynamically by using an in-built method called rand_mode(). It can be called either function or task.

In the below example, you can see that how rand_mode we are going to use to disabled and enabled all variables.

class rmode; 
  rand int a; 
  randc int b; 
endclass 

program main; 
  rmode rnd = new(); 
  initial begin 
    void'(rnd.randomize()); 
    $display(" 1 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.rand_mode(0); //disable random nature of variables
    void'(rnd.randomize()); 
    $display(" 2 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.rand_mode(1); //enable random nature of variables
    void'(rnd.randomize());
    $display(" 3 : a : %0d,  b : %0d ",rnd.a, rnd.b); 
  end 
endprogram

rand_mode() for a specific variable

class rmode; 
  rand int a; 
  randc int b; 
endclass 

program main; 
  rmode rnd = new(); 
  initial begin 
    void'(rnd.randomize()); 
    $display(" 1 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.a.rand_mode(0); //disable randomization for a
    void'(rnd.randomize()); 
    $display(" 2 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.b.rand_mode(0); //disable randomization for b
    void'(rnd.randomize()); 
    $display(" 3 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.a.rand_mode(1); //enable randomization for a but not for b
    void'(rnd.randomize());
    $display(" 4 : a : %0d,  b : %0d ",rnd.a, rnd.b); 
  end 
endprogram

constraint_mode()

SystemVerilog gives such a wonderful and more powerful feature that we can change the status of constraint block dynamically. You might think how and here we go !!

The constraint_mode() method can be used to control the nature of constraints i.e. enable/disable constraint. By default, all the constraint blocks are enabled. When a constraint is disabled, it is not considered by the randomize() method.

It can be used as a task or function.

When called a task, the argument to the constraint_mode() task method determines the operation to be performed. 

When called as a function, constraint_mode() returns the current active state of the specified constraint block. It returns 1 if the constraint is enabled (ON) and a 0 if the constraint is disabled (OFF).

Let’s understand by example.

class rmode; 
  rand int a; 
  rand int b; 
  constraint ct_a { a == 50;} 
  constraint ct_b { b == 100;} 
endclass 

program main; 
  rmode rnd = new(); 
  initial begin 
    void'(rnd.randomize()); 
    $display(" 1 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.constraint_mode(0); //disable both the constraints
    void'(rnd.randomize()); 
    $display(" 2 : a : %0d,  b : %0d ",rnd.a, rnd.b);
    
    rnd.constraint_mode(1); //enable both the constraints
    void'(rnd.randomize());
    $display(" 3 : a : %0d,  b : %0d ",rnd.a, rnd.b); 
  end 
endprogram