假设我有以下内容:
always @ (posedge clk) beign
...
if (~x) begin
y<=1'b0
end
...
end
和x
,驱动在另一个块,碰巧从0过渡到1的时刻,我正在检查它。在这种情况下if()
的值是多少?是取x
(0)的起始值,还是取x
(1)的终值?
我看过类似问题的其他答案,但没有一个讨论信号转换时的特殊情况。看着这些波,时间精度不允许我辨别信号x是稳定在0还是1。
这取决于x
是如何被驱动的。
如果它与时钟信号clk
同步,那么将使用时钟边缘(0)之前的x
的值。在Verilog模拟中,这意味着必须将x
从posedge clk
中移除,并使用非阻塞赋值:
always @(posedge clk)
x <= some_expression;
否则,您将有一个竞争条件,并且使用的x
的值将是不确定的:它可能是0或1。