Menu
Coddy logo textTech

Блокирующее присваивание

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

В Verilog существует два типа процедурных присваиваний: блокирующее (=) и неблокирующее (<=). В этом уроке мы сосредоточимся на блокирующем присваивании.

Блокирующее присваивание использует оператор =. Оно называется «блокирующим», потому что оно блокирует выполнение следующей инструкции до тех пор, пока текущее присваивание не будет завершено. Код выполняется шаг за шагом, по порядку.

Синтаксис:

variable = expression;

Когда использовать блокирующее присваивание

Блокирующее присваивание (=) используется для комбинационной логики — схем, в которых выходные сигналы изменяются немедленно при изменении входных, без тактового сигнала и без памяти.

Примеры комбинационной логики:

  • Логические элементы AND / OR / XOR
  • Сумматоры и вычитатели
  • Мультиплексоры
  • Дешифраторы

Пример на Verilog:

always @(*) begin
  sum = a + b;      // Блокирующее присваивание
  carry = a & b;    // Блокирующее присваивание
end

Блокирующие присваивания в блоках Always (Комбинационная логика)

always @(*) begin
  temp = a & b;    // Шаг 1
  out = temp | c;  // Шаг 2 (использует temp из шага 1)
end

Порядок имеет значение. Это подходит для комбинационной логики.

Блокирующее vs Неблокирующее

 Блокирующее (=)Неблокирующее (<=)
ВыполнениеПоследовательноОдновременно
Ожидание следующей строки?ДаНет
ПрименениеКомбинационная логикаПоследовательностная логика (триггеры)

Важно: не используйте блокирующие присваивания для триггеров

challenge icon

Задание

Добавьте недостающие блокирующие присваивания, чтобы поменять местами значения x и y с помощью временной переменной.

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

  1. Присвойте значение x переменной temp (сохраните x в temp)
  2. Присвойте значение y переменной x (переместите y в x)
  3. Присвойте значение temp переменной y (переместите сохраненное значение x в y)

Шпаргалка

Блокирующее присваивание (=) выполняется последовательно — каждая инструкция завершается до начала следующей. Используется для комбинационной логики внутри блоков always @(*).

always @(*) begin
  temp = a & b;    // Шаг 1
  out = temp | c;  // Шаг 2 (использует обновленное значение temp)
end
Блокирующее (=) Неблокирующее (<=)
Выполнение Друг за другом Одновременно
Применение Комбинационная логика Последовательностная логика (триггеры)

Попробуйте сами

module swap;
  reg x, y;
  reg temp;
  
  initial begin
    x = 1;
    y = 0;
    
    $display("Before swap: x=%d, y=%d", x, y);
    
    // TODO: Шаг 1 - Присвоить x переменной temp
    
    // TODO: Шаг 2 - Присвоить y переменной x
    
    // TODO: Шаг 3 - Присвоить temp переменной y
    
    $display("After swap: x=%d, y=%d", x, y);
    $finish;
  end
endmodule
quiz iconПроверьте себя

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

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