2017-05-16 8 views
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 (jXXX.i.x)if (i.x)を変更すると、それのsynthesizeを行います。それは私にとっては全く奇妙に思える。たぶん、誰かが、これが期待される行動であるかどうか、そしてその基準が何を言っているのかを明らかにすることができます。

タスクコードは(インタフェースに含まれている)yなどの非インタフェース変数は、先頭に追加インターフェイスインスタンスの名前を持っていることを特別な例外を除いて、process()呼び出しが発生する場所にペーストされた場合に理にかなってjXXX.i.xを参照。現時点では、私は "コンパイラのバグ"に投票するだけです。 私が現時点で使用している回避策は、wire logic HACK_i_x = i.x;をインターフェイスに追加し、シミュレートして合成するif (HACK_i_x)のようなこのローカルワイヤを参照することです。

答えて

0

これは合成ツールのバグのようです。他のシミュレータも、あなたが書いたコードを処理します。内部Jからの階層パスjXXX.は、それ自身の上位階層参照です。畳み込まれていますが、それでも合法です。

関連する問題