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

时间:2017-09-06 04:26:44

标签: 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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

为了使您的代码有效,请将ref替换为input

答案 1 :(得分:4)

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

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

相关问题