为什么不能在系统Verilog中的fork join中使用引用参数?

时间:2019-06-04 12:19:18

标签: system-verilog

在系统Verilog中的fork join中不能使用参考参数的使用 **错误:../ tb / range_xform_driver.sv(28):(vlog-LRM-2295)通过引用传递的参数不能在fork-join_any或fork_join_none块中使用

**错误:../ tb / range_xform_driver.sv(29):(vlog-LRM-2295)通过引用传递的参数不能在fork-join_any或fork_join_none块内使用

1 个答案:

答案 0 :(得分:0)

这是LRM限制(请参见第9.3.2节“ 1800-2017 LRM中的并行块”)。该限制的原因与fork / join_none /中引用的任何变量的生存期有关。 join_any块必须在fork块的整个生命周期中都存在。回想一下,存在这些种类的变量生命周期

  • 静态-永久且不是此问题的问题
  • 自动-在块激活期间存在
  • 动态-通过活动引用对类对象进行内存管理。

队列,动态数组和关联数组为每个元素在上面添加了另一个维度。 问题是当您通过引用传递变量时,您没有有关该变量属于哪种存储类的信息,以便能够延长其寿命。您只有对与引用类型匹配的通用变量类型的引用。 假设您有一个任务,该任务的int带有ref参数,然后调用该任务,将其传递给int的类成员。调用该任务的代码仅传递对该int的引用,而不传递其所属类的句柄。传递数组元素也存在同样的问题。

如果编译器内联任务(用任务源代码的内容替换对任务的调用),则可以避免此限制。但是,那么您就无法利用单独的编译功能(将任务定义与编译调用任务的代码分开进行)。