Verilog 等待SV中相同时间步中的位更改

Verilog 等待SV中相同时间步中的位更改,verilog,system-verilog,Verilog,System Verilog,这是密码 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 i

这是密码

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之间提供延迟,这样两种等待都可以正常工作

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


注意:-使用类似stuff的事件或信号量,可以解决此问题。但是我在寻找编码风格或方法方面的答案,这些方法可以在不使用事件的情况下工作。

这里有几种方法可以使用,比如事件、信号量、标志等。 我在您的代码中添加了一个事件。请在下面的链接中找到修改后的代码。

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

首字母
开始
#5;  
x=1;
//还有一些逻辑的东西

x第二个选项不是一个好的编码实践,但它会解决您的问题,因为两个任务状态将在不同的区域工作。

是的,对于事件,我们可以这样做。但这需要额外的内存,而位x无论如何都会在设计中使用。那么,还有其他的编码风格或方法吗?它们不需要额外的东西,但在上述情况下仍然可以工作?如果逻辑允许的话,您还可以在x的声明期间为x指定一个值“1”。请检查我之前共享的同一个链接。不,因为,尽管我在上面的示例代码中只显示了一个x=1&x=0周期,但在我的实际代码中,x将从x=1到x=0(在同一时间步中)进行迭代更新,一段时间后,x=1,x=0等等。我再次修改了我的答案。请检查我答案中的第二个选项。我不完全确定你希望用这个实现什么,我假设你不知道其他逻辑需要多长时间(sim时间),但你想知道它是否需要超过10个时间单位。此外,出于某种原因,您似乎非常关心内存,尽管您愿意创建两个进程(一个计时器和kill timer forks)来实现这一点。另一种方法是在您自己的任务完成后,使用
禁用
来终止超时进程:
初始开始:看门狗#10$display(“timeout”);结束
,使用
禁用看门狗
作为终止计时器的机制(以
x为例
initial  
  begin  
    #5;  
    x = 1;  
    // Some other Logical Stuff  
    x <= 0; // Add non-blocking assignment  
  end   
end