Menu
CoddyTech

Задержки присваивания

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

В предыдущих уроках мы рассмотрели общие задержки (#10 a = b;) и задержки логических элементов (and #5 (out, a, b);). Теперь мы рассмотрим задержки присваивания — задержки, которые возникают внутри процедурного блока (например, initial или always) как часть оператора присваивания.

Задержка присваивания выжидает заданное время, а затем выполняет присваивание. Задержка указывается после символа # и перед присваиванием.

Синтаксис:

variable = #delay expression;

В отличие от общей задержки #10 a = b; (сначала задержка, затем присваивание), задержка присваивания a = #10 b; берёт значение b в этот момент, ждёт 10 единиц времени, а затем присваивает его a.

Задержка присваивания и общая задержка

 Общая задержкаЗадержка присваивания
Синтаксис#10 a = b;a = #10 b;
Когда считывается значение?В момент присваивания (после задержки)Немедленно (до задержки)
Какое значение присваивается?Значение b в этот моментЗначение b в момент времени 0 (или в момент считывания)
Когда присваивается значение?После задержкиПосле задержки

Пример: разница

initial begin
  b = 1;
  #5 b = 0;
  
  // Общая задержка
  #10 a1 = b;     // Ждёт 10, затем считывает b (b=0) → a1=0
  
  // Задержка присваивания
  a2 = #10 b;     // Считывает b сразу (b=0), ждёт 10, затем присваивает → a2=0
end

Здесь оба варианта дают одинаковый результат. Разница проявляется, когда b изменяется во время задержки.

Пример ключевого различия

Чтобы показать изменение b во время задержки, нам нужны два отдельных начальных блока, выполняющихся параллельно:

initial begin
  b = 1;
  a1 = #10 b;     // Считывает b=1 в момент времени 0, присваивает a1=1 в момент времени 10
end

initial begin
  #5 b = 0;       // Изменяет b на 0 в момент времени 5 (во время задержки)
end
  • В момент времени 0: a1 считывает b = 1
  • В момент времени 5: b меняется на 0 (пока a1 всё ещё ожидает)
  • В момент времени 10: a1 присваивается значение 1 (значение, считанное в момент времени 0), а не 0

При общей задержке #10 a2 = b; в отдельном блоке значение b было бы считано в момент времени 10 (значение 0).

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

ПравилоОбъяснение
= ставится перед #a = #10 b;, а не a #10 = b;
Значение считывается немедленноПравая часть вычисляется сразу
Присваивание происходит после задержкиЛевая часть получает значение позже
Только для процедурных блоковИспользуется в initial или always
challenge icon

Задание

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

Добавь отсутствующую задержку присваивания, чтобы a получала значение b через 15 единиц времени, но считывала значение b сразу.

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

module assignment_challenge;
  reg a, b;
  
  // Отдельный блок для изменения b во время задержки
  initial begin
    b = 1;
    // TODO: Добавить задержку присваивания
    // a должна получить значение b через 15 единиц времени
    // Считать b сейчас, присвоить значение после задержки

  end
  
  initial begin
    #5 b = 0;      // Изменяет b во время задержки
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog