Randomization of variables in a class can be disabled using rand_mode
method call.
This is very similar to the constraint_mode()
method used to Disable Constraints. So a disabled random variable is treated the same as if they had not been declared rand
or randc
.
rand_mode
can be called both as a function and task. Current state of the variable will be returned if it is called as a function.
// Disables randomization of variable [variable_name] inside [class_object] class
[class_object].[variable_name].rand_mode (0);
// Enables randomization of variable [variable_name] inside [class_object] class
[class_object].[variable_name].rand_mode (1);
Example
Let's first try without rand_mode
to compare with the one that disables constraints.
Without using rand_mode()
By default, variables declared as rand
and randc
are enabled as visible in the example shown below.
// Create a class that contains random variables
class Fruits;
rand bit [3:0] var1;
rand bit [1:0] var2;
endclass
module tb;
initial begin
// Instantiate an object of the class
Fruits f = new();
// Print values of those variables before randomization
$display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
// rand_mode() is called as a function which returns the state of the given variable
// If it is enabled, then print a statement
if (f.var1.rand_mode())
if (f.var2.rand_mode())
$display ("Randomization of all variables enabled");
// Randomize the class object which in turn randomizes all internal variables
// declared using rand/randc keywords
f.randomize();
// Print the value of these variables after randomization
$display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
end
endmodule
Simulation Log
ncsim> run Before randomization var1=0 var2=0 Randomization of all variables enabled After randomization var1=15 var2=3 ncsim: *W,RNQUIE: Simulation is complete.
After using rand_mode()
Next, we'll disable var1 and see how it affects randomization of that variable.
// Create a class that contains random variables
class Fruits;
rand bit [3:0] var1;
rand bit [1:0] var2;
endclass
module tb;
initial begin
Fruits f = new();
$display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
// Turn off randomization for var1
f.var1.rand_mode (0);
// Print if var1 has randomization enabled/disabled
if (f.var1.rand_mode())
$display ("Randomization of var1 enabled");
else
$display ("Randomization of var1 disabled");
f.randomize();
$display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
end
endmodule
Simulation Log
ncsim> run
Before randomization var1=0 var2=0
Randomization of var1 disabled
After randomization var1=0 var2=3
ncsim: *W,RNQUIE: Simulation is complete.
Next, we'll skip mentioning a variable name while invoking rand_mode()
.
// Create a class that contains random variables
class Fruits;
rand bit [3:0] var1;
rand bit [1:0] var2;
endclass
module tb;
initial begin
Fruits f = new();
$display ("Before randomization var1=%0d var2=%0d", f.var1, f.var2);
// Turns off randomization for all variables
f.rand_mode (0);
if (! f.var1.rand_mode())
if (! f.var2.rand_mode())
$display ("Randomization of all variables disabled");
f.randomize();
$display ("After randomization var1=%0d var2=%0d", f.var1, f.var2);
end
endmodule
Simulation Log
ncsim> run
Before randomization var1=0 var2=0
Randomization of all variables disabled
After randomization var1=0 var2=0
ncsim: *W,RNQUIE: Simulation is complete.