如何使每个模块实例从唯一文件中读取?

问题描述

在top.v中,我生成pe模块的X_MAX * Y_MAX实例。在pe.v中,我想初始化专门为该实例生成的内存。例如,在x = 0,y = 1处:“ pe_memory_x0_y0.dat”。这是我的顶级模块的样子:

genvar x,y;
    generate for (y = 0; y < Y_MAX; y = y + 1) begin : ys
        for (x = 0; x < X_MAX; x = x + 1) begin : xs
         pe #(
            .X_MAX(X_MAX),.Y_MAX(Y_MAX),.X(x),.Y(y)
            )
            pe_inst(
                .clk(clk),...
            );

在pe.v内部,类似

$display("Loading pe memory at (%0d,%0d)",X,Y);

initial块中工作!但是当我需要$readmem$时,

$readmemb({"pe_memory_","_y",Y,".dat"},n_bound_sel_memory);

不起作用:

X的宽度不确定

指定X的宽度(其值来自parameter的{​​{1}})会引发更多错误

我的目标是Xilinx FPGA,我正在尝试使用genvar模拟我的设计。

解决方法

您可以使用$sformatf来构建文件名:

$readmemb($sformatf("pe_memory_%0d_y%0d.dat",X,Y),n_bound_sel_memory);

请参阅IEEE Std 1800-2017,第21.3.3节将数据格式化为字符串