SystemVerilog Dynamic Array Randomization

Dynamic Array Randomize


For a dynamic array, it is possible to randomize both array size and array elements.

randomize dynamic array size


In below example, dynamic array size will get randomized based on size constraint, and array elements will get random values.
  1. Declare array as rand
  2. Write constraint for array size, On randomization array size will get the random size

class dynamic_array;
  rand bit [3:0] array1[ ];
  rand bit [7:0] array2[ ];

  constraint a1_size_c { array1.size() inside {[4:10]}; }
  constraint a2_size_c { array2.size() inside {[4:10]}; }
  
  function void display();
    $display("array1 size is = %0d",array1.size());
    $display("array1 = %p",array1);
    $display("array2 size is = %0d",array2.size());
    $display("array2 = %p",array2);
  endfunction
endclass

program dynamic_array_randomization;
  dynamic_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
  
endprogram 

 Simulator Output: 

array1 size is = 7
array1 = '{'h0, 'hf, 'he, 'h4, 'hf, 'h9, 'h8}
array2 size is = 10
array2 = '{'he, 'hab, 'hb0, 'h29, 'h57, 'h52, 'h26, 'h49, 'h34, 'h49}

Execute the above code on 

array size based on another random variable


In the below example, the array size is constrained based on the value of another element.
  1. Declare array as rand
  2. On randomization, the array will get size based on the value of burst type

typedef enum {SINGLE,INCR,INCR4,WRAP4,INCR8,WRAP8} burst_t;

class dy_array;
  rand burst_t   burst_type;
  rand bit [7:0] data[ ];

  constraint data_s { 
    (burst_type == SINGLE)-> data.size() == 1;
    (burst_type == INCR)  -> data.size() == 1;
    (burst_type == INCR4) -> data.size() == 4;
    (burst_type == WRAP4) -> data.size() == 4;
    (burst_type == INCR8) -> data.size() == 8;
    (burst_type == WRAP8) -> data.size() == 8; }
  
  function void display();
    $display("burst_type = %s",burst_type.name());
    $display("data array size is = %0d",data.size());
    $display("data array = %p",data);
  endfunction
endclass

program dynamic_array_randomization;
  dy_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 

 Simulator Output: 

burst_type = WRAP4
data array size is = 4
data array = '{'h54, 'h88, 'h9b, 'h9a}
Execute the above code on 

Generate unique elements in an array


In the below example.
  1. Constrain array with element value same as an index value
  2. In post randomization shuffle the array, so that array will not have an incremental values

class dynamic_array;
  rand bit [7:0] array[ ];
  
  constraint size_c  { array.size() inside {[4:10]}; }
  constraint array_c { foreach(array[i]) array[i] == i;}
  
  function void post_randomize();
    array.shuffle();  
  endfunction
  
  function void display();
    $display("array size is = %0d",array.size());
    $display("array = %p",array);
  endfunction
  
endclass

program dynamic_array_randomization;
  dynamic_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 

 Simulator Output: 

array size is = 7
array = '{'h3, 'h6, 'h2, 'h1, 'h4, 'h5, 'h0}

Execute the above code on 

Sum method used in a dynamic array


In the below example, an array is randomized in such a way that the sum of all the elements equals to 45.

  1. Declare array with rand
  2. Constraint sum of an array using array method sum()

class dynamic_array;
  rand bit [7:0] array[ ];
  
  constraint size_c   { array.size() inside {[4:10]}; }
  constraint array_c  { array.sum() == 45;}
  constraint array_ec { foreach(array[i]) array[i] > 1;}
  
  function void display();
    $display("array size is = %0d",array.size());
    $display("array = %p",array);
  endfunction
endclass

program dynamic_array_randomization;
  dynamic_array pkt;

  initial begin
    pkt = new();
    pkt.randomize();
    pkt.display();   
  end
endprogram 

 Simulator Output: 

array size is = 7
array = '{'h2, 'h15, 'h2, 'h2, 'h2, 'h2, 'he}
Execute the above code on