$fopen返回 MCD,但 MCD 不起作用

$fopen returns the MCD, but the MCD does not work

提问人:Ray H 提问时间:10/11/2023 最后编辑:Ray H 更新时间:10/11/2023 访问量:66

问:

我正在尝试打开一个文件并编写东西,很简单。我的实现不是那么简单。 我正在使用 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,而实际上文件没有打开?

Verilog System-Verilog FOPEN modelsIM

评论

0赞 Ray H 10/11/2023
所以它工作正常,即如果我没有在$fopen上提供第二个参数,就会检测到错误。因此,它似乎确实是某种供应商错误。感谢您查看此内容。我考虑附加到没有“a”的文件。
0赞 Ray H 10/12/2023
对于将来使用Modelsim Altera Starter Edition 10.4d Revision 2015.12的读者,我用这些结果做了一些进一步的实验。如果我尝试打开将合法文件名(无论是否存在)与带有“a”或“a+”的$fopen一起附加,我会得到正确的 fd 8000_0003。如果文件名是非法的,并使用我得到的“a+”和fd为零,这也是正确的。但是,如果我使用“a”,则即使未打开文件,也会返回不正确的 fd 8000_0003。

答:

0赞 toolic 10/11/2023 #1

您正在尝试在“追加”模式下打开一个文件,显然它在您的文件系统上成功了。我可以在我的 linux 操作系统上打开一个带有问号的文件。

如果可以这样做,则返回非零文件描述符。$fopen

请参阅 IEEE Std 1800-2017,第 21.3.1 节打开和关闭文件

该函数$fopen打开指定为 filename 参数的文件 并返回 32 位多通道描述符或 32 位文件 描述符,由类型是否存在确定 论点。

文件描述符 fd 是一个 32 位打包数组值。MSB (位 31) 的 FD 是保留的,并且应始终设置

由于使用 的 2 参数形式 ,因此它返回一个文件描述符,该描述符是一个始终设置其 MSB 的数字。这就是为什么你的支票是真的。$fopenif (log_handle)

请注意,调用 的方式不会返回多通道描述符 (MCD)。$fopen

我尝试了一个实验,我用“r”类型(打开读取)调用,文件描述符是 0。$fopen

我不明白为什么 Modelsim 返回非零文件描述符 (80000003),但随后向您显示该警告消息。这可能是一个工具错误。您应该联系供应商。

评论

0赞 Serge 10/11/2023
80000003十六进制是一个负数,可能与内部模型有关。人们可能应该检查一下if (log_handle >= 0) success...
0赞 Ray H 10/11/2023
当我成功打开具有合法文件名的文件时,我得到相同的文件描述符,我得到相同的0x8000_0003这是问题的症结所在,无法判断打开是否成功。