Menu
Coddy logo textTech

Blocking Assignment

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

В Verilog есть два типа процедурных присваиваний: blocking (=) и non-blocking (<=). В этом уроке мы сосредоточимся на blocking assignment.

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

Синтаксис:

variable = expression;

Когда использовать Blocking assignment

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

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

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

Пример на Verilog:

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

Blocking в блоках Always (комбинационная логика)

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

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

Blocking и неблокирующее выполнение

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

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

challenge icon

Задание

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

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

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

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

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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog