Vengineerの妄想(準備期間)

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

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

Verification Engineerの戯言


(その2)のテストベンチのmkTbCounterモジュールでは、1つのテストに対して複数のルールを記述しています。
このルールでは、有限ステートマシンを使って、各ルールの条件を記述しています。

Bluespec SystemVerilogでは、有限ステートマシンを記述するためのライブラリが用意されています。
このライブラリをFSMライブラリと呼びます。

(その2)のテストベンチをFSMライブラリを使って書き換えたものが下記のコードになります。

    import StmtFSM::*;
    import Ch05_Counter::*;

    (* synthesize *)
    module mkTbCounter();

      Counter counter <- mkCounter();
      Reg#(Bit#(16)) state <- mkReg(0);
      // check that the counter matches an expected value

      function check(expected_val);
        action
          if (counter.read() != expected_val)
            $display("FAIL: counter != %0d", expected_val);
        endaction
      endfunction

      Stmt test_seq = seq
        counter.load(42);
        check(42);
        $display("TESTS FINISHED");
      endseq;

      mkAutoFSM(test_seq);

    endmodule

importで、StmtFSMパッケージをインポートします。

Stmt test_seq = seqendseq;で書き込まれたのが有限ステートマシンの記述になります。
各行が1クロック毎に順次実行されるので、この記述では3クロックでの動作になります。
(複数行を同じクロックで実行するときは、action/endactionで囲む必要があります)
1クロック目にcounter.load(42);、2クロック目にcheck(42);、3クロック目に'''$display(" ... ";) ;が実行されます。

checkは、mkTbCouterモジュール内でのみ有効な関数(function)として定義しています。
SystemVerilogの関数(function)とよく似ていますが、action/endactionで囲まれています。
これは、1つのクロックで複数行を実行するために必要です。

そして、mkAutoFSM(test_seq);でFSMライブラリのインスタンスを生成することになります。
なお、test_seqは、Stmtで指定した名前(test_seq)になります。

StmtFSMパッケージについては、リファレンスガイドのC.5.1に詳しい説明があります。

検証、Verification、Bluespec SystemVerilog