我设计了一个模块,它里面有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
在顶层,我将不同的参数传递给每个实例,如
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_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
在顶层,我像这样实例化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));
这一次,quartus没有崩溃,成功合成。似乎quartus允许我这样做。
答案 0 :(得分:0)
&#34;初始块&#34; IEEE-1800合成标准不支持。
如果Altera /英特尔允许您逃避这一点,那么在分层参考方面存在这个问题,这也可能对您有所帮助: