6

当您在始终阻止敏感度列表中使用通配符@*时,我对什么被视为输入感到有些困惑。例如,在以下示例中,哪些信号被解释为导致重新评估 always 块的输入?据我了解,不包括clkreset,因为它们不会出现在 always 块中任何程序语句的右侧。 包括ab是因为它们都出现在 always 块中程序语句的右侧。但是我真正感到困惑的是enmux。因为它们被用作ifcase中的测试条件语句是否被视为输入?每次enmux更改值时,总是重新评估块吗?我几乎是个菜鸟,在我拥有的 3 本书中,我还没有找到令人满意的解释。我一直觉得这里的解释很有帮助。谢谢

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
4

3 回答 3

11

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

在您提供的代码的情况下,它是任何信号:

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

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

clk并且reset不在敏感列表中,因为它们没有被使用。就那么简单。它们没有什么特别之处。它们和其他信号一样。

于 2012-03-12T00:50:40.767 回答
4

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

a
b
en
mux

clk并且reset不是敏感列表的一部分。

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

于 2012-03-11T23:40:53.460 回答
-1

最简单的答案取决于您是在编写 RTL 还是测试平台。如果您正在编写 RTL,那么您应该尝试忘记敏感度列表的概念,因为它们实际上并不存在。没有仅在触发列表中的项目时更新的逻辑。RTL 中的所有灵敏度列表都会导致您的模拟和实际电路有所不同,它们没有任何好处。

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

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

于 2018-08-29T18:00:43.937 回答