Vengineerの妄想(準備期間)

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

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

Verification Engineerの戯言


mkCounterモジュールに対するテストベンチもBluespec SystemVerilogで記述しています。
テストベンチのファイル名は、TbCounter.bsvです。

    import MyCounter::*;

    (* synthesize *)
    module mkTbCounter();

    endmodule

どうやら、テストベンチに対しては、モジュールに対するインターフェースを指定する必要は内容です。
(ちょっと、一貫性がないような気がしますが)

と、思ってみて、リファレンスガイドの5.3 Module definitionに、

    引数を省略した場合は、Emptyインターフェースを指定したのと同じことになります。
と書いてありました。

この例での理由は、外部モジュールとのインタラクトが無いからだと書いてありますが、
それならEmptyインターフェースを指定すればいいのに!

    Counter counter <- mkCounter();
    Reg#(Bit#(16)) state <- mkReg(0);

Counterインターフェースのインスタンスcounterは、mkCounter()で初期化します。

ステートを示すstateは、16ビットのレジスタです(初期値は、mkReg(0)で0を設定しています)

    rule step0(state == 0);
      counter.load(42);
      state <= 1;
    endrule

    rule step1(state == 1);
      if (counter.read() != 42) 
        $display("FAIL: counter.load(42)");
      state <= 2;
    endrule

    rule done(state == 2);
      $display("TESTS FINISHED");
      $finish(0);
    endrule

ルールは、3つ(step0, step1, done)です。
stateの状態により、各ルールが実行されます。
stateの初期値は0なので、step0 => step1 => step2 の順番にルールが適応されます。

1)、step0ルール

stateが0のとき、counterに42をロードし、stateを1にする。

2)、step1ルール

stateが1のとき、counterの値が42であることをチェックする。

3)、doneルール

stateが2のとき、メッセージ(TESTS FINISHED)を表示し、シミュレーションを終了($finish(0))する。

検証、Verification、Bluespec SystemVerilog