Vengineerの妄想(準備期間)

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

Bluespec SystemVerilog : COUNTERを学ぶ(その1)

Verification Engineerの戯言

Bluespec SystemVerilogでCounterをBSV 101: Designing a Counter (1/09)で学びます。

このCounterについて、6回に分けて書きていきます。
Bluespec SystemVerilogのコードは、BSV 101: Designing a Counter (1/09)の中と同じものです(コードの著作権は、Bluespecにあります)。

ファイル名は、MyCounter.bsvとします。
HELLO WORLDのときは、モジュールはEmptyというインターフェースを持ちましたが、
Counterは、次のようなインターフェース(Counter)を持ちます。

    interface Counter;
      method Bit#(8) read();
      method Action load(Bit#(8) newval);
      method Action increment();
    endinterface

Counterインターフェースは、3つのメソッド(method)(read、load、increment)があります。
readメソッドは、戻り値(8ビット)を持ちます。一方、loadincrementメソッドは、戻り値はありません。
また、loadメソッドは、引数newvalを保ち、型は8ビットになります。

次に、mkCounterモジュールを定義していきます。

    (* synthesize *)
    module mkCounter(Counter);

      Reg#(Bit#(8)) value <- mkReg(0);

      method Bit#(8) read();
        return value;
      endmethod

      method Action load(Bit#(8) newval);
        value <= newval;
      endmethod

      method Action increment();
        value <= value + 1;
      endmethod

    endmodule 

mkCounterモジュールの定義の前に(* synthesize *)が必要です。
これが無いと、Verilog HDLには変換されませんので注意してください。
mkCounterモジュールは、Counterインターフェースを持つことになります。
(Hello Worldの例では、Emptyインターフェースになっていました。)

mkCounterモジュールは、内部に8ビット幅のレジスタ(value)を持ちます。
      Reg#(Bit#(8)) value <- mkReg(0);
Reg#(Bit#(8))のReg、Bitは定義済みものです。

このインスタンス(value)の初期値を<- mkReg(0)で指定しています。

mkCounterモジュールは、Counterインターフェースの3つのメソッドを実装しています。
インターフェースは、method/endmethodで囲みます。
      method Bit#(8) read();
        return value;
      endmethod
readメソッドは、戻り値としてBit#(8)の型であるvalueを返しています。

      method Action load(Bit#(8) newval);
        value <= newval;
      endmethod
loadメソッドは、引数newvalをvalueに代入します。

      method Action increment();
        value <= value + 1;
      endmethod
incrementメソッドは、valueの値をインクリメントします。


検証、Verification、Bluespec SystemVerilog