Menu
Coddy logo textTech

Что такое задержки

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

В Verilog задержки управляют тем, когда выполняется оператор или когда изменяется сигнал. Они используются для моделирования временно́го поведения реального оборудования.

Зачем нужны задержки

В реальном оборудовании требуется время для прохождения сигналов через провода и вентили. Задержки позволяют моделировать такое временное поведение.

  • В симуляции без задержек всё происходит в момент времени 0
  • Задержки позволяют распределять события во времени
  • Они помогают тестировать чувствительные к таймингам схемы, такие как тактовые сигналы и конечные автоматы

Типы задержек

Тип задержкиНазначение
Задержки вентилейЗадержка прохождения через логические вентили
Задержки присваиванияЗадержка при присваивании значений
Директива timescaleУстанавливает единицы времени для моделирования

Базовый синтаксис

Задержка записывается с помощью символа #, за которым следует число:

#10 clk = ~clk;   // Ждать 10 единиц времени, затем переключить clock
#5 a = b;         // Ждать 5 единиц времени, затем присвоить a = b

Число после # — это количество time units для ожидания.

Простой пример

initial begin
  a = 0;
  #10 a = 1;   // После 10 единиц времени a становится 1
  #5 a = 0;    // После ещё 5 единиц времени a становится 0
end

Тайминг:

  • Time 0: a = 0
  • Time 10: a = 1
  • Time 15: a = 0

Задержки в блоках Always

always #5 clk = ~clk;   // Переключать тактовый сигнал каждые 5 единиц времени

Это создает непрерывный тактовый сигнал (предполагая, что clk был сначала инициализирован в 0 в блоке initial — иначе ~x остается x).

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

ПравилоОбъяснение
Символ #Обозначает задержку
Число после #Сколько единиц времени ждать
Задержки суммируются#10 затем #20 ожидает в сумме 30
Не синтезируетсяЗадержки предназначены только для моделирования
challenge icon

Задание

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

Добавьте недостающие задержки, чтобы этот код выводил сообщения в моменты времени 0, 10, 25 и 40.

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

module delay_challenge;
  
  initial begin
    $display("Time %0t: Start", $time);
    // TODO: Добавить задержку, чтобы достичь времени 10
    $display("Time %0t: After first delay", $time);
    // TODO: Добавить задержку, чтобы достичь времени 25
    $display("Time %0t: After second delay", $time);
    // TODO: Добавить задержку, чтобы достичь времени 40
    $display("Time %0t: End", $time);
    $finish;
  end
  
endmodule

quiz iconПроверьте себя

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

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