如果我通过引用调用任务并传递事件,则在事件触发后不会在任务内部检测到该事件:
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使用,是否有一个我不知道的警告?
答案 0 :(得分:7)
无需通过引用传递事件变量 - 它已经是引用。
这里的问题是SystemVerilog将两个构造绑定到一个关键字中。在Verilog中,event
只是一个无值变量,您可以使用触发器->
进行更改,并等待它像其他任何变量一样进行更改。
SystemVerilog增强了event
数据类型,使其更像一个类变量。除event
不需要构造函数外,任何事件声明都会自动构造一个事件对象。这使事件向后兼容Verilog。当您从一个事件变量到另一个事件变量进行分配时,您正在将句柄复制到事件对象。这与复制类变量相同 - 您只是复制句柄而不是对象。
为了使您的代码有效,请将ref
替换为input
。
答案 1 :(得分:4)
将事件作为task ev(event e)
传递也应该通过引用传递它,就像类对象一样。按值传递事件(即复制它并为函数提供新事件)并不真正有意义,因为事件并不真正存储数据。我不确定这是否明确列在LRM中,但IMO只是常识。
未触发块的工具将事件视为基元并按值传递它们。我会为这些提交支持案例。