前に書いたのがVivado 2017.2版だったのでVivado 2018.2で良いこと起こってないか確認してみました。
でも、特に変わってなかった・・・
Vivado 2018.2のDPI-Cの対応状況はユーザーガイド(UG900)の「Vivadoシミュレータのダイレクトプログラミングインターフェイス(DPI)」を参照して下さい。
DPI-Cを使用するにはxscコンパイラを使用し、xscがclang、GNUリンカを呼び出しコンパイルすることができます。
ユーザーガイド(UG900)の「付録B:Vivado シミュレータのSystemVerilogサポート」でVivadoのシミュレータがサポートしているSystemVerilogの合成可能なセットの一覧が「表B-1:SystemVerilog 1800-2009の合成可能なセット」として示されています。
また、「表B-2:サポートされるダイナミック タイプ コンストラクト」でシミュレーションでよく使用されるテストベンチの機能の一部がサポートされています。
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
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 |
プロジェクトから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
exportsim/xsimnに生成されたvlog.prjとvhdl.prjのパスが間違えて生成されているので次のように修正します。
修正前 | 修正後 |
---|---|
srcs/srcs | srcs |
"srcs/ip/Zynq7000 | "srcs/ip/Zynq7000/xil_defaultlib |
エクスポート後の実行スクリプトは単にシミュレーションするだけの内容になっているので修正が必要です。
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通信も追加してみました。
writed: 2018/09/20/ 21:09:47