Verilog 如何在quartus中初始化多个不同内容的实例的ram

Verilog 如何在quartus中初始化多个不同内容的实例的ram,verilog,fpga,intel-fpga,quartus,Verilog,Fpga,Intel Fpga,Quartus,我设计了一个RAM模块,我需要这个模块的多个实例,每个实例都有一个不同的内存初始化文件 Quartus手册说Quartus支持$readmemh()函数初始化RAM。因此,我在这个模块中添加了两个参数,并将不同的参数传递给每个实例,以便指定每个实例将读取哪些文件 我下面的代码在Modelsim中工作,但在合成时失败。Quartus崩溃,在我移除它之后,Quartus成功地合成 module cell_module #( parameter X_ID = "1", paramete

我设计了一个RAM模块,我需要这个模块的多个实例,每个实例都有一个不同的内存初始化文件

Quartus手册说Quartus支持
$readmemh()
函数初始化RAM。因此,我在这个模块中添加了两个参数,并将不同的参数传递给每个实例,以便指定每个实例将读取哪些文件

我下面的代码在Modelsim中工作,但在合成时失败。Quartus崩溃,在我移除它之后,Quartus成功地合成

module cell_module
#(
    parameter X_ID = "1",
    parameter Y_ID = "1",
    parameter DIR_ID = {X_ID, "_", Y_ID}
)
...
reg [15:0]           Mem_1 [0:31];
reg [15:0]           Mem_2 [0:31];
`ifdef SIM_MEM_INIT
    initial begin
    $readmemh ({"../data", DIR_ID, "/file1.txt"},Mem_1);
    $readmemh ({"../data", DIR_ID, "/file2.txt"},Mem_2);
    end
`endif
上面的模块在顶层实例化如下:

cell_module #(.X_ID("1"), .Y_ID("1")) cell_module1 (...)
cell_module #(.X_ID("1"), .Y_ID("2")) cell_module2 (...)
cell_module #(.X_ID("2"), .Y_ID("1")) cell_module3 (...)
cell_module #(.X_ID("2"), .Y_ID("2")) cell_module4 (...)
这些参数指定哪个文件夹包含该单元格的初始内存。 这段代码在Modelsim中工作,Quartus分析和详细阐述成功完成

但合成时会导致quartus_贴图崩溃。我找不到有关此错误消息的任何信息

如果这是不可能的,有没有什么好的方法可以用不同的内容初始化多个实例的RAM? 谢谢

编辑:

我建立了一个小的Quartus项目来测试是否可以做到这一点。我遵循Quartus手册编写了一个标准RAM模块,其中包含两个额外参数,用于定义初始化内存文件的文件夹。 这是ram的代码

module mem_init
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6, parameter X_ID = "1", Y_ID = "1", DIR_ID = {X_ID,"_", Y_ID})
(input [(DATA_WIDTH-1):0] data,
input [(ADDR_WIDTH-1):0] addr,
input we, clk,
output [(DATA_WIDTH-1):0] q);

reg [DATA_WIDTH-1:0] ram[2**ADDR_WIDTH-1:0];
reg [ADDR_WIDTH-1:0] addr_reg;

initial 
begin : INIT
    $readmemh ("../data", DIR_ID, "/file.txt", ram);
end 

always @ (posedge clk)
begin
    if (we)
        ram[addr] <= data;
    addr_reg <= addr;
end
assign q = ram[addr_reg];
endmodule
这在模拟中起作用,Quartus成功地综合了该设计。

IEEE-1800综合标准不支持“初始块”

如果Altera/Intel让您侥幸逃脱,那么就分层引用而言,这个问题也可能对您有所帮助:

mem_init #(.DATA_WIDTH(DATA_WIDTH), .ADDR_WIDTH(ADDR_WIDTH), .X_ID("1"), .Y_ID("1"))
mem1 (.data(data1), .addr(add1), .we(we), .clk(clk), .q(q1));

mem_init #(.DATA_WIDTH(DATA_WIDTH), .ADDR_WIDTH(ADDR_WIDTH), .X_ID("1"), .Y_ID("2"))
mem2 ( .data(data2),.addr(add2),.we(we), .clk(clk), .q(q2));