Verilog "if(test_conditional)" 'test_conditional'信号转换时的行为



假设我有以下内容:

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模拟中,这意味着必须将xposedge clk中移除,并使用非阻塞赋值:

always @(posedge clk)
x <= some_expression;

否则,您将有一个竞争条件,并且使用的x的值将是不确定的:它可能是0或1。

最新更新