Vitis 2019.2でUltra96v2のAcceleration PlatforのEmulation-SWをQEMUで実行する方法について記載します。
前回の記事はメモ書きだったので整理する意味でもう一度手順を通し、その結果をここに記載します。
動作確認などの際に参考にさせてもらっていたのはFixstarsさんの
こちらの記事です。フォルダ構成などはこちらに準じています。注意点はほぼ共通で、zynqで動作させる場合にも参考となります。以下ではultra96v2対応の際の特有の注意事項について記載しています。
また、実機での動作にはpetalinuxプロジェクト作成の際にBSPからdevice-tree情報などを取得する必要があるかと思いますので今後調べることとします。
・環境
実行環境は次の通りです。
OS:Ubuntu 18.04.03 LTS
メモリ:16GB
ツール:Vitis 2019.2, Vivado 2019.2, petalinux 2019.2, xrt-2019.2
対象:Ultra96v2
まずは以下のようにして環境変数を設定します。
$ source <VIVADO_ROOT>/settings64.sh
$ source <VITIS_ROOT>/settings64.sh
$ source <PETALINUX_ROOT>/settings.sh
$ source <XRT_ROOT>/setup.sh
・HWコンポーネントの作成
基本は
Vitis Application Acceleration Development (UG1393)のSection IXの通りに進めます。ただし、
board fileはultra96v2を使用し、GEM3をEMIOで出力する設定を追加します。注意点などは前述のFixstarsさんの記事同様なのでそちらをご覧ください。
最後に以下のスクリプト動作させてHWコンポーネントの作成は終了です。
cd <VIVADO_PROJECT_TOP>
write_hw_platform -include_bit ultra96v2_min.xsa
validate_hw_platform ultra96v2_min.xsa
・SWコンポーネントの作成
以下の通りpetalinuxプロジェクトを作成します。
$ cd <VIVADO_PROJECT_TOP>
$ petalinux-create -t project --template zynqMP -n petalinux
$ cd petalinux
$ petalinux-config --get-hw-description=../vivado
作成後の設定ではuartとしてpsu_uart_1を選択します。
他の設定はデフォルトのままで大丈夫でした。
MACHINE_NAMEはtemplateのままとしておきます。
Exit -> Saveした後はUG1393の通り、petalinux/project-spec/meta-user/conf/user-rootfsconfigに以下の設定を追加します。
CONFIG_xrt
CONFIG_xrt-dev
CONFIG_zocl
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv
同様にproject-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsiの末尾にも以下のコードを追加します。
&amba {
zyxclmm_drm {
compatible = "xlnx,zocl";
status = "okay";
};
};
その後はpetalinux-config -c rootfsで追加したCONFIG_xxxを有効にします。
Vitis上でSDのマウントが適切な位置に行われるようにfstabを編集しておきます。
Vitis側の設定変更でもいいかもしれませんが、下手に変更してうまくいかないのは嫌なので、fstab側を編集しています。
$ mkdir -p project-spec/meta-user/recipes-core/base-files
$ vi project-spec/meta-user/recipes-core/base-files/base-files_%.bbappend
===== base-ffiles_%.bbappend =====
dirs755 += "/mnt"
do_install_append() {
cat >> ${D}${sysconfdir}/fstab <<EOF
# Generated from my_bbappend
/dev/mmcblk0p1 /mnt auto defaults,sync,noauto 0 0
EOF
}
後はpetalinux-buildとしてください。
build終了後は続けて念の為の動作確認をします。
sdイメージとpmu_rom_qemu_sha3.elfが必要です。
sdイメージは好きな方法で用意すれば大丈夫です。
ug1169 のCh.6 Using Boot Image on QEMUを参考にすれば用意できるはずです。
私はdd/losetup/fdisk/mkfs/mount/cpコマンドを用いて作成しました。
pmu_rom_qemu_sha3.elfはQEMU起動時のオプションで直接パスを指定しても問題ないと思いますが、
VitisのEmulation用のデータをpre-builtフォルダに配置しておきます。
$ mkdir -p pre-built/linux/images
$ cp <VITIS_INSTALL_PATH>/data/emulation/dtbs/zynqmp/pmu_rom_qemu_sha3.elf ./pre-built/linux/images/
petalinux-bootで動作を確認しておきます。
$ petalinux-boot --qemu --u-boot --qemu-args "-drive file=myfile/sd.img,if=sd,id=sd0,index=0"
〜中略〜
petalinux login:
root/rootでログインできるので、ログインしてfstabの変更が反映されているかチェックしておきます。
その後はcd images/linuxとpetalinux-build --sdkを行い、./sdk.sh でpfmフォルダにデータ展開します。
ここまででSWコンポーネントの作成は完了です。
余談ですが、SDブートの場合はSD1にSD0と同じイメージをid,indexを変更して起動すればとりあえずQEMUで起動することは可能です。
(Wifiとの兼ね合いはどうなるかよくわかりませんが)
これで準備は完了です。
Vitisプラットフォームの作成
ここもチュートリアル通り進めれば大丈夫です。
QEMUを使用する場合はbootフォルダに次のファイルをコピーしてください。
- image.ub
- zynqmp_fsbl.elf
- pmufw.elf
- bl31.elf
- u-boot.elf
- system.dtb
- zynqmp_qemu-arm.dtb
- zynqmp-qemu-multiarch-arm.dtb
- zynqmp-qemu-multiarch-pmu.dtb
またbootフォルダに保存するlinux.bifは以下のとおりです。こちらもチュートリアルどおりです。
/* linux */
the_ROM_image:
{
[fsbl_config] a53_x64
[bootloader] <zynqmp_fsbl.elf>
[pmufw_image] <pmufw.elf>
[destination_device=pl] <bitstream>
[destination_cpu=a53-0, exception_level=el-3, trustzone] <bl31.elf>
[destination_cpu=a53-0, exception_level=el-2] <u-boot.elf>
}
qemu_args.txtを以下の通り作成し、qemuフォルダに保存します。
<your_sd_image_path>/sd.imgでは先程petalinux-bootで動作確認した際に使用したsd.imgを指定してください。
-M arm-generic-fdt
-serial /dev/null -serial mon:stdio
-display none
-device loader,file=<bl31.elf>,cpu-num=0
-device loader,file=<u-boot.elf>
-dtb <system.dtb>
-net nic -net nic -net nic -net nic,netdev=eth0 -netdev user,id=eth0
-drive file=your_sd_image_path/sd.img,if=sd,id=sd0,format=raw,index=0
-boot mode=3
-global xlnx,zynqmp-boot.cpu-num=0
-global xlnx,zynqmp-boot.use-pmufw=true
-m 4G
pmu_args.txtも以下の通り作成し、qemu_args.txt同様にqemuフォルダに保存します。
-M microblaze-fdt
-serial /dev/null -serial mon:stdio
-display none
-device loader,file=<pmufw.elf>
-device loader,addr=0xfd1a0074,data=0x1011003,data-len=4
-device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4
vitisを立ち上げてplatformの設定で以下の通り設定します。
- BIF File: <PROJECT_TOP>/pfm/boot/linux.bif
- BOOT Components Directory: <PROJECT_TOP>/pfm/boot
- Linux Image Directory: <PROJECT_TOP>/pfm/boot
- Sysroot Directory: <PROJECT_TOP>/pfm/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi
- QEMU Data: <PROJECT_TOP>/pfm/boot
- QEMU Arguments: <PROJECT_TOP>/pfm/qemu/qemu_args.txt
- PMU QEMU Arguments: <PROJECT_TOP>/pfm/qemu/pmu_args.txt
platformのビルドと、アプリケーションの作成(今回はvector addition)、ビルドを行います。
その後はEmulation-SW=>Run=>Launch ON Emulatorとして実行します。
最終結果はこちら。原因は不明ですがたまに途中で止まったままになったりします。
最後に
簡単なアプリケーションなら実はLaunch On Hardwareで十分確認できるので実はそこまで頑張らなくても良かったのかもと思いましたが、せっかくなので公開。
あと、SDブートの場合は現状コマンドラインから実行する必要ありそうなので、こちらも確認する予定。
おまけ、Emulation-HWの場合。(諦めた)
エラーメッセージは以下。
xsim.dir/design_1_wrapper_behav/xsimk: symbol lookup error: <PROJECT_TOP>/pfm/wksp1/vecadd/Emulation-HW/_vimage/rundir/behav_waveform/xsim/libdpi.so: undefined symbol: _ZTI14remoteport_tlm
ここと同じ問題が発生しているよう。
Zyboの場合も似たような状況なのでZynq系ではEmulatioo-HWのLaunch on Emulatorは何か不足していて動かないのかも。
Alveoを使った
Vitisチュートリアルでは問題なく動作したので、Cosim環境やその他ツールの問題ではなさそう。
(VitisチュートリアルのPlatformに今回作成したUltra96v2のCustom Platformを指定すると同じエラーが発生した)
SystemCのライブラリ追加したりしたけど状況は変わらなかったので、ツールのバージョン上がるまでとりあえず保留にする。