Menu
Coddy logo textTech

Non Blocking Assignment

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

На предыдущем уроке мы рассмотрели блокирующее присваивание (=), которое выполняется шаг за шагом. Теперь мы рассмотрим неблокирующее присваивание (<=), которое выполняется одновременно, параллельно.

Неблокирующее присваивание использует оператор <=. Оно называется «non-blocking», потому что не блокирует выполнение следующего оператора. Все неблокирующие присваивания в блоке выполняются одновременно.

Синтаксис:

variable <= expression;

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

Неблокирующее присваивание (<=) используется для последовательной логики: схем, которые используют clock и имеют память. Выходы изменяются только на edge clock (обычно на возрастающем фронте).

Примеры последовательной логики:

  • Триггеры
  • Регистры
  • Счётчики
  • Конечные автоматы
  • Регистры сдвига

Пример Verilog:

initial begin
  a <= 5;      // Запланировано, но ещё не выполнено
  b <= a + 2;  // Запланировано, использует СТАРОЕ значение a
  c <= b * 3;  // Запланировано, использует СТАРОЕ значение b
end

Все три присваивания выполняются одновременно с использованием значений old. В конце временного шага все обновления происходят вместе.

Non-blocking в блоках always (последовательная логика)

Non-blocking используется для последовательной логики: схем, которые используют clock и имеют память (триггеры, регистры, счётчики).

always @(posedge clk) begin
  q <= d;           // q получает d по фронту тактового сигнала
  count <= count + 1; // count увеличивается по фронту тактового сигнала
end

Оба присваивания происходят одновременно, используя values до clock edge.

Сводка

ПравилоОбъяснение
Используйте <= для последовательной логикиalways @(posedge clk)
Используйте = для комбинационной логикиalways @(*)
Non-blocking выполняется параллельноAll присваивания происходят одновременно
Values обновляются в end временного StepНе сразу
challenge icon

Задание

Завершите non-blocking присваивание

Add отсутствующие non-blocking присваивания, чтобы этот 2-битный сдвиговый регистр работал.

Как это работает:

  • При каждом фронте тактового сигнала q1 gets d
  • q2 gets старое значение q1

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

  1. Assign d в q1 (non-blocking)
  2. Assign q1 в q2 (non-blocking)

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

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: Добавить логику сдвига
      // Шаг 1: Присвоить d к q1 (неблокирующее)
      // Шаг 2: Присвоить q1 к q2 (неблокирующее)
    end
  end
endmodule
quiz iconПроверьте себя

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

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

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