2

我正在使用Verilator将用 SystemVerilog 编写的算法合并到一个可执行实用程序中,该实用程序操作通过stdin和传递的 I/O 流stdout。不幸的是,当我使用 SystemVerilog$display()函数时,输出变为stdout. 我希望它能够用于我的其他目的stderrstdout不受污染。

我怎样才能做到这一点?

4

1 回答 1

4

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

$fdisplay(STDERR,"hello world"); // also supports formatted arguments

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

integer STDERR = 32'h8000_0002;

或者,您可以创建一个日志文件句柄以用于$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

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

于 2015-10-16T02:56:54.970 回答