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

pai*_*igu 6 verilog fpga intel-fpga quartus

我设计了一个模块,它里面有ram.现在我需要在顶层设计中使用这个模块的多个实例,并且每个实例的ram都需要用不同的内容进行初始化.

我检查了quartus手册,它支持使用$ readmemh来初始化ram.所以我向这个模块添加了两个参数,并将不同的参数传递给它的实例,这样我就可以保证每个实例读取不同的文件.

这是我的代码,它在modelsim中完美运行,但是当在quartus中进行合成时,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
Run Code Online (Sandbox Code Playgroud)

在顶级,我将不同的参数传递给每个实例,如下所示

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 (...)
Run Code Online (Sandbox Code Playgroud)

我有多个文件夹,通过这样做,每个实例读取自己的文件集.我没有发现任何人喜欢这样,它在modelsim中工作,并且使用quartus分析并成功地详细说明了这一点.

但它会导致quartus_map在合成时崩溃.我找不到有关此错误消息的任何信息.

如果我不能这样做,有没有什么好的方法来初始化具有不同内容的多个实例的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
Run Code Online (Sandbox Code Playgroud)

在顶级,我像这样实例化ram:

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));
Run Code Online (Sandbox Code Playgroud)

这一次,quartus没有崩溃,合成成功.似乎quartus允许我这样做.

Cap*_*nJJ 0

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

如果 Altera/Intel 让您摆脱这种情况,那么就层次引用而言,这个问题也可能对您有所帮助:

https://github.com/YosysHQ/yosys/issues/344