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:
1 2 3 4 |
integer notas[string]; notas["Carlos"] = 2; notas["Pedro"] = 5; |
Ejemplo2:
1 2 3 4 5 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |