verilog 始终@* 敏感度列表中包含哪些内容?
-
12-12-2019 - |
题
当您使用通配符时,我对什么被视为输入有点困惑 @* 在始终阻止敏感度列表中。例如,在下面的示例中,哪些信号被解释为导致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
解决方案
在块内读取的任何信号,如果其值发生变化,可能会导致块的结果发生变化,将包含在 @*
. 。所使用的读取信号的任何变化 必须 导致块被重新评估,因为它可能导致块的输出发生变化。我相信你知道,如果你没有使用过 @*
您将手动列出这些信号。
对于您提供的代码,它是任何信号:
- 在作业的右侧进行评估(
a
和b
) - 作为条件的一部分进行评估 (
en
和mux
)
...但它是出于任何原因都会被评估的任何信号。(我现在想不出任何其他原因,但也许其他人可以)
clk
和 reset
不在敏感列表中,因为它们未被使用。就那么简单。他们没有什么特别之处;它们和其他信号一样。
其他提示
在您的示例中,隐式敏感度列表中包含以下信号:
a
b
en
mux
clk
和 reset
不属于敏感列表。
Verilog 的 IEEE 标准(例如 1800-2009)对此进行了完整描述。IEEE 规范是 Verilog 详细信息的最佳来源。您的模拟器的文档也可能描述了如何 @*
作品。
最简单的答案取决于您是否正在编写RTL或测试禁止。如果您正在编写RTL,那么您应该尝试忘记敏感性列表的概念,因为它们并不真正存在。没有逻辑只触发列表中的项目时才才会更新。所有敏感性列表都可以在RTL中做到导致您的模拟和实际电路不同,它们没有任何好处。
所以,始终使用“始终@ *”或更好的“always_comb”并忘记敏感性列表的概念。如果评估代码中的项目,则会触发该过程。就那么简单。它是一个IF / else,一个分配给变量的情况,或者其他任何东西,它将被“评估”,从而导致要触发的过程。
但只要记住,在数字电路中,没有敏感性列表。