Menu
CoddyTech

Список чувствительности

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

Список чувствительности сообщает блоку always, когда выполняться. Он записывается в скобках после символа @.

Список чувствительности — это набор сигналов или событий, которые запускают блок always. Когда любой сигнал из списка меняется, блок выполняется.

Синтаксис:

always @(sensitivity_list) begin
  // Код выполняется при изменении сигналов в списке
end

Типы списка чувствительности

ТипСинтаксисКогда выполняется блок
Все сигналы (комбинационная логика)always @(*)При изменении любого сигнала внутри
Определённые сигналыalways @(a or b)При изменении a или b
По фронту (последовательная логика)always @(posedge clk)По переднему фронту тактового сигнала
Несколько фронтовalways @(posedge clk or posedge reset)По фронту тактового сигнала или сигнала сброса

Вариант 1: Все сигналы (*)

Самый безопасный и распространённый вариант для комбинационной логики.

always @(*) begin
  out = a & b;   // Выполняется при изменении a или b
end

* автоматически включает все сигналы, считываемые в блоке.

Вариант 2: конкретные сигналы

always @(a or b) begin
  out = a & b;   // Выполняется при изменении a или b
end

Если ты забудешь сигнал, вывод не будет обновляться в симуляции при изменении этого сигнала, поэтому симуляция перестанет соответствовать синтезированному аппаратному обеспечению.

Вариант 3: Триггер по фронту (posedge)

always @(posedge clk) begin
  q <= d;        // Выполняется по переднему фронту тактового сигнала
end

Используй posedge для переднего фронта, negedge — для заднего фронта.

Вариант 4: Несколько фронтов

always @(posedge clk or posedge reset) begin
  if (reset)
    q <= 0;
  else
    q <= d;
end

Выполняется по фронту тактового сигнала или по фронту сигнала сброса.

Распространённые ошибки

ОшибкаПочему это неправильно
always @(a or b or c), но используется dОтсутствует d → выходные данные устаревают при моделировании (несоответствие моделирования и синтеза)
always @(posedge clk or reset)Для reset отсутствует posedge
always @(clk)Для триггеров следует использовать posedge clk
challenge icon

Задание

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

  1. Добавь правильный список чувствительности, чтобы триггер работал. Блок должен выполняться по фронту сигнала clk.

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

module flipflop (
  input clk,
  input d,
  output reg q
);
  
  always @(______) begin
    q <= d;
  end

endmodule
quiz iconПроверьте себя

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

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

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