es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for 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:

    module ram #(
      parameter string HEXFILE = "split1.mem"
    ) ...
    

    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:

    ram #(
      .HEXFILE("split1.mem")
    ) M0 (
      ...
    );
    
    ram #(
      .HEXFILE("split2.mem")
    ) M1 (
      ...
    );
    
    // Y así sucesivamente ...
    

    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.

Comments are closed.