Vivado 2018.2でDPI-C

前に書いたのがVivado 2017.2版だったのでVivado 2018.2で良いこと起こってないか確認してみました。

でも、特に変わってなかった・・・

参照

Vivado 2018.2のDPI-C

 Vivado 2018.2のDPI-Cの対応状況はユーザーガイド(UG900)の「Vivadoシミュレータのダイレクトプログラミングインターフェイス(DPI)」を参照して下さい。

 DPI-Cを使用するにはxscコンパイラを使用し、xscがclang、GNUリンカを呼び出しコンパイルすることができます。

SystemVerilogの合成可能なセット

 ユーザーガイド(UG900)の「付録B:Vivado シミュレータのSystemVerilogサポート」でVivadoのシミュレータがサポートしているSystemVerilogの合成可能なセットの一覧が「表B-1:SystemVerilog 1800-2009の合成可能なセット」として示されています。

 また、「表B-2:サポートされるダイナミック タイプ コンストラクト」でシミュレーションでよく使用されるテストベンチの機能の一部がサポートされています。

xsc

xscはシミュレーションで使用するCソースコードをコンパイルするコンパイラです。

一撃コンパイル

$ xsc function.c
$ xelab -svlog file.sv -sv_lib dpi

二段階コンパイル

$ xsc -compile function.c -work sample
$ xsc -link sample/function.lnx64.o -work sample

CとSysnemVerilogの境界で使用可能なデータ型

SystemVerilog C 備考
byte char
shortint short int
int int
longint long long
real double
shortreal float
chandle void *
string const char *
bit unsigned char sv_0、sv_1

svdpi.hを使用した場合で使用可能なデータ型

SystemVerilog C 備考
logic、reg unsigned char sv_0、sv_1、sv_z、sv_x
bitの配列(パック型) svBitVecVal svdpi.hで定義
logic/regの配列(パック型) svLogicVecVal svdpi.hで定義
enum enum
パック型struct、union 配列として渡される
bit、logicのアンパック型配列 配列として渡される
アンパック型struct structとして渡される
アンパック型unions structとして渡される
配列を開く svOpenArrayHandle

シミュレーション環境の生成

export_ip_user_files

 プロジェクトからIP/IP Integraterファイルを生成及びエクスポートします。

export_ip_user_files -of_objects [get_files ./Zynq7000.srcs/sources_1/bd/Zynq7000/Zynq7000.bd] -no_script -force -quiet

シミュレーション環境のエクスポート

 ターゲットシミュレータのシミュレーションスクリプトをエクスポートします。

export_simulation  -export_source_files -force -directory "../exportsim" -simulator xsim  -ip_user_files_dir "./Zynq7000.ip_user_files" -ipstatic_source_dir "./Zynq7000.ip_user_files/ipstatic" -use_ip_compiled_libs

vlog.prj、vhdl.prjの修正

exportsim/xsimnに生成されたvlog.prjとvhdl.prjのパスが間違えて生成されているので次のように修正します。

修正前 修正後
srcs/srcs srcs
"srcs/ip/Zynq7000 "srcs/ip/Zynq7000/xil_defaultlib

tb_Zynq7000.shへ追加

エクスポート後の実行スクリプトは単にシミュレーションするだけの内容になっているので修正が必要です。

修正前

elaborate()
{
  xelab --relax --debug typical --mt auto -L axi_lite_ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_19 -L xil_defaultlib -L proc_sys_reset_v5_0_12 -L axi_infrastructure_v1_1_0 -L smartconnect_v1_0 -L axi_protocol_checker_v2_0_3 -L axi_vip_v1_1_3 -L processing_system7_vip_v1_0_5 -L xlconstant_v1_1_5 -L xlconcat_v2_1_1 -L xilinx_vip -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot tb_Zynq7000 xil_defaultlib.tb_Zynq7000 xil_defaultlib.glbl -log elaborate.log
}

修正後

elaborate()
{
  cp ../../function.c .
  cp ../../socket.c .
  xsc function.c socket.c
  xelab -sv_lib dpi -dpiheader dpi.h --relax --debug typical --mt auto -L axi_lite_ipif_v3_0_4 -L lib_cdc_v1_0_2 -L interrupt_control_v3_1_4 -L axi_gpio_v2_0_19 -L xil_defaultlib -L proc_sys_reset_v5_0_12 -L axi_infrastructure_v1_1_0 -L smartconnect_v1_0 -L axi_protocol_checker_v2_0_3 -L axi_vip_v1_1_3 -L processing_system7_vip_v1_0_5 -L xlconstant_v1_1_5 -L xlconcat_v2_1_1 -L xilinx_vip -L unisims_ver -L unimacro_ver -L secureip -L xpm --snapshot tb_Zynq7000 xil_defaultlib.tb_Zynq7000 xil_defaultlib.glbl -log elaborate.log
}

実行

$ ./tb_Zynq7000.sh

プロジェクトデータ

github置いてます。

今回はsocket通信も追加してみました。

write: 2018/09/20/ 21:09:47