1
考虑下面的示例代码的任务引用:的SystemVerilog:接口变量中的其他接口
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
非接口变量(包含在接口)有前置接口实例的名称。目前,我只是投票“编译器bug”。 我目前使用的解决方法是将wire logic HACK_i_x = i.x;
添加到接口并引用此模拟和综合的本地线路,如if (HACK_i_x)
。