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)
。