always @(*)
是 Verilog 中写组合逻辑(combinational logic) 的标准写法,下面讲解含义、作用、以及为什么这么写。
🌟 什么是 always @(*)
?
always @(*) begin// 组合逻辑
end
它的意思是:
“只要块中用到的任何输入信号发生变化,这个 always 块就会自动执行一次。”
也叫做:
-
自动敏感列表
-
组合逻辑块(combinational block)
这是 Verilog-2001 标准引入的一种简化写法,用来避免遗漏敏感信号。
💡 举个例子(组合逻辑 vs 时序逻辑)
// 组合逻辑:根据 sel 输出 mux 结果
always @(*) begincase (sel)2'b00: out = a;2'b01: out = b;2'b10: out = c;default: out = 0;endcase
end
这个 always @(*)
块的作用是:
-
每当
sel
、a
、b
、c
中任何一个变化,它就自动运行一次,重新计算out
-
它没有时钟,也没有寄存器,结果马上更新
这就是组合逻辑的定义!
🔁 如果不用 (*)
会怎么样?
你可以写成:
always @(sel or a or b or c) begin...
end
但这就变麻烦了!因为你手动列出所有“敏感信号”,一不小心漏了,就会出 bug 或推锁存器!
所以 Verilog-2001 后推荐直接写:
always @(*) // 自动把用到的所有变量都加进来!
✅ 总结记忆:
写法 | 意义 | 说明 |
---|---|---|
always @(*) | 自动组合逻辑块 | 推荐写法 |
always @(a or b ...) | 手动列出敏感变量 | 容易出错,不推荐 |
always @(posedge clk) | 时序逻辑(有寄存器) | 用于时钟驱动逻辑 |