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

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

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


person Brent Bradburn    schedule 16.10.2015    source источник


Ответы (1)


Спасибо @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 (пока у меня это не работает).

person Brent Bradburn    schedule 16.10.2015
comment
STDERR еще не существовал здесь, в VCS SystemVerilog. В википедии я обнаружил, что числа / целые числа дескриптора файла обычно STDOUT == 1 и _2 _... с использованием $fdisplay(1, "Hello World") здесь отлично работает. - person nmz787; 31.01.2018