Создание стимулов
Часть раздела Основы путешествия по Verilog на Coddy — урок 74 из 90.
Stimulus обозначает входные значения, которые вы подаёте на ваш проект, чтобы проверить его корректную работу. Изменяя входные данные и наблюдая за выходными сигналами, вы можете убедиться, что ваш проект работает так, как ожидается.
Представьте это как тестирование машины: вы нажимаете разные кнопки (stimulus) и смотрите, что происходит (выходные сигналы). Создание хорошего stimulus — это важная часть написания testbench.
Например, посмотрите на стимул (stimulus) в следующем `testbench`:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// СТИМУЛ НАЧИНАЕТСЯ ЗДЕСЬ
// Тестовый случай 1: Оба входа равны 0
a = 0; b = 0; #10;
// Тестовый случай 2: a=0, b=1
a = 0; b = 1; #10;
// Тестовый случай 3: a=1, b=0
a = 1; b = 0; #10;
// Тестовый случай 4: Оба входа равны 1
a = 1; b = 1; #10;
// СТИМУЛ ЗАКАНЧИВАЕТСЯ ЗДЕСЬ
$finish;
end
endmoduleПодаётся каждый stimulus, затем мы ждём 10 единиц времени (#10) перед следующим stimulus. Это даёт DUT время для формирования выходного сигнала.
Методы создания стимулов (Stimulus)
| Метод | Подходит для | Пример |
|---|---|---|
| Последовательные присваивания | Простых тестов | a = 0; b = 0; #10; |
| Цикл For | Тестирования всех комбинаций | for (i = 0; i < 4; i++) |
| Цикл Repeat | Повторяющихся шаблонов | repeat (10) #5 clk = ~clk; |
| Цикл Forever | Непрерывных сигналов | forever #5 clk = ~clk; |
Способ 1: Последовательные присваивания
Самый простой способ создания воздействий (stimulus). Вы присваиваете значения одно за другим с задержками.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endМетод 2: Цикл for
Полезен, когда нужно протестировать все возможные комбинации входных сигналов.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endЭто проверяет: 00, 01, 10, 11.
Способ 3: Цикл Repeat
Полезен для многократного повторения одного и того же стимула.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endСпособ 4: Цикл Forever
Полезен для непрерывных сигналов, таких как тактовые импульсы.
initial begin
clk = 0;
forever #5 clk = ~clk;
endВажные правила
| Правило | Объяснение |
|---|---|
| Используйте задержки между присваиваниями stimulus | #10 дает время для ответа DUT |
Используйте reg для сигналов stimulus | Поскольку они изменяются со временем |
Добавьте $finish в конце | Чтобы остановить симуляцию |
Задание
Вам предоставлен модуль логического элемента OR. Ваша задача — добавить недостающие сигналы воздействия (stimulus) и операторы $display для вывода результатов.
Что нужно сделать:
Добавьте сигналы воздействия (stimulus) для проверки всех четырех комбинаций входных данных (00, 01, 10, 11):
- В каждой строке установите значения для
xиy - Добавьте
#10для задержки - Добавьте
$displayдля вывода результата
Вызов <strong>$display</strong> должен выглядеть так:
$display("%d %d | %d", x, y, z);Попробуйте сами
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: Добавить стимул и отображение для 0 0
// TODO: Добавить стимул и отображение для 0 1
// TODO: Добавить стимул и отображение для 1 0
// TODO: Добавить стимул и отображение для 1 1
$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