当您在始终块敏感性列表中使用通配符 @ * 时,我对于被视为输入的内容感到有点困惑。例如,在下面的示例中,哪些信号被解释为导致重新评估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
答案 0 :(得分:9)
@*
将包含在块内读取的任何信号,如果它的值发生变化,则可能导致块的结果发生变化。使用的读取信号的任何更改必须导致重新评估块,因为它可能导致块的输出发生变化。我相信你知道,如果你没有使用@*
,你就会手动列出这些信号。
对于您提供的代码,它的任何信号都是:
a
和b
)en
和mux
)......但这是任何因任何原因而被评估的信号。 (我现在想不出任何其他原因,但也许其他人可以)
clk
和reset
不在敏感列表中,因为它们未被使用。就那么简单。他们没什么特别的;它们像其他任何信号一样。
答案 1 :(得分:3)
在您的示例中,隐含敏感度列表中包含以下信号:
a
b
en
mux
clk
和reset
不属于敏感度列表。
这完全在IEEE Std for Verilog(例如1800-2009)中描述。 IEEE规范是Verilog详细信息的最佳来源。模拟器的文档还可以描述@*
的工作原理。
答案 2 :(得分:0)
最简单的答案取决于您是编写RTL还是测试台。如果您正在编写RTL,则应尝试忽略“敏感度列表”的概念,因为它们实际上并不存在。没有逻辑仅在触发列表中的项目时才更新。 RTL中所有敏感度列表可以做的是导致您的仿真和实际电路不同,它们做不到任何事情。
因此,请始终使用“ always @ *”或更佳的“ always_comb”,而忽略敏感度列表的概念。如果对代码中的项目进行了评估,它将触发该过程。就那么简单。如果一个项目在if / else,case,情况下,分配给变量或其他任何内容,则将对其进行“评估”,从而导致流程被触发。
但是,请记住,在数字电路中没有灵敏度列表。