Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Мастерство задач отображения в 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, %FReal в десятичном формате
%e, %EReal в экспоненциальном формате
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

  1. Освоение Verilog: полное руководство по проектированию цифровых схем
  2. Освоение конкатенации в Verilog: практическое руководство
  3. Понимание назначений в Verilog: типы, синтаксис и лучшие практики
  4. Блокирующие и неблокирующие назначения в Verilog: ключевые различия
  5. Мастерство функций в Verilog для эффективного RTL дизайна
  6. Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
  7. Условная компиляция в Verilog: `ifdef, `ifndef, `elsif
  8. Иерархические ссылки в Verilog: область видимости и избежание коллизий имен
  9. Генератор тактового сигнала в Verilog: проектирование и реализация
  10. Мастерство задач отображения в Verilog: эффективная отладка и логирование