| 是按位或运算。敏感度列表使用or(并且自 Verilog-2001 起也支持,)。因此:
always @ (btn1 | btn2 | numopin[0] | numopin[1] | numopin[2] | numopin[3])
应该是:
always @ (btn1 or btn2 or numopin[0] or numopin[1] or numopin[2] or numopin[3])
或(如果 IEEE Std 1364-2001 或更新版本)
always @ (btn1, btn2, numopin[0], numopin[1], numopin[2], numopin[3])
并且可以简化为:
-
always @(btn1 or btn2 or numopin)(IEEE 标准 1364-1995 和更新版本)
-
always @(btn1, btn2, numopin)(IEEE 标准 1364-2001 和更新版本)
-
always @*(IEEE 标准 1364-2001 和更新版本)推荐
@*(或@ (*))是一个自动敏感列表;在 IEEE 标准 1364-2001 中添加。组合块中引用且未分配的任何信号都被视为输入。 @* 是使用 always 块描述组合逻辑的重新开始等待(除非您严格遵循 IEEE Std 1364-1995)。
灵敏度列表中的posedge 和negedge 用于可综合触发器或不可综合行为建模。如果您有两个(或更多)边缘,则智能(高级)合成器将假定程序代码中使用的灵敏度列表中的任何信号都是异步的。一个简单的将第一个信号视为同步的,而将其他信号视为异步的。
设计指南: 仅将 posedge 和 negedge 用于同步触发器逻辑。
一种解决方案(改动很小)是:
always @ (btn1 or btn2)
begin
if((btn1 == 1'b1)&&(btn2 == 1'b0))
aux = 2'b11;
else if((btn1 == 1'b0)&&(btn2 == 1'b1))
aux = 2'b10;
else if((btn2 == 1'b0)&&(btn1 == 1'b0))
aux = 2'b01;
else // this 'else' handles '(btn2 == 1'b1)&&(btn1 == 1'b1)' for you
aux = 2'b00;
end
但您可以将代码(相同的综合输出)简化为:
always @* begin
case({btn2,btn1})
2'b00 : aux = 2'b01;
2'b01 : aux = 2'b11;
2'b10 : aux = 2'b10;
default : aux = 2'b00;
endcase
end
仅供参考:比较 btn1 == 1 和 btn2 == 0 也是一种不好的做法。这是因为1 和0 被认为是32 位值,你应该得到综合警告。最好是明确的:btn1 == 1'b1 和 btn2 == 1'b0