SystemVerilog wait()语句

时间:2016-01-27 06:08:45

标签: verilog system-verilog uvm

SystemVerilog是否支持以下代码?

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

任何人都可以指出LRM中的部分吗?

4 个答案:

答案 0 :(得分:4)

支持此功能。但主要的问题是,你会通过这样的等待声明得到什么,因为这句话永远不会被评估为" 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

答案 1 :(得分:2)

我猜答案取决于支持的含义?你肯定被允许编写没有意义的表达式,并且总是会导致错误(1'b0)。这将导致等待语句挂起并暂停执行它的任何进程。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

您可以使用SystemVerilog自己的事件类型代替uvm_event。这将删除对uvm_pkg的依赖性。

class container;
  event from_a;

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

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

你可以找到很多关于进程间通信(邮箱,信号量,互斥,事件)@LRM第15章。