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

Can events be passed by reference in Systemverilog?

如果我调用一个任务并通过引用传递一个事件,事件触发后任务内部将检测不到它:

   event e;

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

   ...

   task ev(ref event e);
      @(e)
         do_something;    // this will never happen
   endtask

玩这个测试台:http://www.edaplayground.com/x/5YS7,似乎有些模拟器喜欢 ref event 而有些则不喜欢。没有发出编译警告,但从未通过 @(..) 语句。

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

无需通过引用传递事件变量 - 它已经是一个引用。

这里的问题是 SystemVerilog 将两个结构拼凑成一个关键字。在 Verilog 中,event 只是一个无值变量,您可以使用触发器 -> 更改它并等待它像任何其他变量一样更改。

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

为了使您的代码正常工作,请将 ref 替换为 input

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

不会触发您的块的工具将事件视为基元并按值传递它们。我会为这些提交支持案例。