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

时间:2015-10-01 05:53:37

标签: 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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

有几种方法,你可以在这里使用,如事件,信号量,旗帜等。 我在您的代码中添加了一个事件。请在下面的链接中找到修改后的代码 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  

=&GT;第二个选项不是一个好的编码实践,但它会解决您的问题,因为任务分配都适用于不同的区域。