Menu
Coddy logo textTech

Assignment Delays

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

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

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

Синтаксис:

variable = #delay expression;

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

Assignment Delay против General Delay

 General DelayAssignment Delay
Синтаксис#10 a = b;a = #10 b;
Когда считывается значение?В момент assignment (after delay)Немедленно (before 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

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

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

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
  • В момент time 0: a1 считывает b = 1
  • В момент time 5: b changes на 0 (пока a1 still ожидает)
  • В момент time 10: a1 получает значение 1 (значение, считанное в момент time 0), а не 0

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

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

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

Задание

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

Add пропущенную assignment delay, чтобы a gets значение b after 15 time units, но reads 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