Menu
Coddy logo textTech

Использование системных задач

Часть раздела Основы путешествия по Verilog на Coddy — урок 77 из 90.

Системные задачи — это встроенные команды в Verilog, которые начинаются со знака доллара ($). Они выполняют полезные функции, такие как вывод сообщений, завершение симуляции и создание файлов временных диаграмм.

Мы уже рассмотрели $display, $monitor, $dumpfile и $dumpvars в предыдущих уроках. В этом уроке мы рассмотрим дополнительные системные задачи, которые полезны в тестбенчах.

Дополнительные системные задачи

Системная задачаНазначение
$timeВозвращает текущее время симуляции
$finishЗавершить симуляцию
$stopПриостановить симуляцию
$randomСгенерировать случайное число

$time

Возвращает текущее время симуляции. Полезно для отслеживания того, когда происходят события.

$display("Current time is %0t", $time);

$finish

Завершает симуляцию. Всегда используйте в конце вашего тестбенча.

$finish;

$stop

Приостанавливает симуляцию. Может быть возобновлена с помощью команды симулятора. Полезно для отладки.

$stop;

$random

Генерирует случайное число. Полезно для создания случайных тестовых воздействий.

reg [7:0] rand_value;
rand_value = $random;

Пример использования нескольких системных задач

module system_tasks_demo;
  reg [7:0] data;
  integer i;
  
  initial begin
    $display("Simulation started at time %0t", $time);
    
    for (i = 0; i < 5; i = i + 1) begin
      data = $random;
      $display("Random value %d: %b", i, data);
    end
    
    $stop;
    #10 $display("Resumed at time %0t", $time);
    
    $display("Simulation finished at time %0t", $time);
    $finish;
  end
endmodule
challenge icon

Задание

Добавьте недостающие системные задачи в этот тестбенч.

Что нужно сделать:

  1. Добавьте $display для вывода текущего времени в начале
  2. Добавьте $display для вывода текущего времени в конце
  3. Добавьте $finish для завершения симуляции

Шпаргалка

Системные задачи в Verilog начинаются с $ и выполняют служебные функции симуляции:

Системная задачаНазначение
$timeВозвращает текущее время симуляции
$finishЗавершает симуляцию
$stopПриостанавливает симуляцию
$randomГенерирует случайное число
$display("Time: %0t", $time); // вывести текущее время
$finish;                       // завершить симуляцию
$stop;                         // приостановить симуляцию

reg [7:0] rand_value;
rand_value = $random;          // присвоить случайное число

Попробуйте сами

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  reg a, b;
  wire c;
  
  and_gate dut (
    .a(a),
    .b(b),
    .c(c)
  );

  initial begin
    // TODO: Добавить $display с текущим временем в начале
    // Формат: "Start time: %0t"
    
    
    $monitor("Time %0t: a=%b, b=%b, c=%b", $time, a, b, c);
    
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    
    // TODO: Добавить $display с текущим временем в конце
    // Формат: "End time: %0t"
    
    
    // TODO: Добавить $finish
    
  end
endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы