こんにちわ@ginnyu_teiです。
今更ですがModelSimASEで初めてDPI-Cを動かしたので投稿します。
有償の(お高い)RTLシミュレータは大体以下のコマンドでDPI-Cが使えます。
<シミュレータコマンド> <+svとか-sverilog必要だったり不要だったり> hoge.sv hoge.c
ModelSimもお金を出せばシミュレータコマンドとしてqverilogが使えます。
しかしAlteraStarterEdition(以下ASE)にはqverilogコマンドが実装されていないので
面倒ですがvlib、vlog、vsimを使います。
(Linuxではqverilogのシンボリックだけはあったのでコマンド補完で出てきますがリンク先がなくなってます。)
テスト環境
gccの代わりにclangが使えるか試したかったのでLinuxにしました。
- VMWare + Fedora 64bit
- ModelSimASE 10.1d
##ソースコード
シンプルにSV上から値を渡してCで表示するだけのコード
module hoge();
import "DPI-C" function void c_func_hello(int in_dat);
int i;
initial
i = 32'd100;
initial begin
#1;
c_func_hello(i);
end
endmodule
#include <stdio.h>
#include "svdpi.h"
void c_func_hello(int in_dat) {
printf("Hello DPI-C input = %d\n",in_dat);
}
Makefile
折角なのでビルドからシミュレーション実行までできるMakefileを作りました。
#Source
SV_FILE = hoge.sv
TOP_NAME = hoge
SRC = hoge.c
DPI_OBJ = svdpi
#Tool
MODELSIM_HOME = /mnt/sdb1/altera/13.1/modelsim_ase/
VLIB = vlib
VLOG = vlog
VSIM = vsim
#CC = gcc
CC = clang
OBJ = $(SRC:%.c=%.o)
run : vlib vlog vsim
vlib:
$(VLIB) work
vlog:
$(VLOG) -sv -dpiheader dpiheader.h $(SV_FILE)
vsim: $(DPI_OBJ).so
$(VSIM) -c -sv_lib $(DPI_OBJ) $(TOP_NAME) -do "run -all; quit -f"
.c.o:
$(CC) -c -fpic -m32 -I$(MODELSIM_HOME)/include $<
$(DPI_OBJ).so :$(OBJ)
$(CC) -shared -m32 $(OBJ) -o $(DPI_OBJ).so
clean:
rm -rf work dpi.so $(DPI_OBJ).so $(OBJ) transcript *.wlf dpiheader.h
64bitLinuxを使っている場合はclangのオプションに-m32
が必要です。
何故ならModelSimASEは32bitモードしか対応していないので
ライブラリも32bitにしなければならないからです。
ちなみに64bitLinux上で-m32
を付けないと下記の様なエラーになります。
# vsim -do {run -all; quit -f} -c -sv_lib svdpi hoge
# Loading sv_std.std
# Loading work.hoge
# Loading ./svdpi.so
# ** Error: (vsim-125) The shared library ./svdpi.so being loaded was built on a 64-bit machine. A 64-bit shared library cannot be loaded in a 32-bit simulation. Please use compatible machines to build and load the library
# ** Error: (vsim-3197) Load of "./svdpi.so" failed: ./svdpi.so: wrong ELF class: ELFCLASS64.
# ** Fatal: (vsim-3748) Failed to load DPI object file "./svdpi.so" while trying to resolve 'c_func_hello'.
# FATAL ERROR while loading design
# Error loading design
Error loading design
##シミュレーション
make
を実行するだけの簡単操作
[ginnyu-tei@localhost svdpi_test]$ make
vlib work
vlog -sv -dpiheader dpiheader.h hoge.sv
Model Technology ModelSim ALTERA vlog 10.1d Compiler 2012.11 Nov 2 2012
-- Compiling module hoge
Top level modules:
hoge
clang -c -fpic -m32 -I/mnt/sdb1/altera/13.1/modelsim_ase//include hoge.c
clang -shared -m32 hoge.o -o svdpi.so
vsim -c -sv_lib svdpi hoge -do "run -all; quit -f"
Reading /mnt/sdb1/altera/13.1/modelsim_ase/tcl/vsim/pref.tcl
# 10.1d
# vsim -do {run -all; quit -f} -c -sv_lib svdpi hoge
# Loading sv_std.std
# Loading work.hoge
# Loading ./svdpi.so
# run -all
# Hello DPI-C input = 100
# quit -f
まとめ
- clangでもDPI-Cは使える
- ModelSimASEは32bitモードのみ
- そもそもqverilogが使えれば一行で済む話