SystemVerilog DPI (ダイレクト プログラミング インターフェイス) は、 SystemVerilogと外国語とのインターフェイスとして使用できるインターフェイスです。これらの外国語には、 C、C++ 、SystemC などがあります。DPI は、SystemVerilog レイヤーと外国語レイヤーの 2 つのレイヤーで構成されています。両方のレイヤーは互いに分離されています。
説明
ダイレクト プログラミング インターフェイス ( DPI ) を使用すると、SystemVerilog と外部言語の間で直接言語間関数呼び出しを行うことができます。外部言語で実装された関数は SystemVerilog から呼び出すことができ、このような関数はインポート関数と呼ばれます。同様に、SystemVerilog で実装された関数は外部言語 ( C/C++ または System C )から呼び出すことができ、このような関数はエクスポート関数と呼ばれます。DPI を使用すると、関数の引数と戻り値を通じて 2 つのドメイン間でデータを転送できます。
関数のインポートとエクスポート
1) 関数のインポート: 外国語で実装された関数は、 SystemVerilogにインポートすることで使用できます。SystemVerilog で使用される外国語関数は、インポートされた関数と呼ばれます。
インポートされた関数とタスクのプロパティ
- インポートされた関数は即座に実行を完了し、シミュレーション時間はゼロになります。インポートされたタスクは時間を消費する場合があります。
- インポートされた関数には、入力、出力、および inout 引数を指定できます。
- 正式な入力引数は変更してはなりません。関数内でそのような引数が変更された場合、その変更は関数の外部では見えません。
- インポートされた関数は、正式な出力引数の初期値を想定してはなりません。出力引数の初期値は未定であり、実装に依存します。
- インポートされた関数は、正式な inout 引数の初期値にアクセスできます。インポートされた関数が正式な inout 引数に対して行った変更は、関数の外部から参照できます。
- インポートされた関数は、SystemVerilog コードによって割り当てられたメモリを解放してはならず、また、SystemVerilogコードが外部コードまたは (外部コンパイラ) によって割り当てられたメモリを解放することを期待してはなりません。
- インポートされたタスクを呼び出すと、現在実行中のスレッドが中断されることがあります。これは、インポートされたタスクがエクスポートされたタスクを呼び出し、エクスポートされたタスクが遅延制御、イベント制御、または待機ステートメントを実行した場合に発生します。したがって、インポートされたタスクが複数の実行スレッドで同時にアクティブになる可能性があります。
- インポートされた関数またはタスクには、純粋またはコンテキストと呼ばれる特別なプロパティを装備できます。
純粋およびコンテキストタスクと関数
純粋関数
結果が副作用を伴わず入力引数の値のみに依存する関数は、純粋関数と呼ばれます。
純粋関数の性質
- 出力または入出力引数のない非 Void 関数のみを Pure 関数として呼び出すことができます。
- Pure として指定された関数には副作用がなく、その結果は入力引数の値のみに依存する必要があります。
- Pure 関数呼び出しは、その結果が必要ない場合、または入力引数の同じ値の結果を再計算せずに再利用できる場合には、安全に削除できます。
- 純粋関数は、直接的または間接的に次の操作を実行しないと想定されます。
- 任意のファイル操作を実行します。
- 環境変数、共有メモリ、ソケットなどへの読み取りまたは書き込み。
- グローバル変数や静的変数などの永続データにアクセスします。
- インポートされたタスクを Pure として宣言することはできません。
コンテキストタスクと機能
「エクスポートされた」タスクまたは関数を呼び出したり、実際の引数以外の SystemVerilog データ オブジェクトにアクセスしたりするインポートされたタスクまたは関数は、コンテキスト タスクまたは関数と呼ばれます。
コンテキストタスクと関数のプロパティ
1) コンテキスト インポート タスクまたは関数は、(PLI/VPI) を呼び出すか、エクスポート タスクまたは関数を呼び出すことによって、任意の SystemVerilog データ オブジェクトにアクセス (読み取りまたは書き込み) できます。したがって、コンテキスト タスクまたは関数の呼び出しは、SystemVerilog コンパイラの最適化の障壁となります。
輸入申告
" DPI - C "関数 int calc_parity (input int a)をインポートします。
輸出申告
エクスポート"DPI-C" my_cfunction =関数myfunction ;
Unix関数の呼び出し
SystemVerilog コードは、ラッパーを必要とせずに、インポートすることで Unix 関数を直接呼び出すことができます。
DPIの例
SystemVerilog で 'C' 関数を呼び出す
C - コードファイル
#include <stdio.h> #include <stdlib.h>
extern int add () { int a = 10 , b = 20 ; a = a + b ;
printf ( "加算が成功し、結果 = %d \n " , a ); return a ; }
SystemVerilog コードファイル
モジュールtb_dpi ;
import "DPI-C" function int add (); import "DPI-C" function int sleep ( input int secs ); int j ; initial begin $ display ( "SystemVerilog Initial Block に入ります" ); # 20 j = add (); $ display ( "J の値 = %d" , j ); $ display ( "Unix 関数で 3 秒間スリープします" ); sleep ( 3 ); $ display ( "SystemVerilog Initial Block を終了します" ); # 5 $ Finish ; end endmodule
参考文献
- Gopi Krishna (2005-11-09)。「SystemVerilog DPI チュートリアル」。
- Project VeriPage の SystemVerilog DPI チュートリアル
