No estoy seguro de por qué necesita una opción especial, el uso de memorias es bastante estándar para usar dentro de los módulos. A menos que esté tratando de implicar una celda de potencia / área baja especial similar a un ariete.
Para una memoria estándar es lo mismo que tener varios registros. la memoria no implica RAM de la misma manera que reg no implica automáticamente flip-flop.
La 'memory.list' es un archivo de texto plano que contiene los valores que desea cargar en la memoria, esto no es necesario si solo desea restablecer la memoria y tener todos los elementos en 0.
memory.list debería verse como:
//Comments are allowed
1100_1100 // This is first address i.e 8'h00
1010_1010 // This is second address i.e 8'h01
@ 55 // Jump to new address 8'h55
0101_1010 // This is address 8'h55
0110_1001 // This is address 8'h56
El uso del archivo seguiría:
module memory();
reg [7:0] my_memory [0:255];
initial begin
$readmemh("memory.list", my_memory);
end
endmodule
alternativamente:
module memory();
reg [7:0] my_memory [0:255];
integer i;
initial begin
for( i=0; i<256; i=i+1) //Can be statically unrolled
my_memory[i] = 8'h00 ;
end
endmodule
Si se usa como banco de flip-flops con async-reset:
module memory(
input clk,
input rst_n,
input [7:0] addr_wr,
input [7:0] data_wr
);
reg [7:0] my_memory [0:255];
integer i;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
for( i=0; i<256; i=i+1) //Can be statically unrolled
my_memory[i] <= 8'h00 ;
end
else begin
my_memory[addr_wr] <= data_wr ;
end
end
endmodule