Отправить SystemVerilog $display на stderr

Я использую Verilator для включения алгоритма, написанного в SystemVerilog, в исполняемую утилиту, которая управляет потоками ввода-вывода, передаваемыми через stdin а также stdout, К сожалению, когда я использую SystemVerilog $display() функция, выход идет в stdout, Я хотел бы пойти в stderr чтобы stdout остается незагрязненным для других моих целей.

Как я могу сделать это?

1 ответ

Спасибо @toolic за указание на существование $fdisplay(), который можно использовать таким образом...

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

Стандарт IEEE 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 (до сих пор я не работал с этим).

Другие вопросы по тегам