Vertical-Beach / ai-edge-contest-5

1 stars 0 forks source link

Vitisの勉強 #2

Closed lp6m closed 2 years ago

lp6m commented 2 years ago
lp6m commented 2 years ago

HWプラットフォームの作成

参考

Vivadoでデザイン作成

Screenshot from 2021-11-20 01-10-26 クロックは100/150/200/300/400の5つに設定した。

Vitisに拡張できるように設定

Screenshot from 2021-11-20 01-13-37

Vitis向けプラットフォームの設定

ポートとクロックの情報

id=0のクロックがないとVitisでエラーになるので注意
Screenshot from 2021-11-20 19-47-34

Screenshot from 2021-11-20 19-47-38

その他の設定

set_property platform.design_intent.embedded true [current_project]
set_property platform.design_intent.server_managed false [current_project]
set_property platform.design_intent.external_host false [current_project]
set_property platform.design_intent.datacenter false [current_project]
set_property platform.default_output_type "sd_card" [current_project]

合成

lp6m commented 2 years ago

SWプラットフォームの作成

参考

Petalinux2020.2を使用

petalinux-create --type project --template zynqMP --name ultra96v2_min2_201
petalinux-config --get-hw-description=../../ultra96v2_min2_201

FPGAの部屋の通りに全て設定してpetalinux-build実行 , sysroot作成

lp6m commented 2 years ago

アクセラレーションプラットフォームの作成

参考

Ultra96-V2 の Vitis 2020.1 アクセラレーション・プラットフォームを作る3(Vitis 2020.1 でアクセラレーション・プラットフォーム作成) Screenshot from 2021-11-20 02-53-53

ビルド完了後、プラットフォームをplatformをVitisから参照できるようにVitisのインストールディレクトリにコピーしておく

sudo cp -r wksp1/ultra96v2_min2_201/export/ultra96v2_min2_201/ /tools/Xilinx/Vitis/2020.2/platforms/
lp6m commented 2 years ago

Vitis GUIフロー中にエラー

xclbinのoptionに--targetがないとエラーになった。Vitis上で実行されているxclbinutilsource /tools/Xilinx/Vitis/2020.2/settings.shをしてターミナル上で実行できるxclbinutilが違うものを参照している?

Screenshot from 2021-11-20 22-30-16

とりあえず以下の記事を参考にXRT 2020.2をインストールする。
Ubutnu 20.04インストールとVitis 2020.2とVitis AI 1.3関連の開発環境構築のメモ

git clone https://github.com/Xilinx/XRT
cd XRT
git checkout origin/2020.2
sudo ./src/runtime_src/tools/scripts/xrtdeps.sh
cd build
./build.sh
cd Release
make package
sudo dpkg -i xrt_202020.2.8.0_20.04-amd64-xrt.deb

これで/opt/xilinx/xrt/にXRT 2.8.0がインストールされた。
Vitisの環境を有効化したあとにXRTを有効化すればよいのかな? そうするとうまくいった。

lp6m commented 2 years ago

Vitis-AIのDPU GUI Flowに自分のカーネルを追加する試み

とりあえずdpu_trd_kernels/srckernl_vadd.cppを追加して、dpu_trd_kernels.prjの設定を開いてkrnl_vaddHardware Functionsとして追加した。
Screenshot from 2021-11-21 03-10-15

Explorerウインドウのdpu_trd_kernelsを右クリックしてBuild Projectを実行、ビルドは成功し、カーネルオブジェクトとしてkrnl_vadd.xoが生成された。 Screenshot from 2021-11-21 03-13-25

次に、dpu_trd_system_hw_link.prjを開くと、どのカーネルをいくつ搭載するかを設定するHardware Functionskrnl_vaddが追加されていた。デフォルトのまま1ですすめる Screenshot from 2021-11-21 03-15-05

よさそうなのでこれでBuild Projectを実行した。 ビルドは成功した。自動的に作られたVivadoプロジェクトを開くといい感じに繋がってた。 Screenshot from 2021-11-21 03-31-54

lp6m commented 2 years ago

現状まとめ

Wifiが繋がらない問題、g++, gccがない問題は普通にウザいので解決する必要がある ikwzmさんのdebianイメージでなんとかする方法もあるけど、それはそれで色々めんどくさそう・・オーバレイ周り

lp6m commented 2 years ago

Avnetのpetalinuxプロジェクトを参考にSWプラットフォームを作成する

petalinux-create --type project --template zynqMP --name ultra96v2_min2_201
cd ultra96v2_min2_201
cd project-spec
git clone -b 2020.2 https://github.com/Avnet/meta-avnet
cd ..
~/petalinux_2020.2/tools/common/petalinux/utils/petalinux-kconfig-edit -c ./project-spec/configs/config -o CONFIG_USER_LAYER_0 -v "\"\${PROOT}/project-spec/meta-avnet\""
petalinux-config --get-hw-description=../../ultra96v2_min2_201

petalinux-configで以下を設定
Screenshot from 2021-11-21 17-16-21 Screenshot from 2021-11-21 17-16-35 後でAvnetのmeta-avnetを使用できるように、YOCTO_MACHINE_NAMEを変更しておく

Screenshot from 2021-11-21 17-44-37

ここでAvnetのpetalinuxプロジェクトを参考に、meta-avnetのパッチを当てる https://github.com/Avnet/petalinux/blob/2020p2_u96v2_sbc_base_20210426_105325/configs/project/config.board.u96v2_sbc.sh#L20 ちなみに前ステップでYOCTO_MACHINE_NAMEを変更しておかないと以下のようにエラーになる(MACHINE_NAMEで参照するユーザレイヤを判断しているらしい) Screenshot from 2021-11-21 17-42-04

これにより、project-spec/configs/configの末尾のUser Layersに以下が追加されている

CONFIG_USER_LAYER_0="/home/lp6m/Desktop/ultra96_vai1_4/ai-edge-contest-5/petalinux3/meta-avnet"

petalinux-config -c kernelでFPGAの部屋の通りに設定しようとしたが、全部設定済みになっていたので特に変更せずExit

petalinux-config -c rootfs FPGAの部屋ではuser packageを追加したりwifi, zocl用のdtsファイルを追加しているが、上記Avnetパッチを当てているので問題ない気がするのでとりあえず何も設定せずに閉じた

petalinux-build -c avnet-image-minimal
petalinux-package --boot --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/system.bit --uboot --force
cd images/linux
petalinux-build --sdk
mkdir pkg
mkdir pkg/pfm
mkdir pkg/pfm/boot
cp bl31.elf pkg/pfm/boot
cp image.ub pkg/pfm/boot
cp pmufw.elf pkg/pfm/boot/
cp u-boot.elf pkg/pfm/boot/
cp zynqmp_fsbl.elf pkg/pfm/boot/
mv pkg/pfm/boot/zynqmp_fsbl.elf pkg/pfm/boot/fsbl.elf
cp system.dtb pkg/pfm/boot/

ここでビルドしたpetalinuxのシステムではwifiがつながるのかを確認 BOOT.BIN boot.scr image.ub system.dtbをBOOTにコピー、rootfs.tar.gzをrootfsに解凍

./sdk.sh 
PetaLinux SDK installer version 2020.2
======================================
Enter target directory for SDK (default: /opt/petalinux/2020.2): ~/Desktop/ultra96_vai1_4/ai-edge-contest-5/petalinux3/ultra96v2_min2_201/images/linux/pkg/pfm  

pkg/linux.bifを作成

/* linux */
 the_ROM_image:
 {
    [pmufw_image] <pmufw.elf>
    [bootloader, destination_cpu=a53-0] <fsbl.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>
 }
lp6m commented 2 years ago

Vitis-AI DPU-TRD GUIフロー + vadd

上記でAvnetを参考にしたSWプラットフォームを使ってVitis アクセラレーションプラットフォームを作成し直した。問題なく作成できた。
作成しなおしたプラットフォーム上でもう一度GUIフローを試してみたいと思う。

cp -r ~/Desktop/ultra96_vai1_4/Vitis-AI/dsa/DPU-TRD/ ./
1からつくるのでそもそもコピーする必要ないかも
vitis -workspace ./

Window->Preferences->Library RepositoriesにDPU-TRDを設定しておく。

Screenshot from 2021-11-23 17-58-43 File->New->Application Projectを選択、先程作ったプラットフォームを選択、プロジェクト名はdpu_trdとした。設定等はそのまま。 Screenshot from 2021-11-23 17-57-45

Explorerウインドウのdpu_trd_kernelsからsrc->prj->Vitis->dpu_conf.vhを開いてDPUのコンフィグレーションを変更する Screenshot from 2021-11-23 18-01-39

26c26
< `define B4096 
---
> `define B1600 
81c81
< `define RAM_USAGE_LOW
---
> `define RAM_USAGE_HIGH
114c114
< `define POOL_AVG_ENABLE
---
> `define POOL_AVG_DISABLE

次に、独自カーネルのテストとしてvadd(vector_add)を追加するための作業を行う。 まず、File->New->Application Projectでアプリケーションプロジェクトを作成。名前はvadd_appとした。(名前はvaddだけのほうが適切だった気がする。)テンプレートを選択する画面でvector addを選択する。このときsystem projectにdpu_trd_systemを選択することでDPUプロジェクトにvaddのカーネルとアプリケーションを追加できる。つまり、dpu_trd_systemというsystem projectの中にdpu_trd, vadd_appという2つのカーネル・2つのアプリケーションが存在する状態になった。

Screenshot from 2021-11-23 18-20-45

次にdpu_trd->src->config_gui.cfgを編集する。DPUに接続するクロックとポートの設定を変更する。今回ベースにしているプラットフォームプロジェクトのクロックは以下の通りで、150MHz/300MHzを利用したいので以下のように設定した。また今回はDPUを1つだけ搭載するので元のポート情報の後半を削除した。

Screenshot from 2021-11-23 18-22-14

Screenshot from 2021-11-23 18-23-51

最後にdpu_trd_system_hw_link.prjを開く。カーネルをいくつ搭載するかの画面がある。 Active build configurationをHardwareに変更。 今回はsoftmaxコアは不要なのでsfm_xrt_topは削除、DPUCZDX8Gの個数を2個から1個に変更、さらに右上のイナズマアイコンのAdd Hardware Functionsからkrnl_vaddを追加した。

Screenshot from 2021-11-23 18-30-41

最後に、左上のトンカチアイコン横の三角ボタンを押してビルド対象がHardwareになっていることを確認したら、トンカチアイコンを押してビルド開始

成功しろ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

なんか落ちてた

Section: 'SYSTEM_METADATA'(22) was successfully written.
Format: RAW
File  : '/home/lp6m/Desktop/ultra96_vai1_4/ai-edge-contest-5/DPU-TRD/dpu_trd_system/Hardware/package.build/package/extractedSystemDiagram.json'
ERROR: [v++ 60-2254] File specified by package.sd_file option is not valid: /home/lp6m/Desktop/ultra96_vai1_4/ai-edge-contest-5/DPU-TRD/dpu_trd_system/Hardware/../../dpu_trd/Hardware/dpu_trd
ERROR: [v++ 60-702] Failed to finish packaging
INFO: [v++ 60-1653] Closing dispatch client.
makefile:37: recipe for target 'package' failed
make: *** [package] Error 1

ディレクトリがないだけだったらしいので、とりあえずディレクトリを作成して再ビルド。 OK.ビルドは完了した。

lp6m commented 2 years ago

Petalinux2020.2 + Ultra96V2 wifiの記事を見つけた

Wifiが使えない問題をさっさと解決させたい。   Petalinux 2020.2 BSP for Ultra96v2 with Wifi & VNC Server この記事を参考にしてみる。やはりmeta-avnetから一部のファイルをコピーしてきてプロジェクトを作成するらしい。とりあえずBSPが公開されているのでDLしてそれを元にプロジェクトを作ればできそう。

petalinux-create -t project -s ~/Downloads/ultra96v2_2020_2_with_VNC.bsp --name ultra96v2_min2_201
cd ultra96v2_min2_201
petalinux-config --get-hw-description ../../ultra96v2_min2_201/ultra96v2_min2_201.xsa
petalinux-config #initramfs->sdなどの変更は既に適用されていたので特に何も変更せず
petalinux-config -c rootfs #vitis-ai関連のpetalinux package有効化。代わりにproject-spec/config/rootfs_configを編集しても可
petalinux-config -c kernel #特に変更するところなし
petalinux-build
lp6m commented 2 years ago

HWプラットフォーム作り直し メモ

Screenshot from 2021-12-02 23-25-47

IP Integrator -> Create Block DesignでBD作成 AddIPで以下を追加

Clocking WizardをダブルクリックReset Type を Active Low に変更、周波数を変更する Screenshot from 2021-12-02 23-31-12
ConcatをダブルクリックNumber of portsを1に変更   Processor System Resetをコピペしてクロックの数だけ生成 後は頑張ってつなぐ。Run Connection Automationを信用していないので頑張って手で全部つなぐ
Screenshot from 2021-12-02 23-39-03

Validate Designを実行して問題がないか確認 Screenshot from 2021-12-02 23-40-08

Project is an extensible Vitis Platformにチェック。 Screenshot from 2021-12-02 23-40-52

Window->Platform SetupからAXI PortとClockを設定 Screenshot from 2021-12-02 23-42-41

Screenshot from 2021-12-02 23-43-18

以下のtclをTcl Consoleウインドウから実行

set_property platform.design_intent.embedded true [current_project]
set_property platform.design_intent.server_managed false [current_project]
set_property platform.design_intent.external_host false [current_project]
set_property platform.design_intent.datacenter false [current_project]
set_property platform.default_output_type "sd_card" [current_project]

Generate Bitstream実行、10分以内に終わる

cd /home/lp6m/Desktop/ultra96_vai1_4/ai-edge-contest-5/ultra96v2_min2_201/
write_hw_platform -include_bit ultra96v2_min2_201.xsa
lp6m commented 2 years ago

SWやりなおし2

petalinux-create -t project -s ../u96v2_sbc_base_2020_2.bsp --name ultra96v2_min2_201
cd ultra96v2_min2_201
petalinux-config --get-hw-description ../../ultra96v2_min2_201/ultra96v2_min2_201.xsa
petalinux-build -c avnet-image-full
petalinux-package --boot --fsbl ./images/linux/zynqmp_fsbl.elf --fpga ./images/linux/system.bit --uboot --force
cd images/linux
mkdir pkg
mkdir pkg/pfm
mkdir pkg/pfm/boot
cp bl31.elf pkg/pfm/boot/
cp image.ub pkg/pfm/boot/
cp pmufw.elf pkg/pfm/boot/
cp u-boot.elf pkg/pfm/boot/
cp system.dtb pkg/pfm/boot/
cp zynqmp_fsbl.elf pkg/pfm/boot/fsbl.elf
petalinux-build -c avnet-image-full --sdk
./sdk.sh 
PetaLinux SDK installer version 2020.2
======================================
Enter target directory for SDK (default: /opt/petalinux/2020.2): /home/lp6m/Desktop/ultra96_vai1_4/ai-edge-contest-5/yarinaoshi/ultra96v2_min2_201/images/linux/pkg/pfm
touch pkg/linux.bif
/include/ "system-conf.dtsi"
/ {
    chosen {
        bootargs = "earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait cma=512M";
    };

   sdio_pwrseq: sdio_pwrseq {  /* This needs to be able to manipulate the chip_en and the resetn properly */
      compatible = "mmc-pwrseq-simple";
      /* post-power-on-delay-ms = <10>; */
      reset-gpios = <&gpio 7 1>; // MIO[7] for WILC3000 RESETN, Active low
      /* reset-gpios = <&gpio 78 1>;  // Some prototype boards only! device pin A3 for RESETN, Active low */
      chip_en-gpios = <&gpio 8 1>; 
   };

   // Remove V1 Power ON/OFF controller from U96 V1 DT
   /delete-node/ ltc2954;

    aliases {
        i2c0 = &i2c1;
   };

   xlnk {
      compatible = "xlnx,xlnk-1.0";
   };

};

&amba {
    zyxclmm_drm {
        compatible = "xlnx,zocl";
        status = "okay";
    };
};

&sdhci1 {
   bus-width= <0x4>;
   /* non-removeable; */
   /* mmc-pwrseq = <&sdio_pwrseq>; */
   max-frequency = <50000000>;
   /delete-property/cap-power-off-card; // This is not compatible with the WILC3000 and means the WILC will always be powered on
   status = "okay";
   #address-cells = <1>;
   #size-cells = <0>;
   wilc_sdio@1 {
      compatible = "microchip,wilc3000", "microchip,wilc3000";
      reg = <0>;
      // interrupt-parent = <&gpio>; // Microchip driver DOES NOT use gpio irq any more!
      // interrupts = <76 2>; /* MIO76 WILC IRQ 1V8 */ // Microchip driver DOES NOT use gpio irq any more!
      // irq-gpios = <&gpio 76 0>; // Microchip driver DOES NOT use gpio irq any more!
      bus-width= <0x4>;
      status = "okay";
   };
   // Remove TI child node from U96 V1 DT
   /delete-node/wifi@2;
};

&sdhci0 {
    disable-wp;
};
/* linux */
 the_ROM_image:
 {
    [pmufw_image] <pmufw.elf>
    [bootloader, destination_cpu=a53-0] <fsbl.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>
 }

rootfsは追加しておく必要がある。本来ならpetalinux-build -c avnet-image-full --sdkを実行すべきだがエラーになってしまったのでとりあえずpetalinux-build --sdkのsysrootを今後は使うことにする。まあサボり

CONFIG_xrt
CONFIG_xrt-dev
CONFIG_zocl
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv
lp6m commented 2 years ago
lp6m@lp6m-ryzen:~/Desktop/ultra96_vai1_4/ai-edge-contest-5/yarinaoshi/ultra96v2_min2_201/images/linux/pkg/pfm/workspace/ultra96v2_min2_201/export$ sudo cp -r ultra96v2_min2_201/ /tools/Xilinx/Vitis/2020.2/platforms/
lp6m commented 2 years ago

vitis -workspace ./