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

可以在Systemverilog中通过引用传递事件吗?,verilog,system-verilog,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 使用这个测

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

   event e;

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

   ...

   task ev(ref event e);
      @(e)
         do_something;    // this will never happen
   endtask
使用这个测试台:,似乎有些模拟器,比如
ref事件
,有些没有。未发出编译警告,但从未传递
@(..)
语句


对我来说,这似乎是一个有效的SystemVerilog用法,是否有我遗漏的警告?

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

这里的问题是SystemVerilog将两个构造混在一个关键字中。在Verilog中,
事件
只是一个无值变量,您可以通过触发器
->
来更改它,并等待它像任何其他变量一样更改

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


因此,为了使代码正常工作,将
ref
替换为
input

将事件作为
task ev(event e)
传递也应该通过引用传递,就像类对象一样。按值传递事件(即复制事件并给函数一个新事件)实际上没有意义,因为事件并不真正存储数据。我不确定这是否在LRM中明确列出,但在我看来这只是常识


块未被触发的工具将事件视为基本体并按值传递。我会为这些提交支持案例。

哇,这类
事件的行为是不直观的。。所以现在我明白了为什么
input
可以工作了,这样使用它是有意义的。我仍然很好奇为什么在使用
ref
时它不起作用?这不应该在任务内部创建引用吗?我认为LRM在这里不是很清楚。由于这是对引用事件的引用,@e可以解释为等待引用更改为另一个事件对象,而不是事件触发器本身。我同意在任何程序中按值传递事件都是没有意义的。但是,乍一看,我原以为它们被当作int或bit处理。如果像@dave_59所建议的那样,将事件声明为ask的
input
,那么问题就会消失,因此该工具似乎做了正确的事情。但仍不确定为什么使用
ref
失败