Menu
Coddy logo textTech

Создание стимулов

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

Стимул (Stimulus) — это входные значения, которые вы подаете на свою схему, чтобы проверить правильность её работы. Изменяя входные сигналы и наблюдая за выходными, вы можете убедиться, что ваша разработка ведет себя так, как ожидалось.

Представьте, что это похоже на тестирование машины: вы нажимаете разные кнопки (стимулы) и наблюдаете за тем, что происходит (выходные сигналы). Создание качественных стимулов — это важная часть написания тестбенча.

Например, посмотрите на входные сигналы (stimulus) в следующем тестбенче:

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 время для формирования выходного сигнала.

Методы создания стимулов

МетодЛучше всего подходит дляПример
Последовательные присваиванияПростых тестовa = 0; b = 0; #10;
Цикл forТестирования всех комбинацийfor (i = 0; i < 4; i++)
Цикл repeatПовторяющихся шаблоновrepeat (10) #5 clk = ~clk;
Цикл foreverНепрерывных сигналовforever #5 clk = ~clk;

Метод 1: Последовательные присваивания

Самый простой способ создания стимулов. Вы присваиваете значения одно за другим с задержками.

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

Важные правила

ПравилоОбъяснение
Используйте задержки между назначениями стимулов#10 дает время DUT для ответа
Используйте reg для сигналов стимуловПотому что они меняются со временем
Добавьте $finish в концеЧтобы остановить симуляцию
challenge icon

Задание

Вам дан модуль логического элемента ИЛИ (OR gate). Ваша задача — добавить недостающие входные воздействия (stimulus) и операторы $display для вывода результатов.

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

Добавьте входные воздействия для проверки всех четырех комбинаций входных сигналов (00, 01, 10, 11):

  1. В каждой строке установите значения для x и y
  2. Добавьте #10 для задержки
  3. Добавьте $display для вывода результата

Оператор <strong>$display</strong> должен выглядеть следующим образом:

$display("%d %d | %d", x, y, z);

Шпаргалка

Стимул (Stimulus) — это входные значения, подаваемые на DUT (тестируемое устройство) в тестбенче для проверки корректности его работы.

Методы создания стимулов

Последовательные присваивания — самый простой подход:

initial begin
  a = 0; b = 0; #10;
  a = 0; b = 1; #10;
  $finish;
end

Цикл For — проверка всех комбинаций входных данных:

integer i;
initial begin
  for (i = 0; i < 4; i = i + 1) begin
    {a, b} = i; #10;
  end
  $finish;
end

Цикл Repeat — повторение стимула N раз:

repeat (10) begin
  #10 a = ~a;
end

Цикл Forever — непрерывные сигналы, такие как тактовые импульсы (clocks):

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Основные правила

  • Используйте reg для сигналов стимулов (они изменяются во времени)
  • Добавляйте задержки (например, #10) между присваиваниями, чтобы дать DUT возможность среагировать
  • Завершайте симуляцию с помощью $finish

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

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
quiz iconПроверьте себя

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

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