Verification Engineerの戯言
mkCounterモジュールに対するテストベンチもBluespec SystemVerilogで記述しています。
テストベンチのファイル名は、TbCounter.bsvです。
テストベンチのファイル名は、TbCounter.bsvです。
import MyCounter::*; (* synthesize *) module mkTbCounter(); endmodule
どうやら、テストベンチに対しては、モジュールに対するインターフェースを指定する必要は内容です。
(ちょっと、一貫性がないような気がしますが)
(ちょっと、一貫性がないような気がしますが)
と、思ってみて、リファレンスガイドの5.3 Module definitionに、
引数を省略した場合は、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 の順番にルールが適応されます。
stateの状態により、各ルールが実行されます。
stateの初期値は0なので、step0 => step1 => step2 の順番にルールが適応されます。
1)、step0ルール
検証、Verification、Bluespec SystemVerilog
stateが0のとき、counterに42をロードし、stateを1にする。
2)、step1ルール
stateが1のとき、counterの値が42であることをチェックする。
3)、doneルール
stateが2のとき、メッセージ(TESTS FINISHED)を表示し、シミュレーションを終了($finish(0))する。