In This session we are going to see how to Randomize a Real variable.
Using randomize() method we can able to randomize only integral data-type variables only(bit,logic,reg,wire,integer,enum, packed struct).
Here I show the two ways to randomize variable of type real.
Example 1:
In below mentioned code I am trying to randomize real data types,It leads to compilation error. LRM won't support real and string data_types for Randomization.
class rand_rdata;
rand real rdata;
endclass
module TB;
rand_rdata r;
initial begin
r=new();
r.randomize();
repeat(5) begin
$display(" REAL DATA %0d ",r.rdata);
end
end
endmodule
OUTPUT:
TimeScale is 1 ns / 1 ns
Error-[IRRVD] Illegal rand variable type
testbench.sv, 16
"rdata"
The rand variable 'rdata' must be an integral type, an enum type, a packed
struct, or of type 'bit'.
Change the type of the random variable 'rdata' to an integral, bit, packed
struct, or enum type or remove the 'rand' qualifier.
1 error
Error-[IRRVD] Illegal rand variable type
testbench.sv, 16
"rdata"
The rand variable 'rdata' must be an integral type, an enum type, a packed
struct, or of type 'bit'.
Change the type of the random variable 'rdata' to an integral, bit, packed
struct, or enum type or remove the 'rand' qualifier.
1 error
$bitstoreal converts the bit value to a real number. By using this system function real values can be generated. Real value randomization Logic's are explained in Example 2&3.
Example 2:
class rand_real;
rand bit [63:0] data;
real rdata;
function void post_randomize();
this.rdata = $bitstoreal(data); // This is the trick here. (Randomized data value is converted to Real value by using system function)
endfunction
endclass
module top();
rand_real R;
initial begin
R = new();
repeat (4) begin
if (R.randomize()) begin
$display ("R.data=%0d, R.rdata=%e", R.data, R.rdata);
end
else begin
$error ("Randomization Failed");
end
end
end
endmodule
OUTPUT:
R.data=11603960314292000697, R.rdata=-1.560983e-149
R.data=5297240865832474715, R.rdata=1.397281e+46
R.data=17254093185709081402, R.rdata=-7.145857e+228
R.data=12279536430588681223, R.rdata=-2.239116e-104
V C S S i m u l a t i o n R e p o r t
R.data=5297240865832474715, R.rdata=1.397281e+46
R.data=17254093185709081402, R.rdata=-7.145857e+228
R.data=12279536430588681223, R.rdata=-2.239116e-104
V C S S i m u l a t i o n R e p o r t
Example 3:
class rand_real;
rand integer i, j;
real rdata;
function void post_randomize();
this.rdata = $bitstoreal({i, j}); //This is the trick here (Randomized i,j converted to equivalent real here)
endfunction
endclass
module TB();
rand_real R;
initial begin
R = new();
repeat (5) begin
if (R.randomize()) begin
$display ("R.i=%0d, R.j=%0d, R.real_data=%e", R.i, R.j, R.rdata);
end
else begin
$error ("Randomization Failed");
end
end
end
endmodule
OUTPUT:
R.i=-384116807, R.j=-1593209748, R.real_data=-2.006518e+198
R.i=1637914715, R.j=1233360000, R.real_data=1.866503e+162
R.i=397247290, R.j=-277685674, R.real_data=1.263399e-194
R.i=-407577593, R.j=-1435914926, R.real_data=-3.717586e+191
R.i=-1298805792, R.j=-1452694196, R.real_data=-5.174229e-65
V C S S i m u l a t i o n R e p o r t
R.i=1637914715, R.j=1233360000, R.real_data=1.866503e+162
R.i=397247290, R.j=-277685674, R.real_data=1.263399e-194
R.i=-407577593, R.j=-1435914926, R.real_data=-3.717586e+191
R.i=-1298805792, R.j=-1452694196, R.real_data=-5.174229e-65
V C S S i m u l a t i o n R e p o r t
Hope this logic's will be useful to everyone !!!
Giving feedback is more precious than writing an article!!! 😊😊😊😊😊
Always welcome both positive and negative feedback's !!!
Feel free to post any queries related SV and UVM
"Be a lifelong student. The more you learn, the more you earn and the more self-confidence you will have" - Brain Tracy
Good analysis! Thanks for sharing.
ReplyDeleteNice explanation
ReplyDelete