Menu
Coddy logo textTech

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

Часть раздела Основы путешествия по 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

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

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

always @(a or b) begin
  out = a & b;   // Выполняется, когда a или b изменяются
end

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

Вариант 3: Edge Trigger (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
Выполняется по фронту `clock` или по фронту `reset`.

Частые ошибки

ОшибкаПочему это неверно
always @(a or b or c), но использует dОтсутствует doutput устаревает в симуляции (расхождение симуляции и синтеза)
always @(posedge clk or reset)Отсутствует posedge для reset
always @(clk)Следует использовать posedge clk для flip-flop
challenge icon

Задание

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

  1. Добавьте правильный список чувствительности, чтобы этот D-триггер работал корректно. Блок должен выполняться по нарастающему фронту (posedge) сигнала clk.

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

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

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

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

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