Creating Stimulus
Часть раздела Основы путешествия по Verilog на Coddy. Урок 74 из 90.
Stimulus означает значения input, которые вы применяете к своему проекту, чтобы проверить, правильно ли он работает. Изменяя значения input и наблюдая за выходными данными, вы можете убедиться, что ваш проект ведёт себя ожидаемым образом.
Представь это как тестирование машины: ты нажимаешь разные кнопки (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Каждый стимул применяется, затем мы ждём 10 единиц времени (#10) перед следующим стимулом. Это даёт 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 gate. Ваша задача — добавить отсутствующий stimulus и операторы $display, чтобы вывести результаты.
Что нужно сделать:
Добавьте stimulus для проверки всех четырёх комбинаций input (00, 01, 10, 11):
- В каждой строке задайте значения для
xиy - Add
#10для задержки - Add
$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Введение
Что такое VerilogАппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge14Testbench Basics
What Is A TestbenchCreating StimulusDisplay And MonitorDumpfile And DumpvarsUsing System TasksRecap - Full Testbench3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog