可以在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
失败