谁能解释一下为什么当我们使用“<=”而不是“=”时这个特定模块不起作用
module TestCell(x0, x1, y0, y1, z);
input x0, x1, y0, y1;
output z;
reg z;
reg a1, a2, a3, a4;
always @(x0 or x1 or y0 or y1) begin
a1 <= ~(x0 & y1);
a2 <= ~(y0 & x1);
a3 <= ~(a2 | a1);
a4 <= a2 & a1;
z <= ~(a4 | a3);
end
endmodule
为了在 verilog 中使用“<=”,我们应该确保什么。
最佳答案
正如克苏鲁所说=
是阻塞的,这意味着该语句将在进入下一行代码之前被评估。
always @* begin
a = b & c;
d = e & f;
g = a & d ;
end
上面的例子与:
always @* begin
g = b & c & e & f;
end
但是,如果我们改用 <=
然后它们在模拟中不再相同,g将是旧的a和旧的b。由于这是一个组合 block ,即不像触发器那样定期触发或评估,因此您将从模拟中得到奇怪的结果。
正确使用<=
非阻塞赋值意味着触发器。
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 @
之后的语句。如果它是基于边缘的,他们将使用一种触发器,如果它是组合的,他们将放置组合逻辑。使用=
或<=
仅在模拟中有效。使用错误的类型意味着您的模拟将与合成的硬件不匹配。
关于verilog - 在verilog中使用 '<='运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13081313/