Задержки в присваиваниях
Часть раздела Основы путешествия по 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 Delay | Assignment Delay | |
|---|---|---|
| Синтаксис | #10 a = b; | a = #10 b; |
| Когда считывается значение? | В time assignment (after delay) | Немедленно (до 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Оба варианта дают здесь одинаковый результат. Разница появляется, когда 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 |
Задание
Что нужно сделать:
Добавьте пропущенную задержку присваивания, чтобы 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU13Тайминг и задержки
Что такое задержкиЗадержки вентилейЗадержки в присваиванияхДиректива TimescaleГенерация тактового сигналаИтоги — управление таймингом5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial