Tengo un trozo de memoria que necesito para acceder celular por celda:
parameter RAM_LENGTH = 1024;
reg [7:0] mem [RAM_LENGTH - 1:0];
Necesito iterar las células secuencialmente. Parece que hay al menos dos formas de hacer esto. El primer enfoque es indexar la memoria como si fuera una matriz de bytes C:
reg [7:0] ram_addr = 0;
reg [7:0] current;
y luego
current = mem[ram_addr];
ram_addr = ram_addr + 1;
Esto es barato para la CPU. ¿Pero qué pasa si el constructor Verilog intentará construir un multiplexor de ancho de byte de 1024 canales 1024 para mí? Este sería un circuito digital de un tamaño tremendo que esta memoria puede no merecer. ¿O es el constructor Verilog lo suficientemente inteligente como para implementar el acceso por índice de manera más razonable?
El enfoque alternativo sería cambiar las celdas cada vez que se necesite el valor:
current <= mem[0];
for (i = 1; i < RAM_LENGTH; i++)
mem[i] <= mem[i-1];
en este caso, espero que el constructor genere un registro de desplazamiento en lugar de un multiplexor demasiado grande, ya que todos los valores que definen el bucle son constantes.
¿Qué enfoque es más razonable y normalmente lo usaría un desarrollador de Verlilog con experiencia?