Menu
CoddyTech

敏感列表

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 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

在时钟沿或复位沿运行。

常见错误

错误错误原因
使用了 d,但敏感列表中只有 always @(a or b or c)缺少 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 在线编译器