等待 SV 中同一时间步的一点变化

Wait for A Bit Change in Same Timestep in SV

这是代码

module m;
  bit x;

  initial
  begin
    fork
      begin
        wait(x == 1);
        wait(x == 0);
      end
      begin
        @(x == 1);
        @(x == 0);
      end
      #10 $display("Timeout");
    join_any
    disable fork;
  end

  initial
  begin
    #5;
    x = 1;
    // Some other Logical Stuff
    x = 0;;
  end     
endmodule

现在在这段代码中,会发生超时,因为 x = 1 & x = 0 是在单个时间步中完成的。

一个解决方案是在 x = 1 和 x = 0 之间提供延迟,这样两个等待都可以正常工作。

有没有其他方法可以在不提供硬编码延迟的情况下工作?

注意:- 有了事件或信号量之类的东西,这个问题就可以解决了。但我正在寻找编码风格或方法方面的答案,它可以在不使用事件的情况下工作。

有几种方法,您可以在这里使用,如事件、信号量、标志等。 我在您的代码中添加了一个事件。请在下面找到修改后的代码 link.
http://www.edaplayground.com/x/Ws3

还有其他方式也喜欢,
1. 在声明期间将值“1”赋给 x
例如,位 x=1;
2. 在第二个初始块中同时使用阻塞和非阻塞赋值。
例如,

initial  
  begin  
    #5;  
    x = 1;  
    // Some other Logical Stuff  
    x <= 0; // Add non-blocking assignment  
  end   
end  

=> 第二个选项不是一个好的编码习惯,但它会解决您的问题,因为两个分配语句都适用于不同的区域。