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



