Verification Engineerの戯言
Bluespec SystemVerilog : COUNTERを学ぶ(その1)
Bluespec SystemVerilog : COUNTERを学ぶ(その2)
Bluespec SystemVerilog : COUNTERを学ぶ(その3)
Bluespec SystemVerilog : COUNTERを学ぶ(その2)
Bluespec SystemVerilog : COUNTERを学ぶ(その3)
(その2)のテストベンチのmkTbCounterモジュールでは、1つのテストに対して複数のルールを記述しています。
このルールでは、有限ステートマシンを使って、各ルールの条件を記述しています。
このルールでは、有限ステートマシンを使って、各ルールの条件を記述しています。
Bluespec SystemVerilogでは、有限ステートマシンを記述するためのライブラリが用意されています。
このライブラリをFSMライブラリと呼びます。
このライブラリを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 = seqとendseq;で書き込まれたのが有限ステートマシンの記述になります。
各行が1クロック毎に順次実行されるので、この記述では3クロックでの動作になります。
(複数行を同じクロックで実行するときは、action/endactionで囲む必要があります)
1クロック目にcounter.load(42);、2クロック目にcheck(42);、3クロック目に'''$display(" ... " ;が実行されます。
各行が1クロック毎に順次実行されるので、この記述では3クロックでの動作になります。
(複数行を同じクロックで実行するときは、action/endactionで囲む必要があります)
1クロック目にcounter.load(42);、2クロック目にcheck(42);、3クロック目に'''$display(" ... " ;が実行されます。
checkは、mkTbCouterモジュール内でのみ有効な関数(function)として定義しています。
SystemVerilogの関数(function)とよく似ていますが、action/endactionで囲まれています。
これは、1つのクロックで複数行を実行するために必要です。
SystemVerilogの関数(function)とよく似ていますが、action/endactionで囲まれています。
これは、1つのクロックで複数行を実行するために必要です。
StmtFSMパッケージについては、リファレンスガイドのC.5.1に詳しい説明があります。
検証、Verification、Bluespec SystemVerilog