Raspberry Pi 4でhw_serverを動かす
Raspberry Pi 4でhw_serverを動かす
Vivadoのhw_serverをRaspberry Pi 4で動かしてみたので、手順を記録しておく。
必要なもの
-
x86_64なLinux環境
- WSLでもよい
-
Raspberry Pi 3または4
- aarch64でしか確認していない
- ARM32でも動くとは思うが性能的に行けるかは不明
Raspberry PiにはUbuntu 20.04を入れていることを前提とするが、RaspbianやUbuntu 18.04でも行けると思われる。 (未確認)
ただし、aptで入るQEMUに問題があるので、QEMUのビルドが必要。
動かしたいhw_serverの準備
Raspberry Pi単体でインストールまでできればよかったが、Xilinxのインストーラー(xsetup)がJava+ネイティブライブラリで構成されていて、QEMUのUser Emulationだといつまでたっても終わらなかった。
仕方がないのでx86_64なUbuntu上にまずはインストールする。(というかコンテナのビルドまでやった方が速いかも)
Xilinxのダウンロードページから、使いたいhwserverを含むインストーラをダウンロードしておく。
以下の説明では執筆時点での最新版 (2020.1) の Unified Installer (Xilinx_Unified_2020.1_0602_1208_Lin64.bin) を使うこととする。
./Xilinx_Unified_2020.1_0602_1208_Lin64.bin --noexec --keep --target Xilinx_Unified_2020.1
cd Xilinx_Unified_2020.1
./xsetup -b AuthTokenGen # 認証トークンの生成。XilinxアカウントのUser IDとパスワードを聞かれたら入力する。
./xsetup -a 3rdPartyEULA,WebTalkTerms,XilinxEULA -b Install -p "Hardware Server" -e "Hardware Server (Standalone)" -l $HOME/hwserver
これで $HOME/hwserver
に hw_serverがインストールされるので、Raspberry Piにコピーしておく。
docker周りの準備
dockerのインストール
Raspberry Piにdockerを入れていないのであれば
sudo apt install -y docker.io
dockerイメージの作成
以下のDockerfileを HWSRVR
があるディレクトリにおいて、 docker build
を実行する。
FROM amd64/ubuntu:18.04
ARG HWSERVER_VERSION=2020.1
ENV HWSERVER_VERSION_ENV=${HWSERVER_VERSION}
RUN mkdir -p /tools/Xilinx
COPY HWSRVR /tools/Xilinx/HWSRVR
EXPOSE 3121
ENTRYPOINT /tools/Xilinx/HWSRVR/$HWSERVER_VERSION_ENV/bin/hw_server
docker build -t hwserver .
コンテナの作成と実行
以下のコマンドでhwserverが実行できるので、あとは外部のVivadoやxsdbから接続を確認する。
docker run -d --rm -v /dev:/dev --privileged -p 3121:3121 hwserver
Raspberry Pi 4のIPが 192.168.2.54
の場合、Vivadoが入っているマシンでxsdbを実行した結果を示す。
kenta@Prometheus:~/Xilinx_Unified_2020.1$ xsdb
rlwrap: warning: your $TERM is 'screen-256color' but rlwrap couldn't find it in the terminfo database. Expect some problems.
****** Xilinx System Debugger (XSDB) v2020.1
**** Build date : May 27 2020-20:33:44
** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.
xsdb% connect -url TCP:192.168.2.54:3121
tcfchan#0
xsdb% targets
1 xc7a100t
2 MicroBlaze Debug Module at USER2
3 MicroBlaze #0 (Running)
xsdb% exit
exit
コンテナの停止
docker ps
でコンテナの名前を調べて docker kill
でコンテナを停止する。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1118e17bcc93 hwserver "/bin/sh -c /tools/X…" 7 minutes ago Up 7 minutes 0.0.0.0:3121->3121/tcp keen_jennings
$ docker kill keen_jennings
keen_jennings
Ubuntu 18.04以下の場合
Raspberry Piで使うUbuntuがUbuntu 18.04以下の場合、
- dockerが古いからか、自分でQEMUをコンテナに入れる必要がある
- aptで入るQEMUに問題がある
ので、QEMUのビルドとdockerコンテナへのQEMUの追加が必要。
QEMUのビルド
sudo apt install build-essential ninja-build libglib2.0-dev pkg-config
git clone --recursive https://github.com/qemu/qemu
mkdir -p qemu/build
cd qemu/build
../configure --static --disable-system --enable-linux-user --target-list=x86_64-linux-user
ninja
dockerイメージの作成
-
qemu-x86_64-static
を入れたコンテナを作る -
エラーがでて起動できないはず
docker run -it --network host amd64/ubuntu:18.04
- コンテナはできてるので、名前かIDを調べる。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9af0a467972d amd64/ubuntu:18.04 "/bin/bash" 22 minutes ago Exited (0) 4 seconds ago reverent_kare
- コンテナにQEMUをコピーする
-
qemu-x86_64
を、コンテナ内の/usr/bin/qemu-x86_64-static
にコピー
-
cd qemu/build
docker cp qemu-x86_64 reverent_kare:/usr/bin/qemu-x86_64-static
Discussion