Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Bluespec SystemVerilog : インターフェースの定義

Verification Engineerの戯言

インターフェースの定義(実際は、methodの定義)は、モジュールの定義の中で行います。

メソッドの名前は、モジュールのインターフェースで宣言したものと同じでなければいけません。
戻り値や引数の数および型も同じでなければいけません。また、各メソッドは必ず1回のみ定義しなければいけません。
(なお、戻り値と引数は省略可能です。そのときは、インターフェースの宣言と同じモノとして扱われます。)

bscコンパイラは、モジュール内に未定義のメソッドがある場合はワーニングを出力します。

implicitCound(暗示的な条件)は、オプションです。
もし、指定する場合は条件式あるいはパターンマッチングになります。
条件が真の時のみ、メソッドが呼ばれます。

リファレンス・ガイドのPage.33の例を見てみましょう!

    interface GrabAndGive; // interface is declared
      method Action grab(Bit#(8) value); // method grab is declared
      method Bit#(8) give(); // method give is declared
    endinterface

    module mkExample (GrabAndGive);
      Reg#(Bit#(8)) value_reg <- mkReg(?);
      Reg#(Bool)    not_yet   <- mkReg(True);

      // method grab is defined
      method Action grab(Bit#(8) value) if (not_yet);
        value_reg <= value;
        not_yet   <= False;
      endmethod

      //method give is defined
      method Bit#(8) give() if (!not_yet);
        return value_reg;
      endmethod
    endmodule

mkExampleモジュールは、GrabAndGiveインターフェースを持ちます。
mkExampleモジュール内でGrabAndGiveインターフェースの2つのメソッド(grabgive)を定義しています。

grabメソッドは、(not_yet)が真のときのみ実行されます。
giveメソッドは、(!not_yet)が真のときのみ実行されます。

リファレンス・ガイドにも書いてあるのですが、

    method ... foo (...) if (expr);
      ...
    endmethod

    method ... foo (...); if (expr)
      ...
    endmethod

上記の上のメソッドは、exprが真のときにfooメソッドが実行されます。
上記の下のメソッドは、fooメソッドが呼び出された後にif (expr)が実行されます。

検証、Verification、Bluespec SystemVerilog