En el Intel Quartus, ¿puedo inicializar la RAM utilizando un parámetro de tipo string?
Necesito inicializar varias instancias del mismo módulo RAM con diferentes archivos de datos, lo cual me gustaría hacer de la siguiente manera:
module ram #(
string HEXFILE = "split1.mem"
)
(
input logic clk,
input logic [31:0] a,
input logic [7:0] wd,
input logic we,
output logic [7:0] rd
);
logic [7:0] mem [3071:0];
integer fd;
initial $readmemh(HEXFILE, mem);
always_ff @(posedge clk) begin
if (we) mem[a] <= wd;
rd <= mem[a];
end
endmodule
Y en mi entidad de nivel superior, inicializa de la siguiente manera:
ram #(
.HEXFILE("split1.mem")
) M0 (
.clk(clk),
.a(a0),
.wd(wd0),
.we(we),
.rd(rd0)
);
ram #(
.HEXFILE("split2.mem")
) M1 (
.clk(clk),
.a(a1),
.wd(wd1),
.we(we),
.rd(rd1)
);
// Y así sucesivamente ...
Pero cuando intento hacer esto, obtengo el siguiente error:
Error (10686): Error de SystemVerilog en ram.sv(18): HEXFILE tiene un valor agregado
Funciona bien si uso un literal de cadena para el nombre del archivo:
initial $readmemh("split1.mem", mem)
¿Alguna idea de cómo puedo lograr esto sin crear copias del mismo archivo solo para cambiar el archivo de entrada?
EDITAR: Creo que Verilog trata los parámetros y literales de cadena de manera diferente. Está tratando “string” como una extensión de “logic”, por eso dice que necesita ser extendido.
No sé cómo definirlo como un literal de cadena. Lo siguiente parece funcionar, pero es una forma terrible, terrible en mi opinión:
generate
if (HEXFILE == "split1.mem") initial $readmemh("split1.mem", mem);
else if (HEXFILE == "split2.mem") initial $readmemh("split2.mem", mem);
else if (HEXFILE == "split3.mem") initial $readmemh("split3.mem", mem);
else if (HEXFILE == "split4.mem") initial $readmemh("split4.mem", mem);
endgenerate
davy.ai
El error que estás viendo se debe a que Verilog está tratando el parámetro
HEXFILE
como un valor agregado en lugar de un literal de cadena.Para definir
HEXFILE
como un literal de cadena, debes encerrar el valor entre comillas dobles dentro de la definición del módulo:Ten en cuenta que también he cambiado
HEXFILE
para que sea un parámetro, ya que esto es más apropiado para un valor que no cambiará durante la simulación.Luego, en la entidad de nivel superior, puedes especificar el valor de
HEXFILE
para cada instancia:De esta manera, no necesitas crear copias del mismo archivo para cada instancia y puedes especificar fácilmente el archivo de datos para cada una.