总是在块/ case语句中的电线 - Verilog

时间:2015-11-07 05:31:37

标签: case verilog system-verilog

以下是使用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

感谢任何帮助。

感谢。

3 个答案:

答案 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,那么此代码将提供编译问题。

可以在thisthis链接找到更多信息。

答案 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)< /强>