在 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_x
、Mem_y
、Mem_z
和 image
声明如下:
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
使用的标准十六进制格式,除非您想要是的,那么你就用我上面的东西。
我们可以在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_x
、Mem_y
、Mem_z
和 image
声明如下:
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
使用的标准十六进制格式,除非您想要是的,那么你就用我上面的东西。