![]() |
3 |
BSV(Bluespec SystemVerilog) (5) |
![]() |
BSVによるテストベンチの記述
続いてテストベンチもBSVで記述していきます。シーケンシャルな記述が必要なので、自動FSMを利用します。以下にBSV(ファイル名Tb.bsv)を示します。テストベンチにクロックとリセットの記述が無いことに注意してください。
seqブロックの内部では、ソフトウェアと似ており、一行1クロックで順番に実行されます。内部的にはbscにより自動ステートマシンが生成され、一行ずつ順番に実行されます。
テストベンチファイル:Tb.bsv
import FibOne::*;
import StmtFSM::*;
(* synthesize *)
module mkTb();
Fib_ifc fibo <- mkFibOne();
int x = fibo.read();
Stmt test = seq
while (x < 10000)
$display("%0d", x);
$display("%0d", x);
$finish;
endseq;
mkAutoFSM(test);
endmodule
コンパイルとBluesimシミュレーションの実行
このテストベンチをコンパイルし、シミュレーションを実行します。以下は下位モジュールが変更されていた場合ですが、自動的に下位モジュールもコンパイルされます。
$ **bsc -sim -u Tb.bsv**
checking package dependencies
compiling ./FibOne.bsv
code generation for mkFibOne starts
Elaborated module file created: mkFibOne.ba
compiling Tb.bsv
code generation for mkTb starts
Elaborated module file created: mkTb.ba
All packages are up to date.
bluesimシミュレーションを実行します。
$ bsc -sim -e mkTb -o mkTb.exec
Bluesim object created: mkTb.{h,o}
Bluesim object created: mkFibOne.{h,o}
Bluesim object created: model_mkTb.{h,o}
Simulation shared library created: mkTb.exec.so
Simulation executable created: mkTb.exec
$ ./mkTb.exec
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
Verilogテストベンチと同様の結果が得られました。
Verilogシミュレーションの実行
確認のため、verilogシミュレーションを実施してみます。BSVではクロックとリセットは書かなくてもシミュレーション時に補完されるのですが、verilogシミュレーション時には無いため、マニュアルで追加する必要があります。それらの記述は前稿のテストベンチを参考にします。
以下にテストベンチからverilogコードを生成し(ファイル名mkTb.v)ます。
$ bsc -verilog Tb.bsv
Verilog file created: mkTb.v
そのファイルにinclude文を追加します。場所は、initial begein endの間です。includeするファイルにはクロックとリセットの動作をverilogで記述します。その理由は、Bluesimの場合は外部から自動的にクロックとリセットが印加されるのに比べて、verilog simでは陽に与える必要があるからです。
テストベンチファイル:mkTb.v(部分)
initial
begin
running = 1'h0;
start_reg = 1'h0;
start_reg_1 = 1'h0;
state_can_overlap = 1'h0;
state_fired = 1'h0;
state_mkFSMstate = 3'h2;
`include "initial.v" <----ここ
end
initial.vの中身を示します。クロックとリセットの記述がされています。
インクルードファイル:initial.v
force RST_N = 1'b0;
#30;
force RST_N = 1'b1;
end
initial begin
force CLK = 1'b0;
forever begin
#5 force CLK = ~CLK;
end
修正したテストベンチmkTb.vとモジュールを合わせてverilogシミュレーションを行います。
$ bsc -verilog FibOne.bsv
Verilog file created: mkFibOne.v
$ iverilog mkTb.v mkFibOne.v -o mkFibOne.exev
mkTb.v:220: tgt-vvp sorry: procedural continuous assignments are not yet fully supported. The RHS of this assignment will only be evaluated once, at the time the assignment statement is executed.
$ ./mkFibOne.exev
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946