在 for 循环中使用 $writememh

Use of $writememh in for loop

我们可以在for循环中使用$writememh吗?我正在尝试从不同的内存中交替写入文件。我收到警告:"Warning: More indices than needed".

我用谷歌搜索,但没有关于此警告的任何内容。下面是示例代码:

reg [7:0] Mem_x[1023:0];
reg [7:0] Mem_y[1023:0];
reg [7:0] Mem_z[1023:0];
reg [31:0] image[1023:0];

initial
begin

#1000
for (l = 0; l < 25; l = l + 1)  

    @(posedge Clock)
     begin 
        $writememh ("writefile_out.hex",Mem_x[l]);  
        $writememh("writefile_out.hex",Mem_y[l]); 
        $writememh("writefile_out.hex",Mem_z[l]);
        $writememh("writefile_out.hex",image[l][7:0]); 
     end
end

我假设 Mem_xMem_yMem_zimage 声明如下:

integer Mem_x[0:24];
integer Mem_y[0:24];
integer Mem_z[0:24];
reg [7:0] image[0:24];

在这种情况下,您需要一个内容如下的文件:

{Mem_x[0]}
{Mem_y[0]}
{Mem_z[0]}
{image[0]}
{Mem_x[1]}
{Mem_y[1]}
{Mem_z[1]}
{image[1]}
{Mem_x[2]}
...

其中每个变量都以十六进制值表示。

如果是,则不能使用$writememh来实现;因为 $writememh 覆盖给定的文件,所以它不会附加到它。因此,每次调用时,您都会删除 "writefile_out.hex" 的先前内容。此外,您收到该错误的原因是因为 Mem_x[l] 和其他不是数组,它们是数组的元素并且 $writememh 需要一个数组作为参数(因此,索引错误太多)。

但是,您可以使用 $fdisplay 来实现您想要的(然后是一些)。这是一个例子:

integer outfile;
integer i;
reg [7:0] mem1[0:9];
reg [7:0] mem2[0:9];

initial begin
  outfile = $fopen("out.hex");
  ...
  for (i = 0; i < 10; i = i + 1) begin
    $fdisplay(outfile, "%02x\n%02x\n", mem1[i], mem2[i]);
  end
  ...
end

使用 $fdisplay 意味着您可以根据自己的喜好格式化输出,因此不必将其限制为 $readmemh$writememh 使用的标准十六进制格式,除非您想要是的,那么你就用我上面的东西。