antonblanchard/microwatt を動かした
By takagiwa on Friday, October 11 2019, 21:11 - FPGA - Permalink
OpenPOWER ISA を実装した antonblanchard/microwatt を動かした話。
ただ、Python のライブラリの依存関係がうまく解消できなかったので、OS にインストール済みの Python 関係のパッケージを一旦全部削除、という乱暴なことをしているので、この手順の実用性はいまいちかもしれない。
2019/Oct/28 追記:この点については Pipenv を使えばいいらしい。
あと、本来は bit ファイルのロードも自動でされるはずが、仮想マシンで行っているためか、デバイスが検出できなかったため途中でとまる。手動でロードすれば動作する。
antonblanchard/microwatt を github から取得したのは 2019/Oct/10 。
OS は Xubuntu 18.04 と Ubuntu 18.04 server を使った。Windows 上の VirtualBox 内にインストール。メモリは 4GB 割り当て。ストレージは Vivado を入れるので 100GB 確保。
ここではアカウントは user でセットアップしている。
先に /etc/resolv.conf を編集して nameserver にルーターなり DNS なり登録しておかないといけないと思う。
何はなくとも OS アップデート。
$ sudo apt update $ sudo apt upgrade
Xubuntu なら SSH サーバーも起動。
$ sudo apt install -y openssh-server $ sudo systemctl enable ssh $ sudo systemctl restart ssh
必要なパッケージを取ってくる
$ sudo apt install build-essential git make gnat zlib1g-dev texinfo curl
Python のパッケージが、OS が提供するパッケージと pip で入れるパッケージで衝突して面倒だったので、OS のを削除。これでいいかは分からない。本当は Python3 本体は残しても良かったんだけど、消された。Python3 に依存しているその他のものも消されてしまう。
$ sudo dpkg -l | gawk '{print $2}' | grep -E "^python3-" | xargs sudo apt remove -y
Python3 関係を少しだけ入れ直す。
$ sudo apt install python3 python3-distutils $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ sudo python3 get-pip.py
Xubuntu では Python2 も入っている。これも削除したけれど、きっとシステムに影響がある。
If it isn't available on your distro grab the powerpc64le-power8 toolchain from https://toolchains.bootlin.com
とあるので、リンク先からツールチェインを取得。
~/download/ にダウンロードした場合で。展開してパスを通しておく。
$ tar jvxf ./download/powerpc64le-power8--glibc--stable-2018.11-1.tar.bz2 $ export PATH="$PATH:/home/user/powerpc64le-power8--glibc--stable-2018.11-1/bin"
Build micropython. If you aren't building on a ppc64le box you will need a cross compiler.
とあるので、書かれているとおり micropython をビルドする。
$ git clone https://github.com/mikey/micropython $ cd micropython $ git checkout powerpc $ cd ports/powerpc $ make -j$(nproc) $ cd ../../../
Microwatt uses ghdl for simulation. Either install this from your distro or build it.
とあるので GHDL をビルドしてインストールする。ここでは書かれていないけれど、GHDL は GCC backend のものが必要らしい。そのためには gcc のソースが必要。
この環境では gcc は 7.4.0 だったので、念のため gcc のソースも https://ftp.gnu.org/gnu/gcc/ ここから gcc-7.4.0.tar.gz をダウンロード。
$ tar zvxf ./download/gcc-7.4.0.tar.gz
GHDL のドキュメント の Hint にあるとおり、依存関係はスクリプトにお任せ。
$ cd gcc-7.4.0 $ ./contrib/download_prerequisites $ cd ..
で本番。だいたいドキュメントどおり。
$ git clone https://github.com/ghdl/ghdl $ cd ghdl $ mkdir build $ cd build $ ../configure --with-gcc=/home/user/gcc-7.4.0 --prefix=/usr/local $ make copy-sources $ mkdir gcc-objs $ cd gcc-objs $ /home/user/gcc-7.4.0/configure --prefix=/usr/local --enable-languages=c,vhdl --disable-bootstrap --disable-lto --disable-multilib --disable-libssp --disable-libgomp --disable-libquadmath $ make -j$(nproc) $ sudo make install
念のため起動するかチェック。
$ ghdl -v
続き。
$ cd .. $ make ghdllib $ sudo make install $ cd ~
これでやっと microwatt に進める。
$ git clone https://github.com/antonblanchard/microwatt $ cd microwatt $ make $ ln -s ../micropython/ports/powerpc/build/firmware.bin simple_ram_behavioural.bin
で、シミュレーション?
$ ./core_tb > /dev/null MicroPython v1.11-320-g7747411e9 on 2019-10-11; bare-metal with POWERPC Type "help()" for more information. >>> 1+2 3 >>> Terminated
ここで、/dev/null にちゃんとリダイレクトしておかないとよくわからないことになる。
1+2 はユーザー入力。しばらくすると 3 が返ってくる。
Ctrl+C や Ctrl+D がどうにも効かなかったので、他の端末を開いて、
$ pkill core_tb
終了させると Terminated になる。
順番を入れ替えて、先に FuseSoC を入れる。
$ sudo pip install fusesoc
Vivado を入れる。リポジトリのドキュメントに合わせて、2019.1 を入れる。
Vivado のセットアップは GUI が必要で、Ubuntu server 側は Windows に Xming を入れて対応。
C:\Program Files (x86)\Xming\X0.hosts に Ubuntu server の IP アドレスをセットして、
$ export DISPLAY=WindowsマシンのIPアドレス:0.0 $ sudo apt install libxrender-dev libxtst-dev
でセットアップ。
$ tar zvxf ./download/Xilinx_Vivado_SDK_2019.1_0524_1430.tar.gz $ cd Xilinx_Vivado_SDK_2019.1_0524_1430 $ sudo ./xsetup
今回は無償で利用できる WebPACK を選択。
デバイス選択は、ひとまずありそうなものに絞ってみた。
最終的な設定はこんな感じ。
上の画像のとおりに UG973 を参考にケーブルドライバをインストールする。
$ cd /tools/Xilinx/Vivado/2019.1/data/xicom/cable_drivers/lin64/install_script/install_drivers/ $ sudo ./install_drivers INFO: Installing cable drivers. INFO: Script name = ./install_drivers INFO: HostName = microwatt-u INFO: Current working dir = /tools/Xilinx/Vivado/2019.1/data/xicom/cable_drivers/lin64/install_script/install_drivers INFO: Kernel version = 4.15.0-65-generic. INFO: Arch = x86_64. Successfully installed Digilent Cable Drivers --File /etc/udev/rules.d/52-xilinx-ftdi-usb.rules does not exist. --File version of /etc/udev/rules.d/52-xilinx-ftdi-usb.rules = 0000. --Updating rules file. --File /etc/udev/rules.d/52-xilinx-pcusb.rules does not exist. --File version of /etc/udev/rules.d/52-xilinx-pcusb.rules = 0000. --Updating rules file. INFO: Digilent Return code = 0 INFO: Xilinx Return code = 0 INFO: Xilinx FTDI Return code = 0 INFO: Return code = 0 INFO: Driver installation successful. CRITICAL WARNING: Cable(s) on the system must be unplugged then plugged back in order for the driver scripts to update the cables.
ここでボードを接続しておこう。Nexys Video なら PROG と UART をつなぎ、JP4 は USB/SD、JP3 は USB にして電源を入れる。
VirtualBox の Device → USB で Digilent USB Device と FTDI FT232R USB UART を有効にする。
セットアップが終わったら続き。
$ cd ~ $ source /tools/Xilinx/Vivado/2019.1/settings64.sh $ mkdir microwatt-fusesoc $ cd microwatt-fusesoc $ fusesoc library add microwatt /home/user/microwatt/ $ fusesoc run --target=nexys_video microwatt --memory_size=8192 --ram_init_file=/home/user/microwatt/fpga/hello_world.hex
ただ、エラーになってしまった。デバイスが検出できないらしい。
****** Vivado v2019.1.3 (64-bit) **** SW Build 2644227 on Wed Sep 4 09:44:18 MDT 2019 **** IP Build 2633630 on Wed Sep 4 12:30:14 MDT 2019 ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. source microwatt_0_pgm.tcl # set bit microwatt_0.bit # set part xc7a200tsbg484-1 # open_hw # connect_hw_server INFO: [Labtools 27-2285] Connecting to hw_server url TCP:localhost:3121 INFO: [Labtools 27-2222] Launching hw_server... INFO: [Labtools 27-2221] Launch Output: ****** Xilinx hw_server v2019.1.3 **** Build date : Sep 4 2019 at 10:02:20 ** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved. # set found 0 # foreach { hw_target } [get_hw_targets] { # current_hw_target $hw_target # open_hw_target # foreach { hw_device } [get_hw_devices] { # if { [string first [get_property PART $hw_device] $part] == 0 } { # puts "Found hardware target with a ${part} device." # current_hw_device $hw_device # set found 1 # break # } # } # if {$found} {break} # close_hw_target # } INFO: [Labtoolstcl 44-466] Opening hw_target localhost:3121/xilinx_tcf/Digilent/210276689791 ERROR: [Labtools 27-2269] No devices detected on target localhost:3121/xilinx_tcf/Digilent/210276689791. Check cable connectivity and that the target board is powered up then use the disconnect_hw_server and connect_hw_server to re-register this hardware target. ERROR: [Common 17-39] 'open_hw_target' failed due to earlier errors. while executing "open_hw_target" ("foreach" body line 3) invoked from within "foreach { hw_target } [get_hw_targets] { current_hw_target $hw_target open_hw_target foreach { hw_device } [get_hw_devices] { if { [strin..." (file "microwatt_0_pgm.tcl" line 11) INFO: [Common 17-206] Exiting Vivado at Fri Oct 11 04:23:51 2019... ERROR: Failed to run ::microwatt:0 : 'vivado' exited with an error code
vivado を起動して Hardware Manager を使っても1回目はデバイスが検出できなかったものの、もう一度トライしたら検出できた。ただスクリプトをもう一度動かしてもだめだった。
bit ファイルは build/microwatt_0/nexys_video-vivado/microwatt_0.bit として出力はされているので、これをロードすればどうさする、はず。ただ hello world は見えなかった。
micropython の方は動作が見える。
$ fusesoc run --target=nexys_video microwatt
相変わらず bit ファイルのロードはしてくれないものの、さっきと同じファイル名で出力されているので、vivado を起動してロードできる。
シリアルコンソールは例えば screen が使える。ここではシリアルポートは /dev/ttyUSB2 だった。
$ sudo screen /dev/ttyUSB2 115200 (Enter キーを押すとプロンプトがでてくる) >>> >>> 1+2 3
終了するときは、例えば Ctrl+a のあと k で kill できる。
Testing
一応、
$ cd ~/microwatt $ make -j$(nproc) check
で実行できるらしい。ただ実機は使ってない模様。