Verilog手続き型インターフェース(VPI)は、元々PLI 2.0として知られており、主にC プログラミング言語を対象としたインターフェースです。これにより、VerilogのビヘイビアコードからC関数を呼び出したり、C関数から標準のVerilogシステムタスクを呼び出すことができます。Verilog手続き型インターフェースは、IEEE 1364プログラミング言語インターフェース規格の一部であり、この規格の最新版は2005年のものです。VPIは、廃止された プログラム言語インターフェース(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コードを考えてみましょう。
val = 41;
$increment(val);
$display("After $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 Xplore
Verilog VPIインターフェースのソース
- C++用ティール
- JOVE(Java用)
- Ruby-VPI(Ruby用)
- ScriptEDA(Perl、Python、Tcl用)
- Cocotb [1]、Python用
- OrigenSim(Ruby用)
外部リンク
- Verilog PLI入門
- Verilog VPIチュートリアル