Son “look-up tables” y equivaldrían a los hashes de Perl
Su sintaxis es :
data-type array-name [ index-data-type | * ]
Siendo el index-data-type:
- indefinido: mediante un *, indicando que el tipo es cualquier tipo de dato integral
- En cualquier otro caso debe ser: string, int, integer, (un)signed packed array, or (un)packed structure
Ejemplo1:
integer notas[string];
notas["Carlos"] = 2;
notas["Pedro"] = 5;
Ejemplo2:
int lista[*];
lista[ 2'd5 ] = 1;
lista[ 16'hfff0 ] = 2;
lista[ 4'b1010 ] = 3;
Métodos predefinidos:
Función | Parámetros | Resultado |
num() | – | Devuelve número de elementos |
delete() | índice (por valor) | Borra elemento indicado |
exists() | índice (por valor) | Indica si el elemento existe |
first() | índice (por referencia) | Asocia el índice del primer elemento al parámetro (devuelve cero si el array está vacío) |
last() | índice (por referencia) | Asocia el índice del último elemento al parámetro (devuelve cero si el array está vacío) |
next() | índice (por referencia) | Asocia el índice del siguiente elemento al parámetro (devuelve cero si el array está vacío) |
prev() | índice (por referencia) | Asocia el índice del anterior elemento al parámetro (devuelve cero si el array está vacío) |
Ejemplo de aplicación
Queremos hacer un detector de tipos de paquetes ethernet y que almacene ordenadamente en un array las ocurrencias de cada tipo.
Dado que el tipo ethernet tiene 16 bits necesitaríamos un array de 65536 posiciones ; pero normalmente en una red local no aparecen tantos tipos distintos ni muchísimo menos Ø
Podríamos pensar en poner un array bidimensional de Nx2 enteros, siendo una columna para el tipo y otra para en cuantos paquetes se ha detectado ese tipo, pero necesitaríamos además funciones de búsqueda y ordenación. Además está el problema de qué pasa si se nos llena.
Solución: usar un array asociativo.
int tipos_paquete[shortint]; // tipo de paquete es 16 bits
task almacena_tipo(shortint tipo)
if (!tipos_paquete.exists[tipo])
tipos_paquete[tipo] = 1;
else
tipos_paquete[tipo]++;
endfunction
. . .
// Cada vez que llega un paquete llamamos a almacena_tipo
. . .
// Al final de la simulación mostramos resultado
shortint tipo;
if (tipos_paquete.first(tipo)) begin // vemos si hay elementos
do
$display ("Recibidos %d paquetes de tipo %d\n",
tipos_paquete[tipo], tipo);
while ( tipo_paquete.next(tipo));
end