可以通过Systemverilog中的引用传递事件吗?

chi*_*ico 3 verilog system-verilog

如果我通过引用调用任务并传递事件,则在事件触发后将不会在任务内部检测到该事件:

   event e;

   fork
     test_ev(e);
     begin 
        #1ms;
        ->e;
     end
   join

   ...

   task ev(ref event e);
      @(e)
         do_something;    // this will never happen
   endtask
Run Code Online (Sandbox Code Playgroud)

玩这个测试平台:http://www.edaplayground.com/x/5YS7,似乎有些模拟器喜欢ref event,有些则没有.未发出编译警告,但该@(..)语句永远不会传递.

对我来说似乎是一个有效的SystemVerilog使用,是否有一个我不知道的警告?

dav*_*_59 7

不需要通过引用传递事件变量 - 它已经是一个引用.

这里的问题是SystemVerilog将两个构造绑定到一个关键字中.在Verilog中,a event只是一个无值变量,你可以用触发器->改变它并等待它像任何其他变量一样改变.

SystemVerilog增强了event数据类型,使其更像一个类变量.除了event不需要构造函数之外,任何事件声明都会自动构造一个事件对象.这使事件向后兼容Verilog.当您从一个事件变量到另一个事件变量进行分配时,您正在将句柄复制到事件对象.这与复制类变量相同 - 您只复制句柄而不是对象.

因此,要使代码工作,请替换refinput.