LoginSignup
1
1

More than 5 years have passed since last update.

ModelSimASE+clangでSystemVerilog DPI-Cをシミュレーションする

Last updated at Posted at 2013-12-07

こんにちわ@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で表示するだけのコード

hoge.sv
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
hoge.c
#include <stdio.h>
#include "svdpi.h"

void c_func_hello(int in_dat) {
   printf("Hello DPI-C input = %d\n",in_dat);
}

Makefile

折角なのでビルドからシミュレーション実行までできる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が使えれば一行で済む話  
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1