【发布时间】:2022-01-10 07:50:14
【问题描述】:
我需要用不同的数据文件初始化同一个 ram 模块的几个实例,我想这样做如下:
module ram #(
string HEXFILE = "split1.mem"
)
(
input logic clk,
input logic [31:0] a,
input logic [7:0] wd,
input logic we,
output logic [7:0] rd
);
logic [7:0] mem [3071:0];
integer fd;
initial $readmemh(HEXFILE, mem);
always_ff @(posedge clk) begin
if (we) mem[a] <= wd;
rd <= mem[a];
end
endmodule
在我的顶级实体中,将它们初始化如下:
ram #(
.HEXFILE("split1.mem")
) M0 (
.clk(clk),
.a(a0),
.wd(wd0),
.we(we),
.rd(rd0)
);
ram #(
.HEXFILE("split2.mem")
) M1 (
.clk(clk),
.a(a1),
.wd(wd1),
.we(we),
.rd(rd1)
);
// And so on ...
但是当我尝试这样做时,我收到以下错误:
Error (10686): SystemVerilog error at ram.sv(18): HEXFILE has an aggregate value
如果我对文件名使用字符串文字,它可以正常工作:
initial $readmemh("split1.mem", mem)
关于如何在不创建相同文件的副本来更改输入文件的情况下实现这一点的任何想法?
编辑:我认为 Verilog 以不同的方式处理参数和字符串文字。它将string 视为logic 的扩展,这就是它说它需要扩展的原因。
我不知道如何将其定义为字符串文字。以下似乎有效,但在我看来这是一种可怕的可怕方式:
generate
if (HEXFILE == "split1.mem") initial $readmemh("split1.mem", mem);
else if (HEXFILE == "split2.mem") initial $readmemh("split2.mem", mem);
else if (HEXFILE == "split3.mem") initial $readmemh("split3.mem", mem);
else if (HEXFILE == "split4.mem") initial $readmemh("split4.mem", mem);
endgenerate
【问题讨论】:
标签: verilog system-verilog fpga quartus intel-fpga