私は、パラメータ化されたモジュールをバインドするために使用される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つは、すべてが合成可能である必要があります。
私のしていることの詳細については、私の編集ポストを参照してください。 予防措置を講じると、タスクは合成可能でなければなりません。 – Krouitch