Задержки присваивания
Часть раздела Основы путешествия по 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 Delay | Assignment Delay | |
|---|---|---|
| Синтаксис | #10 a = b; | a = #10 b; |
| Когда считывается значение? | В момент assignment (after delay) | Немедленно (before delay) |
| Какое значение присваивается? | Значение b в этот момент | Значение b в time 0 (или в момент считывания) |
| Когда присваивается значение? | After delay | After 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:
bchanges на0(покаa1still ожидает) - В момент 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 |
Задание
Что нужно сделать:
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU13Синхронизация и задержки
Что такое задержкиЗадержки вентилейЗадержки присваиванияДиректива timescaleГенерация тактового сигналаПовторение — управление временем5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog