正如 Cthulhu 所说 =
的阻塞,这意味着在继续下一行代码之前将对语句进行评估。
always @* begin
a = b & c;
d = e & f;
g = a & d ;
end
上面的例子是一样的:
always @* begin
g = b & c & e & f;
end
但是,如果我们切换到使用<=
Then 它们在模拟中不再相同,g 将是 OLD a AND OLD b。由于这是一个组合块,即不像触发器那样定期触发或评估,因此您会从模拟中得到奇怪的结果。
正确使用<=
非阻塞赋值是在暗示触发器。
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
a <= 1'b0;
d <= 1'b0;
g <= 1'b0;
end
else begin
a <= b & c;
d <= e & f;
g <= a & d ;
end
end
在上面的触发器示例中,g 从最后一个 clk 周期而不是当前评估中获取 a 和 d 的值。
在您使用的示例中always @(sensitivity list)
,这是一个组合电路,并且=
是正确的用法。always @*
如果您的模拟器允许,我还建议切换到。这*
是一个通配符,无需手动输入敏感度列表。
我认为值得记住的是,综合工具的结果将always @
基于如果它是基于边缘的语句,它们将使用一种触发器,如果它是组合的,它们将放置组合逻辑。使用=
or<=
仅对模拟有影响。使用错误的类型意味着您的模拟将与合成的硬件不匹配。