如何分层访问生成块元素

时间:2016-06-25 02:09:24

标签: system-verilog

考虑SV接口中的代码:

genvar i;
generate
for (i = 0; i < 2; i++) begin : g1
task ab ();
 ///< something here
endtask
end
endgenerate

根据LRM 1800-2012第27.6节我应该在技术上能够通过以下方式访问此任务(在监视器中考虑vif是接口的虚拟实例):

 vif.g1[i].ab();

这是对的吗?如果是,则模拟器有问题支持它,因为它报告无法找到vif.g1(精化时间)

我已经尝试过没有命名块,它只是假设:

vif.genblk1[i].ab();

但没有运气。 这是什么问题?我认为监视器或任何其他类都有句柄创建的运行时,但是接口仍然应该是静态时间编译的,并且接口的所有元素都应该可用。

1 个答案:

答案 0 :(得分:2)

您不能在[]&#39; s中使用变量来引用任务。 在模拟开始之前,生成循环在详细说明时变平。所以你需要用

调用任务
   vif.g1[0].ab;

这是一个完整的自包含示例。请尝试使用相同的方式发布您的问题。

interface itf;
      for (genvar ii = 0; ii < 2; ii++) begin : g1
     task ab ();
        $display("%m");
     endtask // ab     
      end : g1
endinterface : itf
module top;
   itf i1();
   virtual itf vif;
   initial begin
      vif = i1;
      vif.g1[0].ab;
   end
endmodule : top