Мастерство задач отображения в Verilog: эффективная отладка и логирование
Системные задачи отображения (display) 주로 используются для вывода информационных и отладочных сообщений, отслеживания хода симуляции из логов и ускорения отладки. Существуют разные группы задач отображения и форматы печати значений.
Задачи Display/Write
Синтаксис
$display и $write выводят аргументы в порядке их появления.
$display(<list_of_arguments>);
$write(<list_of_arguments>);
$write не добавляет символ новой строки \n в конец строки, а $display добавляет — видно в примере.
Пример
module tb;
initial begin
$display ("This ends with a new line ");
$write ("This does not,");
$write ("like this. To start new line, use newline char ");
$display ("This always start on a new line !");
end
endmodule
Simulation Log
ncsim> run This ends with a new line This does not,like this. To start new line, use newline char Hi there ! ncsim: *W,RNQUIE: Simulation is complete.
Verilog Strobes
$strobe печатает финальные значения переменных в конце текущего дельта-таймстепа, формат похож на $display.
module tb;
initial begin
reg [7:0] a, b;
a = 8'h2D; b = 8'h2D;
#10;
b <= a + 1;
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1;
$display ("[$display] time=%0t a=0x%0h b=0x%0h", $time, a, b);
$strobe ("[$strobe] time=%0t a=0x%0h b=0x%0h", $time, a, b);
end
endmodule
Обратите внимание: $strobe показывает финальное обновленное значение b в 10нс — 0x2E, а $display подхватывает это только в следующем дельта-шаге в 11нс.
Simulation Log
ncsim> run [$display] time=10 a=0x2d b=0x2d [$strobe] time=10 a=0x2d b=0x2e [$display] time=11 a=0x2d b=0x2e [$strobe] time=11 a=0x2d b=0x2e ncsim: *W,RNQUIE: Simulation is complete.
Непрерывные мониторы (Continuous Monitors)
$monitor автоматически печатает значения переменных или выражений при каждом их изменении. Аналогично вызову $display после каждого обновления аргументов.
module tb;
initial begin
reg [7:0] a, b;
a = 8'h2D; b = 8'h2D;
#10;
b <= a + 1;
$monitor ("[$monitor] time=%0t a=0x%0h b=0x%0h", $time, a, b);
#1 b <= 8'hA4;
#5 b <= a - 8'h33;
#10 b <= 8'h1;
end
endmodule
$monitor как фоновая задача, отслеживающая изменения аргументов. Новый $monitor можно запускать многократно.
Simulation Log
ncsim> run [$monitor] time=10 a=0x2d b=0x2e [$monitor] time=11 a=0x2d b=0xa4 [$monitor] time=16 a=0x2d b=0xfa [$monitor] time=26 a=0x2d b=0x1 ncsim: *W,RNQUIE: Simulation is complete.
Спецификаторы формата Verilog
Для печати переменных в display-функциях нужны соответствующие format specifiers.
| Аргумент | Описание |
|---|---|
| %h, %H | Шестнадцатеричный формат |
| %d, %D | Десятичный формат |
| %b, %B | Двоичный формат |
| %m, %M | Иерархическое имя |
| %s, %S | Строковый формат |
| %t, %T | Формат времени |
| %f, %F | Real в десятичном формате |
| %e, %E | Real в экспоненциальном формате |
module tb;
initial begin
reg [7:0] a;
reg [39:0] str = "Hello";
time cur_time;
real float_pt;
a = 8'h0E;
float_pt = 3.142;
$display ("a = %h", a);
$display ("a = %d", a);
$display ("a = %b", a);
$display ("str = %s", str);
#200 cur_time = $time;
$display ("time = %t", cur_time);
$display ("float_pt = %f", float_pt);
$display ("float_pt = %e", float_pt);
end
endmodule
Simulation Log
ncsim> run a = 0e a = 14 a = 00001110 str = Hello time = 200 float_pt = 3.142000 float_pt = 3.142000e+00 ncsim: *W,RNQUIE: Simulation is complete.
Escape-последовательности Verilog
Некоторые символы специальны (новая строка, таб, form feed). Для их печати нужно экранировать каждое вхождение.
| Аргумент | Описание |
|---|---|
| \n | Новая строка |
| \t | Табуляция |
| \\ | Символ \ |
| \" | Символ " |
| %% | Символ % |
module tb;
initial begin
$write ("Newline character \n");
$display ("Tab character \tstop");
$display ("Escaping \" %%");
/* Ошибки компиляции без экранирования:
$display ("Without escaping "); // ERROR: Unterminated string
$display ("Without escaping ""); // ERROR: Unterminated string
*/
end
endmodule
Simulation Log
ncsim> run Newline character Tab character stop Escaping " % ncsim: *W,RNQUIE: Simulation is complete.
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Условная компиляция в Verilog: `ifdef, `ifndef, `elsif
- Иерархические ссылки в Verilog: область видимости и избежание коллизий имен
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство задач отображения в Verilog: эффективная отладка и логирование