以下是使用case语句并始终使用@(*)块的示例代码。我不知道如何触发always块以及为什么即使x被声明为wire也能正常工作。
wire [2:0] x = 0;
always @(*)
begin
case (1'b1)
x[0]: $display("Bit 0 : %0d",x[0]);
x[1]: $display("Bit 1 : %0d",x[1]);
x[2]: $display("Bit 2 : %0d",x[2]);
default: $display("In default case");
endcase
end
感谢任何帮助。
感谢。
答案 0 :(得分:1)
如我们所知,reg
可以由wire
驱动,我们绝对可以在任何程序块中使用wire
作为赋值的右侧。
在这里,您的代码会检查x
的哪个位是1'b1
(当然将优先级提供给第0位)。让x
更改为3'b010
。然后,将显示Bit 1
,依此类推。现在,如果显示x=3'b011
,则显示Bit 0
,因为首先检查第0位。
正如您所看到的,x
没有赋值,程序块只读取其值。此外,系统任务$display
还会读取x
的值。
此块的信号值没有变化。因此,此代码工作正常。如果偶然地我们有x[0] = ~x[0]
而不是$display
,那么此代码将提供编译问题。
答案 1 :(得分:1)
这里,这个always块不会为x赋值,但只检查x的值。所以这是合法使用电线。
答案 2 :(得分:1)
因此,关于如何触发始终@(*)的问题部分解释如下:
"出现在赋值右侧,子程序调用中,案例和条件表达式中的网络和变量,作为赋值左侧的索引变量,或作为变量如果项目表达式都包含在always @(*)。"
中参考: IEEE标准1800-2012 Sec 9.4.2.2
作为@ sharvil111的答案的延伸,如果您的代码是这样的
always @(*)
begin
case (sel)
x[0]: $display("Bit 0 : %0d",x[0]);
x[1]: $display("Bit 1 : %0d",x[1]);
x[2]: $display("Bit 2 : %0d",x[2]);
default: $display("In default case");
endcase
end
只要 sel 信号或 x 发生变化,就会触发程序块,即它等于总是@(sel或x)< /强>