Arrays dinámicos

  • Son arrays “unpacked” que no tienen tamaño predefinido.
  • Su tamaño se determina dinámicamente asignándose a new[tamaño]
  • Opcionalmente se puede inicializar con los valores de otro array (o incluso de él mismo, para redimensionar)
  • Las funciones incluídas size() y delete() sirven para obtener su tamaño y para reducir este a cero, respectivamente
int d[], b[];         // Two dynamic arrays
d = new[5];           // Make array with 5 elements

foreach (d[j])        // Initialize
   d[j] = j;

b = d;                // Copy a dynamic array
b[0] = 5;

$display(d[0],b[0]);  // See both values (0 & 5)

d = new[20](d);       // Expand and copy

d = new[100];         // Allocate 100 new integers
                      // Old values are lost

d.delete();           //Delete all elements

Ejemplo de aplicación: Supongamos que tenemos definida una función que calcula el CRC de un paquete de datos e 8 bits , siendo este paquete de datos de tamaño variable.

function [7:0] crc (bit [7:0] packet[])
  int tam;
  tam = packet.size();
  crc = 0;
  for (int i=0; i <= tam -1; i++) begin
     ...
  end
endfunction

Supongamos ahora una generador de paquetes aleatorios, tanto en su tamaño como en los datos en si de ese tamaño aleatorio.

// Generador de paquetes aleatorios
bit [7:0] paquete[];
tamanno = $random();
paquete = new[tamanno];
for (int i = 0; i <= paquete.size() -1; i++) begin
  paquete[i] = rnd();
end

Finalmente supongamos que recibimos ese paquete de datos y queremos calcular su CRC y añadirlo al paquete de datos como último dato incorporado al array

// calculamos CRC
bit [7:0] mi_crc = crc(paquete);
// incrementamos tamaño de paquete
paquete = new[tamanno + 1](paquete)
// añadimos CRC al final del paquete.
paquete[tamanno] = mi_crc;