Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

BFM : Bus Functional Model

Verification Engineerの戯言

今回は、結構、大作です。

BFM(Bus Functional Model, Functionではありません)は、検証になくてはならないものです。
一般的なBFMはファイルを読み込み、そのファイルに記述されたデータを元に動作します。
BFMが直接読み込めるファイルの内容は基本的にはROMイメージ(HEX表現のデータ)ですね!
いきなりROMイメージを書くということは、マシン語でプログラムを書くということと同じですから、
アセンブラのような簡易言語を使って、BFMへのコマンドを書き、この簡易言語を処理するツールで
ROMイメージに変換します。
簡易言語内でif/then/else、while、forなどが使えれば、かなりのことができます。
さらにサブルーチン、ファイルのインクルード(`include)、マクロ定義(`define)などができると
さらにいろいろなことができます。

私は、初めてHDL(Verilog HDL)でASIC開発をしたときに、BFMを独自に開発しました。
そして、BFMが読み込むROMイメージへの変換ツールも当時流行りだしたPerlで作りました。
(今作るのなら、Perlではなく、Rubyを使うのがいいかも?)
サブルーチンは実装しましたが、インクルードやマクロはどうかな??
とにかく、ASICの設計/検証の他にBFMの開発も行ったので、それなりの時間で作ったのですが、
幸運にもBFMによるバグは発生しませんでした。

ここまでは思い出話ですが、

しかし、BFMの簡易言語で記述したコマンドファイルの中身ははっきり言ってわかりません。
自分が書きてもちょっとすれば、記憶はどこかにとんでいってしまいます。
また、ブロック検証で使用したコマンドファイルをチップ検証などで使うには結構手間がかかります。
それにチップ検証では、BFMの違いによりブロック検証で使ったコマンドファイルが使えない場合が結構あります。

対策としては、ブロック検証とチップ検証で同じコマンドファイルが使えるようにする。
それでもコマンドファイルに違いが無いので書いた内容がわかりづらいのは相変わらずです。

そこで、コマンドファイルではなく、C言語のプログラムがかけるようにBFMを作ればいいのでは?
どうすれば、C言語のプログラムが利用できるのでしょうか?
そうです。SystemVerilogには、DPI-C(DPI:Direct Programming Interface)というものがあり、
このDPI-Cを使えば、SystemVerilogからC言語の関数を呼び出したり、C言語からSystemVerilogの
taskやfunctionを呼び出すことができます。この機能を使えば、C言語側からBFM内のバスアクセスの
taskを呼び出せます。これで従来のBFMを同じことがC言語を使ってできます。
C言語が使えるので、制御文、関数、インクルール、マクロなどが使えるのがあたりまです。
デバッガも使えてとっても便利です。C言語であれば、S/W屋さんがプログラムを書いてくれるかもしれません。S/W屋さんは、H/W屋さん(特に、検証屋さん)に比べれば遙かに大勢います。
(とはいっても、S/W屋さんも人不足になっているようなので)

どうです。DPI-Cを使ってみようと思いましたか?
DPI-Cについては、SystemVerilogの仕様書を見てください。
また、例題については、googleで「SystemVerilog DPI」で検索しみてください。