2017-03-23 5 views
0

私は、パラメータ化されたモジュールをバインドするために使用されるinterfaces配列を扱っています。
私の問題は、いくつかの単純なインターフェイスをインターフェイスの配列に直接連結できないことです。ここで配列を配列で囲む

は、私が使用するインターフェイスのライトバージョンです:

interface channel(); 
    wire req; 
    wire ack; 
    modport in (input req output ack); 
    modport out(input ack output req); 
endinterface 

は、私が何をしたいかのようになります。

Channel array[2](); 
Channel elem0(); 
Channel elem1(); 

"assign" array = '{elem0,elem1}; 

私は独立して各ワイヤを割り当てモジュールを使用して回避策を見つけました:

module passthrough (Channel.in from, Channel.out to); 
    assign to.req = from.req; 
    assign from.ack = to.ack; 
endmodule 

これを使用して、各メンバー要素を各配列メンバーに「キャスト」する必要があります。前の例を使用すると:パラメータ化モジュールの使用に関する主なアイデアは短く、保守性、明確に私のRTLを作ることだったよう

passthrough pass0(.from(elem0), .to(array[0])); 
passthrough pass1(.from(elem1), .to(array[1])); 

でも、私はそれを好きではありません。

私は自然にこのpassthroughモジュールのインスタンス化をマクロに入れましたが、それでも私は満足できません。

私はインターフェイスに埋め込まれたタスクを見つけました。私は(S)Verilogでの作業にはあまり慣れていませんが、私の考えがうまくいくとは思えません。ここに私が試した何がある:

interface channel(); 
    reg req; 
    reg ack; 
    modport in (input req output ack); 
    modport out(input ack output req); 

    task wrap_from (Channel.in I); 
    [email protected]* begin 
     req = I.req; 
     I.ack = ack; 
    end 
    endtask 
endinterface 

この方法の利点は、私はモジュール私は2つのチャンネルを接続する必要があるたびに作成する必要がないということだろう。コード行も短くなります。

残念ながら、私のコンパイラ(ncsim)は、独自の宣言内のインターフェイスとしてchannelを認識しません(ネームスペースでは、endinterfaceキーワードが必要です)。

誰かがこの問題の解決策よりもクリーンであれば、私は非常に感謝します。

最後に1つは、すべてが合成可能である必要があります。

答えて

0

私はなぜインターフェイスの配列を展開するのかと苦労しています。 elem0とelem1はなぜ存在するのでしょうか?提案したように、お互いにインターフェイスを「割り当てる」方法はありません。私の推奨は、どこでもChannel array [2]を使うことです。各インスタンスにバインドし、それぞれをモジュールに接続することができます。たぶんあなたが接続しようとしているものにあなたが共有しているなら、私はより多くを助けることができますか?

モジュールタスクが合成可能であるかどうかは疑問です。それは私にとって死んだ終わりのように見えます。

+0

私のしていることの詳細については、私の編集ポストを参照してください。 予防措置を講じると、タスクは合成可能でなければなりません。 – Krouitch