System Verilog : Rand & Randc
Last modified 2017-01-27
Sini
There are two type-modifier keywords available in system Verilog to declare class variable as random.
Variables declared with the rand keyword are standard random variables. Their values are uniformly distributed over their range.
Variables declared with the randc keyword are random-cyclic variables that cycle through all the values in a random permutation of their declared range.
typedef enum {ALEX="ALEX",BOB="BOB",CHI="CHI",DIP="DIP",ETY="EIY",FENU="FENU",GOG="GOG",HIVU="HIVU"} students;
class randrandcclass;
rand students studentsr;
randc students studentsrc;
endclass
program myprog;
randrandcclass c1 = new;
initial begin
$display("RAND PERM 1==============================================================");
repeat (8) begin
c1.randomize();
$display ("Using Rand Student : %s ", c1.studentsr);
end
$display("RANDC PERM 1 ============================================================");
repeat (8) begin
c1.randomize();
$display ("Using RandC Student : %s ", c1.studentsrc);
end
$display("RAND PERM 2==============================================================");
repeat (8) begin
c1.randomize();
$display ("Using Rand Student : %s ", c1.studentsr);
end
$display("RANDC PERM 2 ============================================================");
repeat (8) begin
c1.randomize();
$display ("Using RandC Student : %s ", c1.studentsrc);
end
$display("RAND PERM 3==============================================================");
repeat (8) begin
c1.randomize();
$display ("Using Rand Student : %s ", c1.studentsr);
end
$display("RANDC PERM 3 ============================================================");
repeat (8) begin
c1.randomize();
$display ("Using RandC Student : %s ", c1.studentsrc);
end
end
endprogram
RAND PERM 1======================================================
Using Rand Student : EIY
Using Rand Student : ALEX
Using Rand Student : FENU
Using Rand Student : EIY
Using Rand Student : HIVU
Using Rand Student : BOB
Using Rand Student : ALEX
Using Rand Student : DIP
RANDC PERM 1 ====================================================
Using RandC Student : EIY
Using RandC Student : HIVU
Using RandC Student : FENU
Using RandC Student : BOB
Using RandC Student : GOG
Using RandC Student : ALEX
Using RandC Student : CHI
Using RandC Student : DIP
RAND PERM 2======================================================
Using Rand Student : BOB
Using Rand Student : GOG
Using Rand Student : CHI
Using Rand Student : CHI
Using Rand Student : EIY
Using Rand Student : CHI
Using Rand Student : GOG
Using Rand Student : BOB
RANDC PERM 2 ====================================================
Using RandC Student : BOB
Using RandC Student : DIP
Using RandC Student : FENU
Using RandC Student : GOG
Using RandC Student : CHI
Using RandC Student : EIY
Using RandC Student : ALEX
Using RandC Student : HIVU
RAND PERM 3=======================================================
Using Rand Student : FENU
Using Rand Student : BOB
Using Rand Student : EIY
Using Rand Student : ALEX
Using Rand Student : CHI
Using Rand Student : EIY
Using Rand Student : GOG
Using Rand Student : GOG
RANDC PERM 3 =====================================================
Using RandC Student : CHI
Using RandC Student : GOG
Using RandC Student : ALEX
Using RandC Student : FENU
Using RandC Student : HIVU
Using RandC Student : BOB
Using RandC Student : DIP
Using RandC Student : EIY
In the above code all names are declared as rand (studentsr) and randc (studentsrc).
Randomization result for studentsr and studentsrc are shown above. In this we can see that studentsrc (randc) cycle through all the values in a permutation.
class randrandcclass;
rand bit \[1:0\] r;
randc bit \[1:0\] rc;
endclass
program myprog;
randrandcclass c1 = new;
initial begin
$display("RAND Perm1 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize();
$display ("Rand r = %d ",c1.r);
end
$display("RANDC Perm1 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize(;
$display ("Randc rc = %d -> ",c1.rc);
end
$display("RAND Perm 2------------------");
for(int j =0; j<4; j++) begin
c1.randomize();
$display ("Rand r = %d ",c1.r);
end
$display("RANDC Perm 2 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize(;
$display ("Randc rc = %d ->",c1.rc);
end
$display("RAND Perm3 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize();
$display ("Rand r = %d ",c1.r);
end
$display("RANDC Perm3 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize(;
$display ("Randc rc = %d -> ",c1.rc);
end
$display("RAND Perm 4------------------");
for(int j =0; j<4; j++) begin
c1.randomize();
$display ("Rand r = %d ",c1.r);
end
$display("RANDC Perm 4 ------------------");
for(int j =0; j<4; j++) begin
c1.randomize(;
$display ("Randc rc = %d ->",c1.rc);
end
end
endprogram
RAND Perm1 ------------------
Rand r = 0
Rand r = 0
Rand r = 1
Rand r = 0
RANDC Perm1 ------------------
Randc rc = 1 ->
Randc rc = 2 ->
Randc rc = 3 ->
Randc rc = 0 ->
RAND Perm 2------------------
Rand r = 2
Rand r = 3
Rand r = 2
Rand r = 1
RANDC Perm 2 ------------------
Randc rc = 3 ->
Randc rc = 2 ->
Randc rc = 0 ->
Randc rc = 1 ->
RAND Perm3 ------------------
Rand r = 2
Rand r = 0
Rand r = 2
Rand r = 2
RANDC Perm3 ------------------
Randc rc = 0 ->
Randc rc = 3 ->
Randc rc = 1 ->
Randc rc = 2 ->
RAND Perm 4------------------
Rand r = 3
Rand r = 1
Rand r = 0
Rand r = 2
RANDC Perm 4 ------------------
Randc rc = 1 ->
Randc rc = 2 ->
Randc rc = 0 ->
Randc rc = 3 ->
Another example to show that randc cycle through all the values in a permutation.
RANDC Perm1 ------------------ Randc rc = 1 -> Randc rc = 2 -> Randc rc = 3 -> Randc rc = 0 ->
RANDC Perm2 ------------------ Randc rc = 3 -> Randc rc = 2 -> Randc rc = 0 -> Randc rc = 1 ->
RANDC Perm3 ------------------ Randc rc = 0 -> Randc rc = 3 -> Randc rc = 1 -> Randc rc = 2 ->
RANDC Perm4 ------------------ Randc rc = 1 -> Randc rc = 2 -> Randc rc = 0 -> Randc rc = 3 ->