请考虑以下示例代码:
interface I();
logic x;
modport slave(input x);
endinterface
interface J(I.slave i);
logic y;
task process;
if (i.x) begin
// ...
end
if (y) begin
// ...
end
endtask
endinterface
module test(input wire logic clock);
I iXXX();
J jXXX(.i(iXXX), .*);
always @(posedge clock) begin
jXXX.process();
end
endmodule
此代码使用Vivado 2017.1模拟器,不使用Vivado 2017.1综合失败,错误
[Synth 8-146] cannot resolve hierarchical name ...
如果您将if (i.x)
更改为if (jXXX.i.x)
,则 会合成。这对我来说似乎很奇怪。也许有人可以说明这是否是预期的行为以及标准所说的内容。
如果将任务代码粘贴到jXXX.i.x
调用发生的位置,则引用process()
是有意义的,特殊例外是非接口变量,如y
(包含在interface)具有前置接口实例的名称。目前,我只是投票支持“编译器错误”。
我目前使用的解决方法是将wire logic HACK_i_x = i.x;
添加到界面并引用像if (HACK_i_x)
这样模拟和合成的本地线。
答案 0 :(得分:0)
这对我来说似乎是一个综合工具错误。其他模拟器也处理您编写的代码。来自jXXX.
内部的分层路径J
是对其自身的向上分层引用。令人费解,但仍然合法。