$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