考虑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();
但没有运气。 这是什么问题?我认为监视器或任何其他类都有句柄创建的运行时,但是接口仍然应该是静态时间编译的,并且接口的所有元素都应该可用。
答案 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