2015-11-07 32 views
1

以下是使用case语句和总是@(*)块的示例代码。我不明白always块是如何被触发的,以及为什么它在x被声明为wire的情况下工作。总是在块/ case语句中连接线 - Verilog

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 

任何帮助表示赞赏。

谢谢。

回答

1

正如我们所知,reg可以由wire驱动,我们可以肯定地使用wire作为任何程序块中作业的右侧。

在这里,你的代码检查其中的x1'b1(当然给予优先到第零位)。可以说x更改为3'b010。然后,将显示Bit 1等。现在,如果x=3'b011然后Bit 0显示,因为第零位首先检查。

正如你所看到的,没有赋值x,程序块只读取它的值。而且,系统任务$display也读取x的值。

该块的信号值没有变化。因此,这段代码工作正常。如果偶然,我们有类似x[0] = ~x[0]而不是$display,那么这段代码将提供编译问题。

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

+0

谢谢。我们可以使用$ fwrite或直接从这个始终阻止的线路断言? – rahulcodesinverilog

+0

是的。立即断言可以写在这里。但这取决于你如何使用它们。如果以任何方式,“x”的值改变,那么它将导致错误。我不确定$ fwrite,但我想,它也应该可以工作。 – sharvil111

1

在这里,这个always块不会给x赋值,但它只是检查x的值。所以这是合法使用电线。

+0

谢谢。我们可以使用$ fwrite或直接从这个始终阻止的线路断言? – rahulcodesinverilog

1

因此,解释你如何总是问题的一部分@(*)被触发如下:出现在分配的右侧

“篮网和变量,例程和条件表达式的子例程调用作为赋值左侧的索引变量,或作为项目表达式的变量应始终包含在@(*)中。“

编号:IEEE标准一八零零年至2012年秒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发生变化时被触发,即它将等于always @(s el或x)

+0

因此,在我目前的情况下,我认为它必须等于总是@(x),我正确吗?感谢您的答复。我们可以使用$ fwrite或直接从这个始终阻止的线路断言?例如'assert(x [0] == 1'b0)'或'$ fwrite(文件,“x是%0d”,x)'? – rahulcodesinverilog