Posts Issued on April 3, 2020

BSV(Bluespec SystemVerilog) (5)

posted by sakurai on April 3, 2020 #232

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

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