Verilog Procedural Interface ( VPI ) は、元々PLI 2.0として知られていた、主にC プログラミング言語を対象としたインターフェースです。Verilogのビヘイビアコードから C 関数を呼び出すこと、また C 関数から標準の Verilog システムタスクを呼び出すことを可能にします。Verilog Procedural Interface は、 IEEE 1364プログラミング言語インターフェース規格の一部であり、この規格の最新版は 2005 年版です。VPI は、廃止された Program Language Interface (PLI)に代わるものであるため、PLI 2 と呼ばれることもあります。
PLI 1 は VPI (別名 PLI 2) に取って代わられて非推奨となりましたが、多くの Verilog リファレンス ブックで説明されている tf_put、tf_get 関数インターフェイスがはるかに広く文書化されているため、PLI 1 は今でも VPI よりもよく使用されています。
C++の使用
C++ は、C++ コンパイラに組み込まれている「extern C/C++」キーワードを使用して、VPI (PLI 2.0) および PLI 1.0 と統合できます。
例
例として、次の Verilog コード フラグメントを考えてみましょう。
値 = 41;
$increment(val);
$display("$increment後、val=%d", val);
システムタスクが最初のパラメータを1ずつ増加させるとしますincrement。C言語とVPIメカニズムを使用すると、このincrementタスクは次のように実装できます。
// 増分システムタスクを実装します
static PLI_INT32 increment ( PLI_BYTE8 * userdata ) { vpiHandle systfref , args_iter , argh ; s_vpi_value argval ; int value ;
// 引数リストへのハンドルを取得します。
systfref = vpi_handle ( vpiSysTfCall , NULL ); args_iter = vpi_iterate ( vpiArgument , systfref );
// 最初の引数の値を取得します。argh = vpi_scan ( args_iter ) ; argval.format = vpiIntVal ; vpi_get_value ( argh , & argval ); value = argval.value.integer ; vpi_printf ( "VPI ルーチンが %d を受信しました\ n " , value ) ;
// 値を増やして最初の引数に戻します
argval . value . integer = value + 1 ; vpi_put_value ( argh , & argval , NULL , vpiNoDelay );
// クリーンアップして
vpi_free_object ( args_iter )を返します。0を返します。}
また、このシステムタスクを登録する関数も必要です。この関数は、外部から参照可能なvlog_startup_routines[]配列に配置されると、参照の展開や解決の前に呼び出されます。
// 増分システムタスクを登録します
void register_increment ( void ) { s_vpi_systf_data data = { /* type */ vpiSysTask 、/* sysfunctype */ vpiSysTask 、/* tfname */ "$increment" 、/* calltf */ increment 、/* compiletf */ NULL 、/* sizetf */ NULL 、/* user_data */ NULL };
vpi_register_systf ( &データ);
}
// 起動時に呼び出す必要がある関数のゼロ終了リストが含まれています
void ( * vlog_startup_routines [])( void ) = { register_increment , NULL };
Cコードは、Verilogシミュレータで使用される共有オブジェクトにコンパイルされます。前述のVerilogコードをシミュレーションすると、以下の出力が得られます。
VPIルーチンは41を受け取った $increment後、val=42
参照
出典
- IEEEエクスプローラ
Verilog VPIインターフェースのソース
- ティール( C++用)
- JOVE(Java用)
- Ruby-VPI(Ruby用)
- ScriptEDA(Perl、Python、Tcl用)
- Cocotb [1]、Python用
- OrigenSim(Ruby用)
外部リンク
- Verilog PLI入門
- Verilog VPIチュートリアル