2020年1月13日月曜日

Vitis 2019.2でUltra96v2を使ったAcceleration PlatformのEmulation-SW(QEMU)を動かす方法


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 &ltVIVADO_PROJECT_TOP>
write_hw_platform -include_bit ultra96v2_min.xsa
validate_hw_platform ultra96v2_min.xsa

・SWコンポーネントの作成

以下の通りpetalinuxプロジェクトを作成します。
$ cd &ltVIVADO_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 &ltVITIS_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フォルダに保存します。 &ltyour_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のライブラリ追加したりしたけど状況は変わらなかったので、ツールのバージョン上がるまでとりあえず保留にする。

4 件のコメント:

  1. Hello Akira,

    Great tutorials.

    I run in the same issue,"xsim/libdpi.so: undefined symbol: _ZTI14remoteport_tlm" when I tried Emulation-HW.
    I am also using the Ultra96v2 and Vitis 2019.2.

    Did you find any solution for this?

    Thank you for tutorials.

    Best regards,
    Danijela

    返信削除
  2. Hi Danijela.
    Sorry, I couldn't succeed Emulation-HW in Vitis 2019.2.
    It's Just Idea and I do not tried, the write_hw_platform with -include_emulation option in Vivado 2019.2 would help you. (or use vivado 2020.1 would be better, I'm trying it now but emulation-HW on QEMU doesn't run)

    返信削除
  3. Thank you very much for your response.
    I was trying to fix this for more than 20 days. Unfortunately, I must stay with 2019.2.

    返信削除
    返信
    1. Perhaps below command generates hw emulation related files into ultra96v2_min.xsa.

      write_hw_platform -include_bit -include_emulation ultra96v2_min.xsa

      I deleted Vitis 2019.2 so I couldn't confirm that result.

      I couldn't run QEMU in Vitis 2020.1 Emulation-HW.(and I think it is same in 2019.2, even if you solve the problem)

      I think there is nothing else to do than to make do with emulation-SW and running it on hardware.

      削除