IMAX3 on Versal プレミアムシリーズ VPK180 評価キット 環境構築

<!--# IMAX3 on Versal プライム シリーズ VMK180 評価キット 環境構築-->
<div style="text-align: right;">
<!--2023.4.12 赤部知也-->
</div>


> 本資料では，VPK180 評価キット上にCGRA型アクセラレータIMAX3を構築する．

https://doi.org/10.1109/access.2024.3524415

http://archlab.naist.jp/proj-arm64/fpga/index.shtml

### 前提環境
- Ubuntu 22.04.2 LTS
- Vivado v2023.1 (64-bit)
- PetaLinuxツール v2023.1
- Versal Premium Series VPK180 Evaluation Kit (EK-VPK180-G)

## IMAX3 Block Design
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969856/16eb95ea-e53a-51dc-d257-6240ace8725c.png)
あらかじめVivadoでGenerate Device Image 完了後、File→Export→Export Hardwareと進み、Include device imageを選択し、XSAファイルを出力する．

### PetaLinuxツール(2023.1)のインストーラのダウンロード
<https://japan.xilinx.com/member/forms/download/xef.html?filename=petalinux-v2023.1-04191534-installer.run>

### パッケージ群のインストール
- 以下の資料を参考にPetalinuxツールのインストール要件であるパッケージ群を導入する．
  - Xilinx document UG1144 (v2023.1)の「インストール要件」
  - <https://docs.xilinx.com/r/ja-JP/ug1144-petalinux-tools-reference-guide>

**実際に実行したコマンド**
```
sudo apt-get install tofrodos gawk xvfb git libncurses5-dev tftpd zlib1g-dev zlib1g-dev:i386 libssl-dev flex bison chrpath socat autoconf libtool texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev screen pax libtinfo5

# エラーに従い追加でパッケージをインストールする．
```

### Petalinuxツールのインストール

```
$ sudo mkdir -p /opt/pkg/petalinux/2023.1
$ sudo chown -R <account name> /opt/pkg/petalinux/2023.1
$ petalinux-v2023.1-04191534-installer.run /opt/pkg/petalinux/2023.1
```

## ハードウェア環境のビルド
- 既に上記関連パッケージ，ツールがインストール済みならここから始めます．

### Petalinux作業環境のセットアップ
- UG1144の「PetaLinux作業環境のセットアップ」に従って，
   `source /opt/pkg/petalinux/2023.1/settings.sh` を実行する．

- 例えば，現環境では以下のように
```
source /opt/xilinx/PetaLinux/2023.1/settings.sh
```


```
petalinux-create --type project --template versal --name vpk180
```

### ハードウェアコンフィギュレーションのインポート
- UG1144の「ハードウェアコンフィギュレーションのインポート」に従い，Vivadoによって作成したハードウェア記述ファイル(.xsa)をproject directory直下に置き以下のコマンドでインポートする．
```
petalinux-config --get-hw-description=./
```

### Configure subsystem level configuration
- rootfs読み込みとUIOを有効にするため，boot argsを変更する．

```
DTG Settings  --->   
  () MACHINE_NAME
  	versal-vpk180-reva
  Kernel Bootargs  --->
    [ ] generate boot args automatically
    user set kernel bootargs
        console=ttyAMA0 earlycon=pl011,mmio32,0xFF000000,115200n8 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait uio_pdrv_genirq.of_id="generic-uio"
```

### rootfs boot setting
- Root filesystem type をINITRDからEXT4に変更する.

```
Image Packaging Configuration  ---> 
  Root filesystem type (INITRD)  ---> 
	 (X) EXT4 (SD/eMMC/SATA/USB)
 ```



### device-tree編集
-	「project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi」に変更・追加分を記述する．

*最終的な system-user.dtsi の内容(MASTER)*
```
$ cat system-user.dtsi

/include/ "system-conf.dtsi"
/ {
        reserved-memory {
                #address-cells = <2>;
                #size-cells = <2>;
                ranges;
                reserved: buffer@0 {
                        reg = <0x00000500 0x00000000 0x00000001 0x80000000>;
                };
        };

    amba_pl@0 {
        emax6@20200000000 {
            compatible = "generic-uio";
        };
        emax6@20400000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@20600000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@20800000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@20a00000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@20c00000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@20e00000000 {
            compatible = "generic-uio";
        };
        axi_chip2chip@21000000000 {
            compatible = "generic-uio";
        };
        dma@a4000000 {
            compatible = "generic-uio";
        };
        dma@a4010000 {
            compatible = "generic-uio";
        };
        dma@a4020000 {
            compatible = "generic-uio";
        };
        dma@a4030000 {
            compatible = "generic-uio";
        };
        dma@a4040000 {
            compatible = "generic-uio";
        };
        dma@a4050000 {
            compatible = "generic-uio";
        };
        dma@a4060000 {
            compatible = "generic-uio";
        };
        dma@a4070000 {
            compatible = "generic-uio";
        };
    };
    ddr_high@050000000000 {
            compatible = "generic-uio";
            reg = <0x00000500 0x00000000 0x00000001 0x80000000>;
    };
};

&gem0 {
    local-mac-address = [00 0a 35 07 dc 14];
};
```

### システムイメージのビルドと，ブートイメージの生成
-	UG1144の「システム イメージのビルド」および「Zynq UltraScale+ MPSoC用ブート イメージの生成」に従う.
```
petalinux-build
```

- buildが成功したら，下記のコマンドを実行する．
```
petalinux-package --boot --force --u-boot
```

### SD cardへの書き込み
- 32GBのSD cardをパーティション分割しフォーマットする．
```
fdisk /dev/sdx
```
- 例えば以下のように分割する．
```
Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdx1  *       2048  2099199  2097152    1G 83 Linux FAT32 (LBA)
/dev/sdx2       2099200 62357503 60258304 28.7G 83 Linux
```
- それぞれフォーマットする．
```
mkfs.vfat -F 32 -n boot /dev/sdx1
mkfs.ext4 -L root /dev/sdx2
```
- bootパーティションに, 「`image/linux`」内の「`BOOT.BIN`」「`boot.scr`」および「`image.ub`」をコピーする．
```
cp BOOT.BIN boot.scr image.ub <sd_card_path>/boot/
```
- 64ビット版のdebianファイルシステムをダウンロード，展開する．
```
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-12.1-minimal-arm64-2023-08-22.tar.xz
tar xf debian-12.1-minimal-arm64-2023-08-22.tar.xz
```
- rootパーティションにファイルシステムをロードする．
```
cd <sd_card_path>/root/
sudo su
tar xfvp <path>/debian-12.1-minimal-arm64-2023-08-22/arm64-rootfs-debian-bookworm.tar -C .
chmod 755 <sd_card_path>/root/
```
- イメージを展開する．
```
cd <PetaLinux_project>/images/linux
dd bs=64 skip=1 if=rootfs.cpio.gz.u-boot of=ramdisk.cpio.gz
gunzip ramdisk.cpio.gz
mkdir ramdisk && cd ramdisk
sudo su
cpio -i -F ../ramdisk.cpio
```
- rootパーティションにコピーする．
```
cd <sd_card_path>/root/lib/
cp -rf <PetaLinux_project>/images/linux/ramdisk/lib/modules .
```

### RootFSの設定
- SDカードをVPK180のスロットに挿入し，電源を入れる．
- 初期パスワードでログイン後，ルート権限を取得する．


<!--
#### ネットワーク設定
```
ifconfig eth0 inet 163.221.183.135 netmask 255.255.255.0 up
route add default gw 163.221.183.1
```

- `/etc/resolv.conf` に以下を追記．

```
nameserver 163.221.8.11
search naist.jp
```

- `/etc/network/interfaces` に以下を追記．

```
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
hwaddress ether 00:0a:35:3a:39:01
```
- 一度apt更新．
```
apt update
```
resolv.confが起動の度書き換わるので以下で対策する。
- パッケージをインストール．
```
apt install resolvconf
```
- `/etc/resolvconf/resolv.conf.d/head` に以下を追記．
```
nameserver 163.221.8.11
search naist.jp
```

#### NFS設定
- パッケージをインストール．
```
apt install nfs-common
```
- `/etc/fstab` に以下を追記．
```
archfs00:/usr0/home     /home   nfs     defaults,rsize=8192,wsize=8192  0       0
archfs00:/usr0/cad      /opt    nfs     defaults,rsize=8192,wsize=8192  0       0
```
- `/home` にマウント
```
mount /home
```

#### NIS設定
- パッケージをインストール．
```
apt install nis tcsh
```
- `/etc/defaultdomain` に以下を追記．
```
comparch
```
- `/etc/yp.conf` に以下を追記．
```
domain comparch server arch.naist.jp
```
- `/etc/nsswitch.conf` を以下に変更．
```
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd nis
group:          files systemd nis
shadow:         files nis
gshadow:        files

hosts:          files mdns4_minimal [NOTFOUND=return] dns nis
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis
```
#### 起動時設定
- `/etc/rc.local` 以下を追記．
```
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

chmod 777 /dev/uio*

exit 0
```

- サービス登録・自動起動設定．
```
chmod a+x /etc/rc.local
systemctl status rc-local
systemctl start rc-local
systemctl stop rc-local
systemctl enable rc-local
```
-->

**完成**

<!--
## 備忘録
#### SDカードのアンマウントを忘れずに
- 書き込みに失敗する．


```
【VMK180 32st構成の作り方】

  1. VMK180-step4000/ に*.v,*.vh,*.xciを用意(VMK180-step4000)
  2. IPは毎回新規作成する. VMK180-step4000_IP/作って，中でVivado起動
  3. File -> Project -> New -> Project_name=default 作成
  4. Add Filesし，VMK180-step4000/*.v,*.vh,*.xciを選択
  5. Board選択(VMK180) -> Next -> Finish
  6. Tools->Create and Package New IP
  7. Next->Next-> IP location:は VMK180-step4000_IPに変更 -> OK -> Finish
  8. 右画面のReview and Package -> Package IP -> Close
  9. Quit Vivado
   ( PS-PL Configuration -> Master InterfaceをHPM0とHPM1に変更 )
   ( Tools->Settings->IP->Repository->追加 imax_IP )
   ( +でemax6_v追加 )
   ( +でProcessor System Resetを2つ追加 )
   ( +でClocking Wizard追加 入力1,出力2 )
   ( SourcesでCreate HDL Wrapper )
   ( Genrate Output Products )
   ( Genrate Bitstream )
  ---
  10.VMK180-step4000/*.xprを使ってvivado開く
  11.Tools -> Settings -> IP -> Repository
  12._IPがあればOK, なければ"+"押して_IPを追加
  13.(上端のバー)Reports -> Report IP Status
  14.(下端のバー)Upgrade Selected
  15.左上に出るOKボタン押す
  16.Generateウィンドウ -> Generate -> OK
  17.OK出たら，Generate Bitstream
  ---
  18.binの作り方はREADME-IMAX.pdf(参考なので見なくて良い)
     % cd proj-arm64/fpga
     % cp ZU19EG-step4000/ZU19EG_16st.runs/impl_1/design_1_wrapper.bit ZU19EG-16st.bit 
  19.ZU19EG-16st.binは,ZU19EG-16st.bitから作る.(cad605/606)
     % ./Gen_bin.sh ZU19EG-16st
  20.alice134にloginして動作確認
  21.# cp proj-arm64/fpga/ZU19EG-16st.bin /lib/firmware
  22.# echo ZU19EG-16st.bin > /sys/class/fpga_manager/fpga0/firmware
     % proj-arm64/sample/mm_cnn_lf/mm-zynq.emax6+dma-16st
  23.起動時設定
     # vi /etc/rc.local (なければ以下追加.起動時に/lib/firmware/xxx.binをFPGAに書き込む)
       echo ZU19EG-16st.bin > /sys/class/fpga_manager/fpga0/firmware
  25.alice134をshutdown.SDCARDをarch11のUSBアダプタに挿す.
  26.# dd bs=64k if=/dev/da4 | /usr/bin/gzip > /tmp/ZU19EG-step4000-20220301.img.gz
  27.% cp /tmp/ZU19EG-step4000-20220301.img.gz ~/proj-arm64/fpga/ZU19EG-step4000-20220301.img.gz
=====================================================================================================

```
-->
### 関連
https://www.youtube.com/watch?v=r8JWZruqKMk

<!--
### 参考
1. Ubuntu 22.04 LTS で NIS Client を設定する
https://qiita.com/Mine02C4/items/d6d5c0731734b4fd7e3c
-->