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 ->