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允许我这样做.
IEEE-1800 综合标准不支持“初始块”。
如果 Altera/Intel 让您摆脱这种情况,那么就层次引用而言,这个问题也可能对您有所帮助:
https://github.com/YosysHQ/yosys/issues/344