SystemVerilog Dynamic Array Randomization

Dynamic Array Randomize


For 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 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 other random variable


In below example array size is constrained based on value of other element.
  1. Declare array as rand
  2. On randomization array will get size based on 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 below example .
  1. Constrain array with element value same as 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 use in dynamic array


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

  1. Declare array with rand
  2. Constraint sum of 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