Posts Issued on April 3, 2020

BSV(Bluespec SystemVerilog)(5)

posted by sakurai on April 3, 2020 #232

BSVによるテストベンチの記述

続いてテストベンチもBSVで記述していきます。シーケンシャルな記述が必要なので、自動FSMを利用します。以下にBSV(ファイル名mkTb.bsv)を示します。テストベンチにクロックとリセットの記述が無いことに注意してください。

seqブロックの内部では、ソフトウェアと似ており、一行1クロックで順番に実行されます。内部的にはbscにより自動ステートマシンが生成され、一行ずつ順番に実行されます。

import FibOne::*;
import StmtFSM::*;

(* synthesize *)
module mkTb();

   Fib_ifc fibo <- mkFibOne();
   int x = fibo.read();

   Stmt test = seq
      while (x < 10000)
         $display("%d", x);
      $display("%d", x);
      $finish;
   endseq;

   mkAutoFSM(test);

endmodule

コンパイルとBluesimシミュレーションの実行

このテストベンチをコンパイルし、シミュレーションを実行します。以下は下位モジュールが変更されていた場合ですが、自動的に下位モジュールもコンパイルされます。

\$ bsc -sim -u mkTb.bsv
checking package dependencies
compiling ./FibOne.bsv
code generation for mkFibOne starts
Elaborated module file created: mkFibOne.ba
compiling mkTb.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
Bluesim object created: mkTb.{h,o}
Bluesim object created: mkFibOne.{h,o}
Bluesim object created: model_mkTb.{h,o}
Simulation shared library created: mkTb.so
Simulation executable created: mkTb
\$ ./mkTb
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)、追加したクロックとリセットの部分のみの記述を示します。

initial begin
(略)
   force RST_N = 1'b0;
   #100;
   force RST_N = 1'b1;
end

initial begin
   force CLK = 1'b0;
   forever begin
   #10 force CLK = ~CLK;
end

修正したテストベンチmkTb.vとモジュールを合わせてverilogシミュレーションを行います。

\$ bsc -verilog FibOne.bsv
Verilog file created: mkFibOne.v
\$ iverilog mkTb.v mkFibOne.v -o mkFibOne
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
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946


左矢前のブログ 次のブログ右矢