事件可以在 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 这只是常识。
不会触发您的块的工具将事件视为基元并按值传递它们。我会为这些提交支持案例。
如果我调用一个任务并通过引用传递一个事件,事件触发后任务内部将检测不到它:
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 这只是常识。
不会触发您的块的工具将事件视为基元并按值传递它们。我会为这些提交支持案例。