当您使用通配符时,我对什么被视为输入有点困惑 @* 在始终阻止敏感度列表中。例如,在下面的示例中,哪些信号被解释为导致always 块被重新评估的输入?据我了解 时钟重置 不包括在内,因为它们不会出现在always块中任何过程语句的右侧。 A 被包含在内是因为它们都出现在always块中过程语句的右侧。但我真正困惑的是 zh复用器. 。因为它们被用作测试条件 如果案件 语句是否被视为输入?是否每次都会重新评估always块 zh复用器 改变值?我几乎是一个菜鸟,在我拥有的 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
有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

a
b
en
mux

clkreset 不属于敏感列表。

Verilog 的 IEEE 标准(例如 1800-2009)对此进行了完整描述。IEEE 规范是 Verilog 详细信息的最佳来源。您的模拟器的文档也可能描述了如何 @* 作品。

最简单的答案取决于您是否正在编写RTL或测试禁止。如果您正在编写RTL,那么您应该尝试忘记敏感性列表的概念,因为它们并不真正存在。没有逻辑只触发列表中的项目时才才会更新。所有敏感性列表都可以在RTL中做到导致您的模拟和实际电路不同,它们没有任何好处。

所以,始终使用“始终@ *”或更好的“always_comb”并忘记敏感性列表的概念。如果评估代码中的项目,则会触发该过程。就那么简单。它是一个IF / else,一个分配给变量的情况,或者其他任何东西,它将被“评估”,从而导致要触发的过程。

但只要记住,在数字电路中,没有敏感性列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top