$fclose 在测试台中的位置
$fclose placement in testbench
我想使用 $fmonitor
以便在每次值更改时将输出值写入文件。
当我将 $fclose
放在 initial begin
块中时,没有错误。然而,不出所料,输出文件是空的。
当我将 $fclose
放在 endmodule
语句之前时,出现语法错误。我应该把它放在哪里?
`timescale 1ns / 1ps
module fir168_input_ones_tb();
integer fp;
reg clk, rst;
wire tvalid, fir_valid, fir_rdy;
wire [15:0] inputdata;
wire signed [39:0] fir_out;
generateOnes indata(
.clk (clk),
.outData (inputdata),
.tlast (tvalid));
fir168 fir168_i
//(.M_AXIS_DATA_0_tdata(fir_out_trunc),
(.M_AXIS_DATA_0_tdata(fir_out),
.M_AXIS_DATA_0_tvalid(fir_valid),
.S_AXIS_DATA_0_tdata(inputdata),
.S_AXIS_DATA_0_tready(fir_rdy),
.S_AXIS_DATA_0_tvalid(tvalid),
.aclk_0(clk));
always begin
clk = ~clk; #5;
end
initial begin
fp = $fopen("simOutput.txt", "w+");
$fmonitorh(fp, fir_out);
clk = 0;
//$display("%d", fir_out);
//$fclose(fp);
end//initial
$fclose(fp);
endmodule
$fclose
必须在程序块内使用,如 initial
块。这就是为什么将它放在 endmodule
.
之前会出现语法错误的原因
如果你想让文件一直写到模拟结束,就不需要调用$fclose
。该文件将在模拟结束时自动关闭。
否则,您需要选择特定时间或信号事件,然后关闭文件。但是,请记住 $fmonitor
将在整个模拟过程中处于活动状态。这意味着如果 fir_out
在您关闭文件后发生变化,您的模拟器可能会生成错误或警告消息。
$fopen
/$fmonitor
/$fclose
都是过程语句,必须放在过程代码里面。
当你在初始块中有 $fclose
时,你在 $fmonitor
有机会产生任何输出之前的时间 0 关闭了它。 $fmonitor
在当前时隙的 then end
写入其参数的状态,当它们中的任何一个更改值时。
您需要让您的模拟 运行 一段时间,然后让它执行 $finish
。没有必要显式使用 $fclose
除非你一次打开太多文件,或者其他进程被阻塞等待文件输出。
$fmoniotor 语句没有做太多,除了它在每个模拟滴答结束时安排监视事件。因此,$fclose 将在第一次执行预定监视器事件之前发出 $fmonitor 的同一时间点关闭文件。
initial begin
$fmonitor(...);
...
$fclose()
end
你可以做几件事:
在 $fmonitor 和 $fclose 之间设置一定的时间距离,让模拟有机会在文件关闭之前做一些事情:
initial begin
$fmoniotor(..);
...
#1000 // add a simulation delay of some value before closing
$fclose(...);
end
如果你想在退出前关闭它,你可以将 $fclose 放在 final 块中:
initial begin
$fmonitor(...);
...
end
final begin
...
$fclose(...);
end
或者你可以想出一些事件方案,当某个事件产生时,它会关闭你的文件。
initial
$fmonitor
always @* begin
if (condition)
$fclose()
end
我想使用 $fmonitor
以便在每次值更改时将输出值写入文件。
当我将 $fclose
放在 initial begin
块中时,没有错误。然而,不出所料,输出文件是空的。
当我将 $fclose
放在 endmodule
语句之前时,出现语法错误。我应该把它放在哪里?
`timescale 1ns / 1ps
module fir168_input_ones_tb();
integer fp;
reg clk, rst;
wire tvalid, fir_valid, fir_rdy;
wire [15:0] inputdata;
wire signed [39:0] fir_out;
generateOnes indata(
.clk (clk),
.outData (inputdata),
.tlast (tvalid));
fir168 fir168_i
//(.M_AXIS_DATA_0_tdata(fir_out_trunc),
(.M_AXIS_DATA_0_tdata(fir_out),
.M_AXIS_DATA_0_tvalid(fir_valid),
.S_AXIS_DATA_0_tdata(inputdata),
.S_AXIS_DATA_0_tready(fir_rdy),
.S_AXIS_DATA_0_tvalid(tvalid),
.aclk_0(clk));
always begin
clk = ~clk; #5;
end
initial begin
fp = $fopen("simOutput.txt", "w+");
$fmonitorh(fp, fir_out);
clk = 0;
//$display("%d", fir_out);
//$fclose(fp);
end//initial
$fclose(fp);
endmodule
$fclose
必须在程序块内使用,如 initial
块。这就是为什么将它放在 endmodule
.
如果你想让文件一直写到模拟结束,就不需要调用$fclose
。该文件将在模拟结束时自动关闭。
否则,您需要选择特定时间或信号事件,然后关闭文件。但是,请记住 $fmonitor
将在整个模拟过程中处于活动状态。这意味着如果 fir_out
在您关闭文件后发生变化,您的模拟器可能会生成错误或警告消息。
$fopen
/$fmonitor
/$fclose
都是过程语句,必须放在过程代码里面。
当你在初始块中有 $fclose
时,你在 $fmonitor
有机会产生任何输出之前的时间 0 关闭了它。 $fmonitor
在当前时隙的 then end
写入其参数的状态,当它们中的任何一个更改值时。
您需要让您的模拟 运行 一段时间,然后让它执行 $finish
。没有必要显式使用 $fclose
除非你一次打开太多文件,或者其他进程被阻塞等待文件输出。
$fmoniotor 语句没有做太多,除了它在每个模拟滴答结束时安排监视事件。因此,$fclose 将在第一次执行预定监视器事件之前发出 $fmonitor 的同一时间点关闭文件。
initial begin
$fmonitor(...);
...
$fclose()
end
你可以做几件事:
在 $fmonitor 和 $fclose 之间设置一定的时间距离,让模拟有机会在文件关闭之前做一些事情:
initial begin
$fmoniotor(..);
...
#1000 // add a simulation delay of some value before closing
$fclose(...);
end
如果你想在退出前关闭它,你可以将 $fclose 放在 final 块中:
initial begin
$fmonitor(...);
...
end
final begin
...
$fclose(...);
end
或者你可以想出一些事件方案,当某个事件产生时,它会关闭你的文件。
initial
$fmonitor
always @* begin
if (condition)
$fclose()
end