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