![]() |
1 |
BSV(Bluespec SystemVerilog) (4) |
![]() |
モジュールインタフェースの引出し
Vivadoにより合成をかける場合に、前稿のモジュールmkFibOneのように出力の信号が無いと、何もしないものとみなされ最適化され、全てのロジックが削除されてしまいます。従って、mkFibOneモジュールに、計算した値を出力するインタフェースを設ける修正を行います。合わせて、テストベンチ記述がモジュール内に混入されていたものを、テストベンチに移します。
BSVではモジュールとインタフェースは明確に分離されています。修正したファイル(ファイル名FibOne.bsv)を示します。前述のように\$displayや\$finishはテストベンチへ移しました。
モジュールファイル:FibOne.bsv
ここで、
これは前稿で2行になっていたレジスタのインスタンシエーションの省略記法で、
という文法を持ちます。この意味は、「Interface_typeの型を持つインタフェースを提供するモジュールmodule_nameをインスタンス化し、インタフェースのハンドルidentifierを取得する」ということです。
Verilogの生成
BSVプログラムに対して、bscによりverilog生成を実行すれば、
合成されたverilog(ファイル名mkFibOne.v)は以下のようになります。
モジュールファイル:mkFibOne.v
テストベンチ
修正したVerilogテストベンチtbmkFibOne.vを以下に示します。前稿ではクロックとリセットを下位モジュールに供給するだけだったのを、データ表示とシミュレーションの停止機能をモジュールから移動しています。
テストベンチファイル:tbmkFibOne.v
Verilogシミュレーション
準備ができたので、iverilogによるverilogシミュレーションを実行します。
前稿と同様の結果になりました。
Vivadoによるシミュレーション
VivadoのIPインテグレータにより、生成されたverilogを取り込み、IPインテグレータ上で最上位のテストベンチを作成します。先に作成したテストベンチ(ファイル名tbmkFibOne.v)はシミュレーション用で合成できないため、IPインテグレータで上位を作成します。図の左からZynqのPS部、クロックリセット生成、対象回路となっています。

vivado上でbehaviorシミュレーションを実施した結果です。iverilogの結果と同一になっています。
