Я хочу использовать $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
в начальном блоке, вы закрыли его в момент времени 0 до того, как $fmonitor
успел произвести какой-либо вывод. $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 в блок окончательный, если хотите закрыть его перед выходом:
initial begin
$fmonitor(...);
...
end
final begin
...
$fclose(...);
end
Или вы можете придумать какую-то схему событий, которая закроет ваш файл, когда будет сгенерировано определенное событие.
initial
$fmonitor
always @* begin
if (condition)
$fclose()
end