ラベル acceleration platform の投稿を表示しています。 すべての投稿を表示
ラベル acceleration platform の投稿を表示しています。 すべての投稿を表示

2020年12月4日金曜日

ultra96v2のembedded acceleration platformをvitis2020.2で作成してみた話その2

ultra96v2のembedded platformをvitis 2020.2で作成した話。 VitisのVecaddを動かすまで。 前回の続き。

準備

vitisで使用するlinux_bifとqemu_args.txtとpmu_args.txtを準備する。

cd <work-dir-path>
mkdir vitis_args

vitis_argsにlinux.bifとqemu_args.txtとpmu_args.txtを保存する。内容は以下の通り。

  • linux.bif
/* linux */
the_ROM_image:
{
    [fsbl_config] a53_x64
    [bootloader] <fsbl-ultra96v2-zynqmp.elf>
    [destination_device=pl] <bitstream>
    [pmufw_image] <pmu-firmware-ultra96v2-zynqmp.elf>
    [destination_cpu=a53-0, exception_level=el-3, trustzone] <arm-trusted-firmware.elf>
    [load=0x100000] <system.dtb>
    [destination_cpu=a53-0, exception_level=el-2] <u-boot.elf>
}
  • qemu_args.txt
    system.dtbは2020.1からBOOT.binで書き込むようにしている模様。
    ##work-dir-path##は環境に合わせて置き換えてください。
-M arm-generic-fdt
-net nic -net nic -net nic
-serial /dev/null -serial mon:stdio
-display none
-device loader,file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf,cpu-num=0
-device loader,file=<u-boot.elf>
-device loader,file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb,addr=0x100000
-drive file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.wic.qemu-sd,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
    ##work-dir-path##は環境に合わせて置き換えてください。
-M microblaze-fdt
-serial /dev/null -serial /dev/null
-display none
-device loader,file=##work-dir-path##/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-ultra96v2-zynqmp.elf
-device loader,addr=0xfd1a0074,data=0x1011003,data-len=4
-device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4

Platformの作成

ここを参考にplatformを作成していく。 日本語ならこちら。

export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
source <path-to-vitis-installation>/2020.2/settings64.sh
cd <work-dir-path>
mkdir vitis_pfm
cd vitis_pfm
mkdir wksp1
vitis -workspace wksp1

create platformを行い、platform名はultra96v2-platform、xsaは/xsa_dir/ultra96v2_4z/ultra96v2_4z.xsaを指定する。

linux domainの設定を以下のように行う。

Bif File: <work-dir-path>/vitis_args/linux.bif
Boot Components Directory:<work-dir-path>/boot
Linux Image Directory:<work-dir-path>/boot
Linux Rootfs:<work-dir-path>/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.ext4
Bootmode:SD
Sysroot Directory:<work-dir-path>/sdk/sysroots/aarch64-xilinx-linux
QEMU Data:<work-dir-path>/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp
QEMU Arguments:<work-dir-path>/vitis_args/qemu_args.txt
PMU QEMU Arguments:<work-dir-path>vitis_args/pmu_args.txt

platformをbuildする。Application projectを作成するところまでは同じだが、その後のUIが少し変わっている。


 

vecadd_systemを開いてActive Build Configurationを変更してAssistant上でBuildする。

また、最初にリソースファイルを作成するようになったためか、buildボタンを押してしばらく反応が無かったりする。ビルドが始まるまで気長に待つ必要があった。 ビルドの際にkernelとhw_linkとhostプログラムを分けてビルドしてくれるようになったり、変更後のビルドで影響ある部分だけビルドしてくれたりと少し賢くなったけど、初動は遅くなったイメージを持った。

Platformのテスト

ここを参考にplatformのテストを行う。 日本語ならこちら。

application project nameはvecaddとした。 途中、Kernel Imageが空欄となっているので、/boot/Imageを指定しておく。

Emulation-SW

まずはvecadd_systemを開いてActive Build ConfigurationをEmulation-SWに変更してBuildする。 Launch on Emulatorを試す。 RunかDebugのボタンを押し、Launch SW Emulatorを選択する。 Application Timelineはデフォルトで有効になっていないので、有効にする場合はRun ConfigurationsからXilinx Runtime ProfilingのConfigurationをEditして、OpenCL detailed profile summary and timeline traceを選択する。


 
 

結果は以前と変化ないので省略。

また、2020.2ではEmulation-SWのLaunch on Hardwareに相当する操作はできなくなっていた。 アクセラレーション前の実行時間を計測するのに便利そうと思っていたのに。 直接動かしたり、コマンドラインからのデバッグ実行ならばいけるかもしれないので、後で試す。 (または、Emulatorが起動したとしてもTCFの接続先を実機にしておけば目的は達成されるかも)

Emulation-HW

vecadd_systemを開いてActive Build ConfigurationをEmulation-HWに変更してBuildする。 Launch Emulator in GUI modeを選択するとvivado simulatorが立ち上がるのが見える。


 

GUI modeの場合は手動で実行されるまでQEMUは実行を待機している模様。必要な信号線をaddした後にrun allすることを想定しているのかな。


 

今回Emulation-HWの動作が期待通りとなることを確認したけど、v2020.1でEmulation-HW(Launch on Hardware)は何をやっていたことになるのか謎。 Timelineあったけど、普通にHardwareの動作していただけ?

Hardware

vecadd_systemを開いてActive Build ConfigurationをHardwareに変更してBuildする。 SDの準備はv2020.1と同じ。sd_card.imgをddすれば良い。

また、これもv2020.1の時と同じであるが、Lunch Target Connectionで実機に接続できるように設定を行う。Emulation-SWのLaunch Target Connectionを参照。

実行結果はTEST PASSEDが出るだけで特別言うことも無いので省略。

Vitis Analyzer 

それぞれの実行結果を記載する。
Emulation-HWの結果がエラい長いけどこんな感じでいいのか?

Emulation-SW



 

Emulation-HW

 


Hardware



 

 

2020年12月3日木曜日

ultra96v2のembedded acceleration platformをvitis2020.2で作成してみた話その1

ultra96v2のembedded platformを作成した話。 今回はHW-ComponentとSW-Componentを作成するところまで。 やり方はは2020.1のときと同じ。

準備

使用するのは以下のもの。 

  • cmake
  • make
  • repo
  • Vivado 2020.2
  • Vitis 2020.2

cmake と repoが無い場合は以下の通り入手可能。

apt install cmake
curl -k https://storage.googleapis.com/git-repo-downloads/repo > repo
chmod a+x repo
sudo mv repo /usr/local/bin/

HW-Componentの作成

ここを参考にしてブロックデザインを作成している。 日本語ならこちら。

なお、Emulation-HWを実行するためにひと手間加えている。 参考にしたのは公式ドキュメントの、 “Enabling Hardware Emulation for Extensible XSA”。
明確にEmbedded環境に関する話は書いていないが、Versal向けの設定をEmbedded環境向けに適用してみたところ、 期待通りにEmulation動作したので採用した。 (公式の記載通りではないので使用する際は自己責任です) 行った内容はブロックデザインを開き以下の通りplatform_stateの設定と、 PS部のSELECTED_SIM_MODELをrtl=>tlmに変更した。 この変更をしないとEmulation-HW実行時にQEMUが動作開始できないのだと思う。

set_property platform.platform_state "pre_synth" [current_project]
set_property SELECTED_SIM_MODEL tlm [get_bd_cells /zynq_ultra_ps_e_0]

 


公式ドキュメントに記載されているwrite_hw_platformのオプション-hw_emuは2020.1以降は多分不要。(どこかで非推奨と書いてあったような気もする。つけて無くても必要なファイルは出力されるっぽい) 

ただ、2019.2だと必要と思われる。(オプションのあるなしでファイルサイズがだいぶ違ったので) 

GUIだと、Vivado File > Export > Export Platform からHardware and hardware emulationを選択すれば問題はなさそう。このときpre_synthの設定もされる。(はず。tclで設定してしまったのでよくわからない。)

以下の手順はすでに実施済のものを生成し、xsa_dirにxsaファイルをコピーする。

cd <work-dir-path>
source <path-to-vivado-installation>/2020.1/settings64.sh
git clone https://github.com/akira-nishiyama/vivado_cmake_helper.git
git clone https://github.com/akira-nishiyama/ultra96v2_4z.git -b v2020.2
source vivado_cmake_helper/setup.sh
mkdir xsa_dir
cd ultra96v2_4z
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../../xsa_dir
make
make install
cd ../../

buildディレクトリ以下にvivadoのプロジェクトが作られるので、これを操作してカスタマイズも可能。カスタマイズ後はscriptsフォルダにExport Blockdesignをアップデートする必要がある。また、ソース等を編集、追加した場合はsrcフォルダにRTLファイルをコピーしてバージョン管理しないと再生成できない。(ソースファイルなどはプロジェクトにインポートしておかないとxsaファイルが作成できないことが理由)

SW-Componentの作成

mkdir petalinux
mkdir sdk
mkdir boot
cd PetaLinux
repo init -u http://github.com/akira-nishiyama/petalinux-ros2-manifests -b feature-v2020.2
repo sync
source setupsdk
#edit conf/local.conf

conf/local.confを開き、下記の通りHDF設定を修正する。

HDF_EXT_ultra96v2-zynqmp = "xsa"
HDF_BASE_ultra96v2-zynqmp = "file://"
HDF_PATH_ultra96v2-zynqmp = "<work-dir-path>/xsa_dir/ultra96v2_4z/ultra96v2_4z.xsa"

bitbakeする。

MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2
MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2 -c do_populate_sdk

動作のためにQEMUを起動する。

cp <path-to-vitis-installation>/2020.1/data/emulation/dtbs/zynqmp/pmu_rom_qemu_sha3.elf tmp/deploy/image/tmp/deploy/images/ultra96v2-zynqmp/pmu-rom.elf
MACHINE=ultra96v2-zynqmp runqemu

起動したら以下の通り実行して動作を確認する。

root@ultra96v2-zynqmp:~# source ros_setup.sh
root@ultra96v2-zynqmp:~# (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") &
root@ultra96v2-zynqmp:~# ros2 topic echo /chatter &
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #2: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #3: std_msgs.msg.String(data='Hello world')

終了するにはpoweroffを入力し、Ctrl-a, Ctrl-x。

sdkを展開する

tmp/deploy/sdk/petalinux-glibc-x86_64-petalinux-image-minimal-ultra96v2ros2-aarch64-ultra96v2-zynqmp-toolchain-2020.1.sh -d ../../sdk/

必要なデータをbootフォルダにコピーしておく。 2020.2ではVitisで絶対パス指定がうまく行かなくなっていたので、 ブートデータ作成に必要なファイルはすべてbootフォルダに保存する。

cp tmp/deploy/images/ultra96v2-zynqmp/fsbl-ultra96v2-zynqmp.elf ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/pmu-firmware-ultra96v2-zynqmp.elf ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/system.dtb ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/u-boot.elf ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/boot.scr ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/uEnv.txt ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/Image ../../boot/

2020年11月29日日曜日

ultra96v2のembedded acceleration platformをvitis2020.1で作成してみた話その2

ultra96v2のembedded platformを作成した話。 VitisのVecaddを動かすまで。 前回の続き。

準備

vitisで使用するlinux_bifとqemu_args.txtとpmu_args.txt

cd <work-dir-path>
mkdir vitis_args

vitis_argsにlinux.bifとqemu_args.txtとpmu_args.txtを保存する。内容は以下の通り。 <>で囲んだファイルはvitisが補完してくれるようだけど、よく問題が出たのでbitstream以外は直接指定することにしている。

  • linux.bif
    ##work-dir-path##は環境に合わせて置き換えてください。

    /* linux */
    the_ROM_image:
    {
      [fsbl_config] a53_x64
      [bootloader] ##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/fsbl-ultra96v2-zynqmp.elf
      [destination_device=pl] <bitstream>
      [pmufw_image] ##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-firmware-ultra96v2-zynqmp.elf
      [destination_cpu=a53-0, exception_level=el-3, trustzone] ##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf
      [load=0x100000] ##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb
      [destination_cpu=a53-0, exception_level=el-2] ##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/u-boot.elf
    }
  • qemu_args.txt
    system.dtbは2020.1からBOOT.binで書き込むようにしている模様。
    ##work-dir-path##は環境に合わせて置き換えてください。

    -M arm-generic-fdt
    -net nic -net nic -net nic
    -serial /dev/null -serial mon:stdio
    -display none
    -device loader,file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/arm-trusted-firmware.elf,cpu-num=0
    -device loader,file=<u-boot.elf>
    -device loader,file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/system.dtb,addr=0x100000
    -drive file=##work-dir-path##/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.wic.qemu-sd,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
    ##work-dir-path##は環境に合わせて置き換えてください。

    -M microblaze-fdt
    -serial /dev/null -serial /dev/null
    -display none
    -device loader,file=##work-dir-path##/build/tmp/deploy/images/ultra96v2-zynqmp/pmu-ultra96v2-zynqmp.elf
    -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4
    -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4

Platformの作成

ここを参考にplatformを作成していく。 日本語ならこちら。 2020.1ではこのARを実行しないとEmulation-HWのビルドができない。

export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
source <path-to-vitis-installation>/2020.1/settings64.sh
cd <work-dir-path>
mkdir vitis_pfm
cd vitis_pfm
mkdir wksp1
vitis -workspace wksp1

create platformを行い、platform名はultra96v2-platform、xsaは/xsa_dir/ultra96v2_4z/ultra96v2_4z.xsaを指定する。

linux domainの設定を以下のように行う。

Bif File: <work-dir-path>/vitis_args/linux.bif
Boot Components Directory:<work-dir-path>/boot
Linux Image Directory:<work-dir-path>/boot
Linux Rootfs:<work-dir-path>/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp/petalinux-image-minimal-ultra96v2ros2-ultra96v2-zynqmp.ext4
Bootmode:SD
Sysroot Directory:<work-dir-path>/sdk/sysroots/aarch64-xilinx-linux
QEMU Data:<work-dir-path>/petalinux/build/tmp/deploy/images/ultra96v2-zynqmp
QEMU Arguments:<work-dir-path>/vitis_args/qemu_args.txt
PMU QEMU Arguments:<work-dir-path>vitis_args/pmu_args.txt

platformをbuildする。方法は上記ページを参照のこと。

Platformのテスト

ここを参考にplatformのテストを行う。 日本語ならこちら。

application project nameはvecaddとした。 途中、Kernel Imageが空欄となっているので、/boot/Imageを指定しておく。

Emulation-SW

まずはEmulation-SWをLaunch on EmulatorとLaunch on Hardwareで試す。 Emulation-SWを右クリックで選択し、Buildを実行する。

その後Emulation-SWを右クリックで選択し、Run->Launch On Emulatorを実行する。

Launch on Emulator 実行結果


Launch on HardwareではSDを作成する必要がある。 SDは以下の通り作成する。

cd <work-dir-path>/vitis_pfm/wksp1/vecadd/Emulation-SW/package
dd if=sd_card.img of=/dev/sdX

上記のsd_card.imgにはBOOT.binが含まれていないので、 /petalinux/build/tmp/image/ultra96v2-zynqmp/boot.binをパーティション1に追加する。

SDをultra96v2に挿入し、電源をONする。 しばらく待っているとWifiのアクセスポイントが見えて来るので、これに接続する。

Lunch Target Connectionで実機に接続できるように設定を行う。 ultra96v2のwifi APはデフォルトで192.168.2.1のIPを持っているので、以下のように設定する。 ultra96v2が起動していればTest Connectionで接続を確認できる。

Launch Target Connection


 
Target Connectionsの+ボタンから設定を追加する。


その後Emulation-HWを右クリックで選択し、Run->Launch On Hardwareを実行する。

Launch on Hardware 実行結果
省略

Emulation-HW

Launch on Emulatorでは理由は不明だが、Launch on Emulatorを実行するとQEMUのプロセスが停止したままとなる。 恐らくはVivado Simulatorからの接続待ちなのではないかと思っているけど、 どうしても使用したいわけでもないのでツールのバージョンアップに期待する。 ここでは実機との組み合わせで動かしてみる。

SDの準備はEmulation-HWのものを使用する他はEmulation-SWと同じ。 すでにEmulation-SWをLaunch on Hardwareで実行している場合にはbinary_container_1.xclbinとvecaddを差し替えるだけで良い(はず。あまり自信が無い)。 scpで/media/sd-mmcblk0p1に送り込むのが便利。Vitisが勝手にやってくれるかもしれないけど。

あと、Vivado simが動いていないように見えるのも気になる。これのやり方合ってるのだろうか?

Launch on Hardware 実行結果


Hardware

Hardwareを右クリックしてBuildする。 SDの準備はHardwareのものを使用する他はEmulation-SWと同じ。 その後Hardwareを右クリックで選択し、Run->Launch On Hardwareを実行する。

Launch on Hardware実行結果


Vitis Analyzer 

それぞれの実行結果を記載する。
Kernel RuntimeをSW実行時とHW実行時で比較するのと、 Application Timelineでボトルネックを特定して改良していく感じなのかな?
Emulation-HW(Launch on Hardware)はHardware実行に比べてApplication Timelineが得られるということだろうか。
このあたりはもう少しドキュメントの読み込みが必要そう。

Emulation-SW(Launch on Emulator)


Emulation-SW(Launch on Hardware)





Emulation-HW(Launch on Hardware)



Hardware(Launch on Hardware)







2020年11月28日土曜日

ultra96v2のembedded acceleration platformをvitis2020.1で作成してみた話その1

ultra96v2のembedded platformを作成した話。 今回はHW-ComponentとSW-Componentを作成するところまで。

準備

使用するのは以下のもの。 

  • cmake
  • make
  • repo
  • Vivado 2020.1
  • Vitis 2020.1

cmake と repoが無い場合は以下の通り入手可能。

apt install cmake
curl -k https://storage.googleapis.com/git-repo-downloads/repo > repo
chmod a+x repo
sudo mv repo /usr/local/bin/

HW-Componentの作成

ここを参考にしてブロックデザインを作成している。 日本語ならこちら。 以下の手順はすでに実施済のものを生成し、xsa_dirにxsaファイルをコピーする。

cd <work-dir-path>
source <path-to-vivado-installation>/2020.1/settings64.sh
git clone https://github.com/akira-nishiyama/vivado_cmake_helper.git
git clone https://github.com/akira-nishiyama/ultra96v2_4z.git -b v2020.1
source vivado_cmake_helper/setup.sh
mkdir xsa_dir
cd ultra96v2_4z
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=../../xsa_dir
make
make install
cd ../../

buildディレクトリ以下にvivadoのプロジェクトが作られるので、これを操作してカスタマイズも可能。

SW-Componentの作成

mkdir petalinux
mkdir sdk
mkdir boot
cd PetaLinux
repo init -u http://github.com/akira-nishiyama/petalinux-ros2-manifests -b feature-rel-v2020.1
repo sync
source setupsdk
#edit conf/local.conf

conf/local.confを開き、下記の通りHDF設定を修正する。

HDF_EXT_ultra96v2-zynqmp = "xsa"
HDF_BASE_ultra96v2-zynqmp = "file://"
HDF_PATH_ultra96v2-zynqmp = "<work-dir-path>/xsa_dir/ultra96v2_4z/ultra96v2_4z.xsa"

bitbakeする。

MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2
MACHINE=ultra96v2-zynqmp bitbake petalinux-image-minimal-ultra96v2ros2 -c do_populate_sdk

動作のためにQEMUを起動する。

cp <path-to-vitis-installation>/2020.1/data/emulation/dtbs/zynqmp/pmu_rom_qemu_sha3.elf tmp/deploy/image/tmp/deploy/images/ultra96v2-zynqmp/pmu-rom.elf
MACHINE=ultra96v2-zynqmp runqemu

起動したら以下の通り実行して動作を確認する。

root@ultra96v2-zynqmp:~# source ros_setup.sh
root@ultra96v2-zynqmp:~# (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") &
root@ultra96v2-zynqmp:~# ros2 topic echo /chatter &
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #2: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #3: std_msgs.msg.String(data='Hello world')

終了するにはpoweroffを入力し、Ctrl-a, Ctrl-x。

sdkを展開する

tmp/deploy/sdk/petalinux-glibc-x86_64-petalinux-image-minimal-ultra96v2ros2-aarch64-ultra96v2-zynqmp-toolchain-2020.1.sh -d ../../sdk/

必要なデータをbootフォルダにコピーしておく。

cp tmp/deploy/images/ultra96v2-zynqmp/boot.scr ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/uEnv.txt ../../boot/
cp tmp/deploy/images/ultra96v2-zynqmp/Image ../../boot/