http://verilog.blog.shinobi.jp/verilog/-verilog-%20modelsim%E3%81%A7dpi%E3%82%92%E4%BD%BF%E3%81%86[Verilog] ModelSimでDPIを使う
ほとんどModelSimのユーザーマニュアルに書かれている例そのままですが、ModelSimでSystemVerilogのDPIを使用する例です。
Cのソースコード(
hello_c.c)を用意します。
この例では、
Hello from c_task()と表示した後、Verilog内で定義されているタスク
verilog_taskを呼び出します。
最後に、渡された変数iの値を2倍にします。
ヘッダーファイルのうち、
svdpi.hはModelSimに付属しています。
dpiheader.hは
vlogコマンドで作成します。
#include "svdpi.h"
#include "dpiheader.h"
int c_task(int i, int *o) {
printf("Hello from c_task()\n");
verilog_task(i, o);
*o = 2 * i;
return (0);
}
Verilogのソースコード(
hello_top.v)です。
export "DPI-C"宣言で、タスク
verilog_taskがC言語から呼び出せるようにエクスポートしています。
import "DPI-C"宣言で、先ほど
hello_c.cで宣言した関数
c_taskを呼び出せるようにしています。
module hello_top;
int ret;
export "DPI-C" task verilog_task;
task verilog_task(input int i, output int o);
#10;
$display("Hello from verilog_task()");
endtask // verilog_task
import "DPI-C" context task c_task(input int i, output int o);
initial begin
c_task(1, ret);
$display("ret=%d", ret);
end
endmodule // hello_top
コンパイルとリンクの手順は下記のとおりです。
$(MODELSIM)は、ModelSimをインストールしたディレクトリです。
- vlog -sv -dpiheader dpiheader.h hello.v
- vsim -dpiexportobj exportobj hello_top
- gcc -c -I $(MODELSIM)/include hello_c.c
- gcc -shared -Bsymbolic -o hello_c.dll hello_c.o exportobj.obj -L $(MODELSIM)win32aloem -lmtipli
- vsim -c -sv_lib hello_c -do "run -all; quit" hello_top
実行すると下記のように表示されます。。
# Hello from c_task()
# Hello from verilog_task()
# ret= 2
[1回]
PR