SystemVerilog wait() 语句

SystemVerilog wait() statement

SystemVerilog 是否支持以下代码?

int cnt = 0;
wait( cnt == (cnt+1) )

谁能告诉我 LRM 中的部分?

我想答案取决于您所说的支持是什么意思?您当然可以编写毫无意义且始终会导致错误 (1'b0) 的表达式。这将导致 wait 语句挂起并暂停执行它的任何进程。

这是支持的。但主要问题是,这样的等待语句会得到什么,因为 这个语句永远不会被评估为 "true".

也许我可以帮助你,如果你提供更多细节,你到底想通过这个等待语句做什么。

同时,根据您的等待语句,这是代码及其输出。这将帮助您理解此等待语句的作用:

// Sample code, as per your wait statement
module top();
  int cnt;
  bit clk;

  always #5 clk = ~clk;

  always @ (posedge clk)
    cnt <= cnt + 1;

  initial
    begin
      $display("***** Before wait *****");
      wait(cnt == (cnt + 1))
      $display("***** After wait *****");
    end

  initial #100 $finish;
  initial $monitor("cnt - %0d", cnt);    
endmodule

// Output of this sample code
***** Before wait *****
cnt - 0
cnt - 1
cnt - 2
cnt - 3
cnt - 4
cnt - 5
cnt - 6
cnt - 7
cnt - 8
cnt - 9
cnt - 10
$finish called from file "testbench.sv", line 20.
$finish at simulation time                  100

是的,支持。即使从逻辑上您知道它会挂起,您也不会得到任何编译错误。 (如果那是你问的意图)

"wait" 语句是级别敏感的,将无限等待直到表达式被评估为真。它通常用于在执行另一个事件之前等待一个事件,或者延迟代码的执行直到某个事件发生。

由于在 systemverilog 中线程是动态创建的,因此事件之间的同步是必要的,这就是可以使用等待语句的地方。

您可以在其中阅读有关等待语句的更多信息的 LRM 部分:9.4.3(级别敏感事件控制)

您可以使用 SystemVerilog 自己的事件类型来代替 uvm_event。这消除了对 uvm_pkg.

的依赖
class container;
  event from_a;

  task a();
    ...
    -> from_a;
    ...
  endtask

  task b();
    ...
    @ from_a;
    ...
  endtask
endclass

您可以在 LRM 第 15 章找到很多关于进程间通信(邮箱、信号量、互斥量、事件)的内容。