提问人:Ray H 提问时间:10/11/2023 最后编辑:Ray H 更新时间:10/11/2023 访问量:66
$fopen返回 MCD,但 MCD 不起作用
$fopen returns the MCD, but the MCD does not work
问:
我正在尝试打开一个文件并编写东西,很简单。我的实现不是那么简单。 我正在使用 Verilog/SystemVerilog 和 Modelsim [编辑 - 供将来参考 Windows 操作系统]。我在 Modelsim 中的命令行是:
set generics "-gLOG_FILENAME=log_file?.txt"
vsim -onfinish stop -noglitch -voptargs=+acc -t ns filetest {*}$generics
问号是尝试创建文件打开错误。
我的 Verilog 模块是
`include "./simulationDefs.v"
module filetest
#( // Parameter passed in via the vsim command line
parameter LOG_FILENAME
)();
integer log_handle;
initial
begin
$display("log_handle=%h", log_handle); // Print MCD
`log_file_open(LOG_FILENAME, log_handle); // Open File
$display("log_handle=%h", log_handle); // Print MCD again
$fdisplay(log_handle, "Test"); // Try to write to file
end
endmodule
我的文件打开宏是:
`define log_file_open(log_filename, log_handle) \
$display("Attempting to open log file - filename=%s", log_filename); \
log_handle = $fopen(log_filename, "a"); \
if (log_handle) $display("Success, log file opened - log_handle=%h", log_handle); \
else $display("****ERROR LOG FILE NOT OPENED**** filename=%s", log_filename);
最后,我的SIM输出:
# Start time: 15:24:21 on Oct 10,2023
# Loading sv_std.std
# Loading work.filetest
# log_handle=xxxxxxxx
# Attempting to open log file - filename=log_file?.txt
# Success, log file opened - log_handle=80000003
# log_handle=80000003
# ** Warning: (vsim-3535) [FOFIA] - Failed to open file "log_file?.txt" for appending.
#
# Invalid argument. (errno = EINVAL) : ft.v(18)
# Time: 0 ns Iteration: 0 Instance: /filetest
# ** Error (suppressible): (vsim-PLI-3085) ft.v(18): $fdisplay : Argument 1 is an unknown file descriptor.
# Time: 0 ns Iteration: 0 Instance: /filetest
$fopen
获取有效的 MCD,但在宏检查其有效性后,模拟器输出“无法打开文件”错误,并且由于未知的文件描述符,下次尝试写入该文件失败。如果我删除 ?所以文件名是有效的,一切正常。这是怎么回事?为什么我得到一个有效的 MCD,而实际上文件没有打开?
答:
您正在尝试在“追加”模式下打开一个文件,显然它在您的文件系统上成功了。我可以在我的 linux 操作系统上打开一个带有问号的文件。
如果可以这样做,则返回非零文件描述符。$fopen
请参阅 IEEE Std 1800-2017,第 21.3.1 节打开和关闭文件:
该函数$fopen打开指定为 filename 参数的文件 并返回 32 位多通道描述符或 32 位文件 描述符,由类型是否存在确定 论点。
文件描述符 fd 是一个 32 位打包数组值。MSB (位 31) 的 FD 是保留的,并且应始终设置
由于使用 的 2 参数形式 ,因此它返回一个文件描述符,该描述符是一个始终设置其 MSB 的数字。这就是为什么你的支票是真的。$fopen
if (log_handle)
请注意,调用 的方式不会返回多通道描述符 (MCD)。$fopen
我尝试了一个实验,我用“r”类型(打开读取)调用,文件描述符是 0。$fopen
我不明白为什么 Modelsim 返回非零文件描述符 (80000003),但随后向您显示该警告消息。这可能是一个工具错误。您应该联系供应商。
评论
if (log_handle >= 0) success...
评论