Создание стимулов
Часть раздела Основы путешествия по Verilog на Coddy. Урок 74 из 90.
Стимул — это входные значения, которые вы применяете к своей разработке, чтобы проверить, правильно ли она работает. Изменяя входные данные и наблюдая за выходными, вы можете убедиться, что ваша разработка ведёт себя ожидаемым образом.
Представь себе тестирование машины: ты нажимаешь разные кнопки (стимулы) и смотришь, что происходит (выходные данные). Создание хороших стимулов — важная часть написания тестового стенда.
Например, посмотри на стимуляцию в следующем тестовом стенде:
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) перед следующим стимулом. Это даёт DUT время сформировать выходной сигнал.
Методы создания STIMULUS
| Метод | Лучше всего подходит для | Пример |
|---|---|---|
| Последовательные присваивания | Простых тестов | a = 0; b = 0; #10; |
| Цикл for | Проверки всех комбинаций | for (i = 0; i < 4; i++) |
| Цикл repeat | Повторения шаблонов | repeat (10) #5 clk = ~clk; |
| Бесконечный цикл | Непрерывных сигналов | 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: Бесконечный цикл
Полезен для непрерывных сигналов, таких как тактовые сигналы.
initial begin
clk = 0;
forever #5 clk = ~clk;
endВажные правила
| Правило | Объяснение |
|---|---|
| Используйте задержки между назначениями сигналов стимуляции | #10 даёт DUT время на ответ |
Используйте reg для сигналов стимуляции | Потому что они меняются со временем |
Добавьте $finish в конце | Чтобы остановить симуляцию |
Задание
Вам дан модуль элемента ИЛИ. Ваша задача — добавить недостающие стимулы и операторы $display, чтобы вывести результаты.
Что нужно сделать:
Добавьте стимулы для проверки всех четырёх комбинаций входных значений (00, 01, 10, 11):
- В каждой строке задайте значения для
xиy - Добавьте
#10для задержки - Добавьте
$display, чтобы вывести результат
Оператор $display должен выглядеть так:
$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Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов14Основы тестбенча
Что такое тестбенчСоздание стимуловОтображение и мониторингDumpfile и DumpvarsИспользование системных задачПовторение — полный тестбенч3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog