敏感列表
本课属于 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 |
挑战
要做什么:
- 添加正确的敏感列表,让这个触发器正常工作。该代码块应在
clk的上升沿执行。
亲手试试
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器