Задержки присваивания
Часть раздела Основы путешествия по 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 |
Задание
Что нужно сделать:
Добавь отсутствующую задержку присваивания, чтобы 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Введение
Что такое 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