将 SystemVerilog $display 发送到 stderr

nob*_*bar 2 verilog stdout stderr system-verilog verilator

我正在使用Verilator将用 SystemVerilog 编写的算法合并到可执行实用程序中,该实用程序操作通过stdin和传递的 I/O 流stdout。不幸的是,当我使用 SystemVerilog$display()函数时,输出会转到stdout. 我希望它能继续使用,stderr这样stdout我的其他用途就不会受到污染。

我怎样才能做到这一点?

nob*_*bar 5

感谢 @toolic 指出 的存在$fdisplay(),因此可以使用它......

$fdisplay(STDERR,"hello world"); // also supports formatted arguments
Run Code Online (Sandbox Code Playgroud)

IEEE Std 1800-2012 规定STDERR应该预先打开,但 Verilator 似乎并不知道。解决此问题的方法是:

integer STDERR = 32'h8000_0002;
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建一个日志文件句柄以供使用,$fdisplay()如下所示...

integer logfile;
initial begin
   $system("echo 'initial at ['$(date)']'>>temp.log");
   logfile = $fopen("temp.log","a"); // or open with "w" to start fresh
end
Run Code Online (Sandbox Code Playgroud)

$display如果您可以创建一个自定义包装器,其工作方式类似于但使用您选择的文件描述符(无需每次都指定它),那可能会很好。不幸的是,这在语言本身中似乎是不可能的——但也许你可以使用DPI来做到这一点,请参阅DPI 显示函数(到目前为止我还没有让它工作)。

  • STDERR 尚未存在于 VCS SystemVerilog 上。我在维基百科上发现文件描述符数字/整数通常是 `STDOUT == 1` 和 `STDERR == 2`...使用 `$fdisplay(1, "Hello World")` 在这里效果很好。 (2认同)