Tutorials

Protocols

Learn More

The randomize() method call is used to randomize class variables based on constraints if they are written. Along with randomize() method, SystemVerilog provides two callbacks

  1. pre_randomize()
  2. post_randomize()

A sequence of execution of methods:

pre_randomize() -> randomize() -> post_randomize()

pre_randomize method

It is used to do an activity just before randomization. This may involve disabling constraint for a particular variable (constraint_mode(0))or disabling randomization itself (rand_mode(0)). Refer disable randomization for more details.

post_randomize method

It is used to do an activity after randomization. This may involve printing randomized values of a class variable. Override the randomized value of a class variable.

pre_randomize and post_randomize methods Examples

A basic example

A basic example with pre_randomization and post_randomization methods which also include constraint_mode(0).

class seq_item;
  rand bit [7:0] val1;
  rand bit [7:0] val2;
 
  constraint val1_c {val1 > 100; val1 < 200;}
  constraint val2_c {val2 > 5; val2 < 8;}
  
  function void pre_randomize();
    $display("Inside pre_randomize");
    val2_c.constraint_mode(0);
  endfunction
  
  function void post_randomize();
    $display("Inside post_randomize");
    $display("val1 = %0d, val2 = %0d", this.val1, this.val2);
  endfunction
  
endclass

module constraint_example;
  seq_item item;
  
  initial begin
    item = new();
    item.randomize();
  end
endmodule

Output:

Inside pre_randomize
Inside post_randomize
val1 = 121, val2 = 247

Example with rand_mode

In pre_randomize() method, rand_mode(0) is used to disable randomization. So, in post_randomization() initial values will be printed.

class seq_item;
  rand bit [7:0] val1 = 101; // Initialized to avoid constraint failure
  rand bit [7:0] val2 = 6;
 
  constraint val1_c {val1 > 100; val1 < 200;}
  constraint val2_c {val2 > 5; val2 < 8;}
  
  function void pre_randomize();
    $display("Inside pre_randomize");
    this.rand_mode(0); 
  endfunction
  
  function void post_randomize();
    $display("Inside post_randomize");
    $display("val1 = %0d, val2 = %0d", this.val1, this.val2);
  endfunction
  
endclass

module constraint_example;
  seq_item item;
  
  initial begin
    item = new();
    item.randomize();
  end
endmodule

Output:

Inside pre_randomize
Inside post_randomize
val1 = 101, val2 = 6

Example with a derived class

Part A: pre_randomization and post_randomization methods defined in a base and derived class

The base class and child class handle call respective pre_randomization and post_randomization methods as mentioned in the below example.

class seq_item;
  rand bit [7:0] val1;
  rand bit [7:0] val2;
 
  constraint val1_c {val1 > 100; val1 < 200;}
  constraint val2_c {val2 > 5; val2 < 8;}
  
  function void pre_randomize();
    $display("Inside pre_randomize");
  endfunction
  
  function void post_randomize();
    $display("Inside post_randomize");
    $display("val1 = %0d, val2 = %0d", this.val1, this.val2);
  endfunction
endclass

class child_item extends seq_item;
  function void pre_randomize();
    $display("Inside pre_randomize of child_item class");
  endfunction
  
  function void post_randomize();
    $display("Inside post_randomize of child_item class");
    $display("val1 = %0d, val2 = %0d", this.val1, this.val2);
  endfunction
endclass

module constraint_example;
  seq_item item;
  child_item c_item;
  
  initial begin
    item = new();
    c_item = new();
    
    item.randomize();
    c_item.randomize();
  end
endmodule

Output:

Inside pre_randomize
Inside post_randomize
val1 = 121, val2 = 7
Inside pre_randomize of child_item class
Inside post_randomize of child_item class
val1 = 107, val2 = 7

Part B: pre_randomization and post_randomization methods defined in a base class only

The child class handle calls pre_randomization and post_randomization methods of the base class as mentioned in the below example.

class seq_item;
  rand bit [7:0] val1;
  rand bit [7:0] val2;
 
  constraint val1_c {val1 > 100; val1 < 200;}
  constraint val2_c {val2 > 5; val2 < 8;}
  
  function void pre_randomize();
    $display("Inside pre_randomize");
  endfunction
  
  function void post_randomize();
    $display("Inside post_randomize");
    $display("val1 = %0d, val2 = %0d", this.val1, this.val2);
  endfunction
endclass

class child_item extends seq_item;
  // No method implemented.
endclass

module constraint_example;
  seq_item item;
  child_item c_item;
  
  initial begin
    item = new();
    c_item = new();
    
    item.randomize();
    c_item.randomize();
  end
endmodule

Output:

Inside pre_randomize
Inside post_randomize
val1 = 121, val2 = 7
Inside pre_randomize
Inside post_randomize
val1 = 107, val2 = 7

Note:

  1. If randomization is failed post_randomization will not be called and the variable will retain previous values.
  2. Pre and post-randomization functions can not be virtual functions.

System Verilog Tutorials