【发布时间】:2017-05-16 13:33:45
【问题描述】:
考虑以下示例代码:
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 Simulator 运行,不使用 Vivado 2017.1 Synthesis 运行失败并出现错误
[Synth 8-146] cannot resolve hierarchical name ...
如果您将if (i.x) 更改为if (jXXX.i.x),它会 合成。这对我来说似乎完全奇怪。也许有人可以阐明这是否是预期行为以及标准对此有何规定。
如果将任务代码粘贴到发生process() 调用的位置,则引用jXXX.i.x 是有意义的,但像y 这样的非接口变量(包含在接口中)的名称为前置接口实例。目前,我只会投票支持“编译器错误”。
我目前使用的解决方法是将wire logic HACK_i_x = i.x; 添加到接口并引用此本地线,例如模拟和合成的if (HACK_i_x)。
【问题讨论】:
标签: verilog system-verilog xilinx vivado