当我们使用'< ='代替'='
时,任何人都可以解释为什么这个特定模块不起作用的原因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中使用'&lt; ='。
答案 0 :(得分:2)
在组合逻辑的情况下,"="
用于赋值,对于顺序块,我们有"<="
运算符。
"="
阻止分配,"<="
为非阻止分配。
"="
在开始/结束内顺序执行代码,而非阻塞"<="
并行执行。<强> More 强>
答案 1 :(得分:2)
正如Cthulhu所说=
正在阻塞,这意味着在进入下一行代码之前将对语句进行评估。
always @* begin
a = b & c;
d = e & f;
g = a & d ;
end
以上示例与:
相同always @* begin
g = b & c & e & f;
end
然而,如果我们切换到使用<=
那么它们在模拟中不再相同,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 @
之后的语句。如果它是基于边缘的,它们将使用一种触发器,如果它是组合的,它们将放置组合逻辑。 =
或<=
的使用仅对模拟有影响。使用错误的类型意味着您的模拟将与合成的硬件不匹配。