コード
次のファイルがあるとします。
- C 関数を含むファイル 2 つ
- 次の関数を使用する SystenVerilog ファイル:
- function1.c
- function2.c
- file.sv
function1.c
#include "svdpi.h"
DPI_DLLESPEC
int myFunction1()
{
return 5;
}
function2.c
#include <svdpi.h>
DPI_DLLESPEC
int myFunction2()
{
return 10;
}
file.sv
module m();
import "DPI-C" pure function int myFunction1 ();
import "DPI-C" pure function int myFunction2 ();
integer i, j;
initial
begin
#1;
i = myFunction1();
j = myFunction2();
$display(i, j);
if( i == 5 && j == 10)
$display("PASSED");
else
$display("FAILED");
end
endmodule
使用法
次に、C ファイルをコンパイルして Vivado シミュレータにリンクする方法を示します。
1 段階フロー (最も簡単なフロー)
xsc function1.c function2.c
xelab -svlog file.sv -sv_lib dpi
フローの説明:
xsc コンパイラで C コードをコンパイルしてリンクし、共有ライブラリ (xsim.dir/xsc/dpi.so) を作成して、xelab でこの共有ライブラリを -sv_lib
オプションを使用して参照します。
2 段階フロー
xsc -compile function1.c function2.c -work abc
xsc -shared/-shared_systemc abc/function1.lnx64.o abc/function2.lnx64.o -work abc
xelab -svlog file.sv -sv_root abc -sv_lib dpi -R
フローの説明:
- 2 つの C ファイルを作業ディレクトリ (abc) で該当するオブジェクト コードにコンパイルします。
- これらの 2 つのファイルをリンクして共有ライブラリ (dpi.so) を作成します。
-
-sv_root
オプションを使用して、このライブラリが作業ディレクトリ (abc) から検索されるようにします。ヒント:-sv_root
には、-sv_lib
オプションで指定された共有ライブラリを検索するディレクトリを指定します。Linux では、-sv_root
が指定されておらず、DPI ライブラリの名前に接頭辞lib
と接尾辞 .so が付いている場合、共有ライブラリのディレクトリ パスには LD_LIBRARY_PATH 環境変数が使用されます。
2 段階フロー (上記よりもさらにオプションを追加)
xsc -compile function1.c function2.c -work "abc" -v 1
xsc -shared/-shared_systemc "abc/function1.lnx64.o" "abc/function2.lnx64.o" -work "abc" -o final -v 1
xelab -svlog file.sv -sv_root "abc" -sv_lib final -R
フローの説明:
ユーザーがコンパイルおよびリンクを実行する場合は、-verbose
オプションを使用すると、コンパイラが起動されたパスおよびオプションを確認できます。これらはこの後必要に合わせて調整できます。上記の例の場合、final
という共有ライブラリが作成されます。この例では、ファイル パスのスペースがどのように処理されるかも示しています。