モジュール間の依存性の排除,System verilog
メリット
新しい処理を追加したければ,新たなinterfaceを作成して,メインモジュールで繋げるだけで良い.
generate文でparameterごとに切り替える処理だと,parameterの変更と,その度に該当モジュールを修正しないといけない.(モジュールは触りたくないので,interfaceで特別な処理を書くだけにしたい.)
流れ
interfaceで異なる処理を実装.
共通の処理をモジュールで実装
generic interfaceでinterfaceのインスタンスを接続
interfaceA,Bで異なる処理を実装
- 各実装は共通のインターフェースmodport portを持つ.
interface A #( parameter int hoge = .. )( input wire clock, input wire reset ); logic [hoge-1:0] addr; logic [hoge-1:0] inst; modport port ( input addr output inst ); // A処理の実装 endinterface interface B #( parameter int hoge = .. )( input wire clock, input wire reset ); logic [hoge-1:0] addr; logic [hoge-1:0] inst; modport port ( input addr output inst ); // B処理の実装 endinterface
モジュールCでA,Bの共通の処理を実装.
module C ( interface.port port input wire pc; ); logic [31:0] result; always_comb begin port.addr = pc; result = port.inst; end endmodule
メインモジュールでinterfaceをインスタンス化し渡す.
- ここではinterface Aをインスタンス化し,モジュールCに渡している.
A a_hoge(); C c_hoge ( .port (a_hoge), .pc (pc) );