什么包含在verilog总是@ *敏感列表?

时间:2012-03-11 21:27:27

标签: verilog digital-logic

当您在始终块敏感性列表中使用通配符 @ * 时,我对于被视为输入的内容感到有点困惑。例如,在下面的示例中,哪些信号被解释为导致重新评估always块的输入?根据我的理解, clk 重置不包括在内,因为它们不会出现在always块中任何过程语句的右侧。包含 a b ,因为它们都出现在always块的过程语句的右侧。但我真正感到困惑的是 en mux 。因为它们被用作中的测试条件,如果 case 语句被认为是输入?每次 en mux 更改值时,是否会重新评估始终屏蔽?我几乎是一个菜鸟,在我的3本Verilog书中,我找不到令人满意的解释。我总是发现这里的解释真的很有帮助。感谢

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

3 个答案:

答案 0 :(得分:9)

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

对于您提供的代码,它的任何信号都是:

  • 在作业的右侧进行评估(ab
  • 评估为条件(enmux
  • 的一部分

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

clkreset不在敏感列表中,因为它们未被使用。就那么简单。他们没什么特别的;它们像其他任何信号一样。

答案 1 :(得分:3)

在您的示例中,隐含敏感度列表中包含以下信号:

a
b
en
mux

clkreset不属于敏感度列表。

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

答案 2 :(得分:0)

最简单的答案取决于您是编写RTL还是测试台。如果您正在编写RTL,则应尝试忽略“敏感度列表”的概念,因为它们实际上并不存在。没有逻辑仅在触发列表中的项目时才更新。 RTL中所有敏感度列表可以做的是导致您的仿真和实际电路不同,它们做不到任何事情。

因此,请始终使用“ always @ *”或更佳的“ always_comb”,而忽略敏感度列表的概念。如果对代码中的项目进行了评估,它将触发该过程。就那么简单。如果一个项目在if / else,case,情况下,分配给变量或其他任何内容,则将对其进行“评估”,从而导致流程被触发。

但是,请记住,在数字电路中没有灵敏度列表。