2012-03-11 52 views
3

当您在always block sensitivity列表中使用通配符@ *时,我对输入被认为是什么感到困惑。例如,在下面的例子中,哪些信号被解释为导致always块被重新评估的输入?据我所知,clk重置不包括在内,因为它们不会出现在总是块的任何过程语句的右侧。 ab都包含在内,因为它们都出现在always块的过程语句的右侧。但我真的很困惑的是enmux。因为和情况下语句是否被视为输入,因此它们被用作中的测试条件?总是阻止每次重新评估en多路复用器更改值?我几乎是一个noob,在3本Verilog书中,我还没有找到令人满意的解释。我总是发现这里的解释非常有用。感谢verilog always @ *灵敏度列表中包含什么?

module example 
( 
    input wire clk, reset, en, a, b, 
    input wire [1:0] mux, 
    output reg x,y, z 
); 

always @*  
begin 
x = a & b;  
    if (en) 
    y= a | b; 
    case(mux) 
    2'b00: z = 0; 
    2'b01: z = 1; 
    2'b10: z = 1; 
    2'b11: z = 0; 
    endcase 
end 
endmodule 
+1

您发布的模块有语法错误。我假设'x = a&b'应该在'begin'行之后。 – toolic 2012-03-11 23:47:58

+0

@toolic谢谢。我刚刚编辑它。现在应该更加正确。 – 2012-03-12 05:24:48

+0

你应该养成编写你发布的代码的习惯。它仍然有语法错误。 – toolic 2012-03-12 12:29:04

回答

8

任何在块内读取的信号都可能包含在@*之内,因此可能会导致块结果发生更改。读取信号使用的任何更改必须都会导致块被重新评估,因为它可能会导致块的输出发生改变。我相信你知道,如果你没有使用@*,你会手动列出这些信号。

在您提供它的代码的情况下,这么是一种信号:

  • 上评价分配(ab)的右侧
  • 评估为条件的部分( enmux

...但它是任何信号,将评估任何原因。 (我现在想不出任何其他原因,但也许别人可以)

clkreset不在灵敏度列表上,因为它们没有被使用。就那么简单。他们没有什么特别的;他们是其他任何信号。

+0

不添加嵌套事件表达式中的标识符。 – 2012-03-12 02:15:05

+0

谢谢,不知道。 – 2012-03-12 15:19:13

3

在您的例子,以下的信号被包括在隐式灵敏度列表:

a 
b 
en 
mux 

clkreset不是灵敏度列表的一部分。

这完全在IEEE Std for Verilog中描述(例如1800-2009)。 IEEE规范是Verilog详细信息的最佳来源。您的模拟器的文档也可能描述@*如何工作。