Menu
Coddy logo textTech

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

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

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

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

Синтаксис:

variable = #delay expression;

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

Assignment Delay vs General Delay

 General DelayAssignment Delay
Синтаксис#10 a = b;a = #10 b;
Когда считывается значение?В time assignment (after delay)Немедленно (до delay)
Какое значение присваивается?Значение b в этот моментЗначение b в time 0 (или время считывания)
Когда присваивается значение?after delayafter delay

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

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 изменяется во время паузы.

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

To show b changing during the delay, we need two separate initial blocks that run in parallel:

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

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

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