Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Xilinx ZynqMP SoC VIP の中を調べる(その11)

はじめに

Xilinx ZynqMP SoC VIP の中を調べる(その11)

Xilinx xsim で、DPI-C export task を呼び出すためのステップについて説明します。

シミュレーションのためのステップ

DPI-C export task を使わない場合は、zynqmpsoc/zynqmpsoc.sim/sim_1/behav/xsim ディレクトリに移動し、次のステップでシミュレーションをします。

./compile.sh
./elaborate.sh
./simulate.sh

これに対して、DPI-C export task を使ったC言語のテストプログラム (dpi_main関数を含む) test.cpp をどのようにすればいいのか?

それは、elaborate.sh の中で、xelab コマンドに対して、下記のような3つのオプションを追加すればいいです。

-sv_root xsim.dir/work/xsc -sv_lib dpi   --dpiheader dpi.h

最初の -sv_root オプションは、DPI-C の共有ライブラリが存在するパスを指定します。この場合は、カレントディレクトリに対して、xsim.dor/work/xsc ディレクトリです。

2番目の -sv_lib オプションは、DPI-C の共有ライブラリ名( .拡張子、.soを除いた)を指定しています。この場合は、dpi です。ファイル名としては、dpi.so になります。

3番目の --dpiheader オプションは、C言語側で使うヘッダーファイル dpi.h を生成します。この dpi.h は、test.cpp で include します。

上記の3つのコマンドを追加して、elaborate.sh を事項すえうと、次のようなメッセージが表示されます。

./elaborate.sh
xelab --incr --debug typical --relax --mt 8 -L xil_defaultlib -L axi_bram_ctrl_v4_1_6 -L blk_mem_gen_v8_4_5 -L axi_lite_ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_28 -L generic_baseblocks_v2_1_0 -L axi_infrastructure_v1_1_0 -L axi_register_slice_v2_1_26 -L fifo_generator_v13_2_7 -L axi_data_fifo_v2_1_25 -L axi_crossbar_v2_1_27 -L axi_protocol_converter_v2_1_26 -L axi_clock_converter_v2_1_25 -L axi_dwidth_converter_v2_1_26 -L proc_sys_reset_v5_0_13 -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L uvm -L xilinx_vip -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot tb_behav xil_defaultlib.tb xil_defaultlib.glbl -log elaborate.log
Vivado Simulator v2022.1
Copyright 1986-1999, 2001-2022 Xilinx, Inc. All Rights Reserved.
Running: /mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/bin/unwrapped/lnx64.o/xelab --incr --debug typical --relax --mt 8 -L xil_defaultlib -L axi_bram_ctrl_v4_1_6 -L blk_mem_gen_v8_4_5 -L axi_lite_ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_28 -L generic_baseblocks_v2_1_0 -L axi_infrastructure_v1_1_0 -L axi_register_slice_v2_1_26 -L fifo_generator_v13_2_7 -L axi_data_fifo_v2_1_25 -L axi_crossbar_v2_1_27 -L axi_protocol_converter_v2_1_26 -L axi_clock_converter_v2_1_25 -L axi_dwidth_converter_v2_1_26 -L proc_sys_reset_v5_0_13 -L axi_vip_v1_1_12 -L zynq_ultra_ps_e_vip_v1_0_12 -L uvm -L xilinx_vip -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot tb_behav xil_defaultlib.tb xil_defaultlib.glbl -log elaborate.log -sv_root xsim.dir/work/xsc -sv_lib dpi --dpiheader dpi.h
Using 8 slave threads.
WARNING: [XSIM 43-3431] One or more environment variables have been detected which affect the operation of the C compiler. These are typically not set in standard installations and are not tested by Xilinx, however they may be appropriate for your system, so the flow will attempt to continue.  If errors occur, try running xelab with the "-mt off -v 1" switches to see more information from the C compiler. The following environment variables have been detected:
    CPATH
    LIBRARY_PATH
Starting static elaboration
いろいろなメッセージが出ている
...
Compiling module xil_defaultlib.mpsoc_preset_zynq_ultra_ps_e_0_0
Compiling module xil_defaultlib.mpsoc_preset
Compiling module xil_defaultlib.mpsoc_preset_wrapper
Compiling module xil_defaultlib.tb
Compiling module xil_defaultlib.glbl
Could not get the root directory for DPI Library: boost::filesystem::canonical: No such file or directory: "/mnt/c/Users/haray/home/src/vivado/zynqmpsoc/zynqmpsoc.sim/sim_1/behav/xsim/xsim.dir/work/xsc"
ERROR: [XSIM 43-3238] Failed to link the design.

のようにエラーになります。これは、-sv_root で xsim.dir/work/xsc を指定しているためです。これを解決するために、テストプログラムを xsc コマンド (Vivadoの中に入っている C言語関係のフロントエンドコマンド)を使って、test,cpp をコンパイルします。

xsc test.cpp
Multi-threading is on. Using 6 slave threads.
Running compilation flow/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o/../../tps/lnx64/gcc-6.2.0/bin/g++  -fPIC -c -Wa,-W -fPIC -m64 -B/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o/../../tps/lnx64/gcc-6.2.0/bin/../../binutils-2.37/bin/    -I"/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/data/xsim/include" -I"/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/data/xsim/systemc" "test.cpp" -o "xsim.dir/work/xsc/test.lnx64.o" -DXILINX_SIMULATOR -Wno-deprecated-declarations
Done compilationGCC Decoupling - Adding extra -std=c++11 -L switchs to link line
Linking with command:
/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o/../../tps/lnx64/gcc-6.2.0/bin/g++ -Wa,-W  -O -fPIC  -m64  -shared  -o "xsim.dir/work/xsc/dpi.so" "xsim.dir/work/xsc/test.lnx64.o"     -L/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o -lrdi_simulator_kernel  -lrdi_xsim_systemc -std=c++11 -L/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o/Default  -B/mnt/usb/XILINX/Vivado/2022.1/Vivado/2022.1/lib/lnx64.o/../../tps/lnx64/gcc-6.2.0/bin/../../binutils-2.37/bin/

Done linking: "xsim.dir/work/xsc/dpi.so"

xsim..dir/work/xsc ディレクトリに、

  • dpi.so
  • test.lnx64.o

が生成されます。再度、elaborate.sh を実行してみましょう!今度は、snapshot tb_behav が正しく生成されたようです。

Compiling module xil_defaultlib.mpsoc_preset_zynq_ultra_ps_e_0_0
Compiling module xil_defaultlib.mpsoc_preset
Compiling module xil_defaultlib.mpsoc_preset_wrapper
Compiling module xil_defaultlib.tb
Built simulation snapshot tb_behav

おわりに

今回は、DPI-C export task を利用したシミュレーションをするためのステップをみてみました。

次回は、xelab コマンドによって生成された dpi.h をみてみます。