如何在quartus

时间:2017-04-03 02:44:58

标签: 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

在顶层,我将不同的参数传递给每个实例,如

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允许我这样做。

1 个答案:

答案 0 :(得分:0)

&#34;初始块&#34; IEEE-1800合成标准不支持。

如果Altera /英特尔允许您逃避这一点,那么在分层参考方面存在这个问题,这也可能对您有所帮助:

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