22 |
BSVのサブインタフェース |
BSVの先進的な話題のひとつにサブインタフェースがあります。これはインタフェースの階層化であり、インタフェース階層に別のインタフェースを入れ子で持つものです。ただしその実装はモジュールの中で定義するので、インタフェースを共通化しつつも実装を変える(ポリモーフィズム)などということが可能です。
DumpFSMモジュール内にUartを内蔵する例を図802.1に示します。
DUmpFSMモジュールのインタフェース部は、図のように端子を並べることも当然できますが、別の方法としてサブインタフェースを用いて記述することができます。Uartのインタフェースは定義済みなので、端子を書き並べる代わりに再利用します。このように一行で書き表せ、誤りも起こりにくいのがメリットです。
interface DumpFSM_ifc;
:
interface Uart_ifc uart_ifc; // サブインターフェースの宣言
endinterface
そして、モジュール最後のmethod定義の後にサブインタフェースを定義します。ただし端子の一部しか外部に表れていないため、コンパイル時に外部に出力していないread
及びwrite
端子が不足する旨の警告が出ます。
// Uartインタフェースのうち、外部端子に出るもののみを定義
interface Uart_ifc uart_ifc;
method Bit#(1) sout; // serial output
return uart.sout;
endmethod
method Action sin(Bit#(1) nidata); // serial input
uart.sin(nidata);
endmethod
method Bool pdone;
return uart.pdone;
endmethod
method Bool gdone;
return uart.gdone;
endmethod
endinterface
コンパイルすると以下の警告が表示されます。
$ bsc -sim DumpFSM.bsv
Warning: "DumpFSM.bsv", line 208, column 14: (T0054)
Field not defined: `read'
Warning: "DumpFSM.bsv", line 208, column 14: (T0054)
Field not defined: `write'
Elaborated module file created: mkDumpFSM.ba
ただしread及びwriteは未定義ではなくモジュール内部で使用しており、警告にも関わらず正しく内部で接続されています。