のタスクで参照インターフェイス変数は、次のコード例を検討: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 (jXXX.i.x)
にif (i.x)
を変更すると、それはのsynthesizeを行います。それは私にとっては全く奇妙に思える。たぶん、誰かが、これが期待される行動であるかどうか、そしてその基準が何を言っているのかを明らかにすることができます。
タスクコードは(インタフェースに含まれている)y
などの非インタフェース変数は、先頭に追加インターフェイスインスタンスの名前を持っていることを特別な例外を除いて、process()
呼び出しが発生する場所にペーストされた場合に理にかなってjXXX.i.x
を参照。現時点では、私は "コンパイラのバグ"に投票するだけです。 私が現時点で使用している回避策は、wire logic HACK_i_x = i.x;
をインターフェイスに追加し、シミュレートして合成するif (HACK_i_x)
のようなこのローカルワイヤを参照することです。