Использование системных задач
Часть раздела Основы путешествия по 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Задание
Добавьте недостающие системные задачи в этот тестбенч.
Что нужно сделать:
- Добавьте
$displayдля вывода текущего времени в начале - Добавьте
$displayдля вывода текущего времени в конце - Добавьте
$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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам14Основы Testbench
Что такое TestbenchСоздание стимуловDisplay и MonitorDumpfile и DumpvarsИспользование системных задачИтоги: полный Testbench3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial