記事の概要
フリーのRISC-VプラットフォームSiFive Freedom E310をFPGAボードArty A7に書き込みます。
以下のサイトにある手順に従うだけでいいはずなのですが、私は細かい点につまづいて難儀したので、同様の問題に直面した人の参考になるように作業工程を残したく思います
https://github.com/sifive/freedomのREADME
SiFive Freedom E310 Arty FPGA DevKitGetting Started Guide
Freedom E300 Arty DevKit でRISCVを試す
作業環境はUbuntu 18.04.3 LTSになります。
ただし、mcsファイルのFPGAボードへの書き込みにのみWindows環境を使用しました。
FPGAボード
秋月電子で以下を購入しました。
Xilinx社のArtix-7 35Tを搭載したFPGA評価キット
秋葉原店で直接購入される場合は、店頭には置いていないのでスタッフの方に依頼して倉庫から持ってきていただいてください。
Arty A7のFPGAボードは35Tと100Tの2種類ありますが、¥15,800の安い方の35Tを選びました。
また、間違えてArty S7を購入しないようにご注意ください。
ダウンロード
SiFive Freedom E310をダウンロードします
$ git clone https://github.com/sifive/freedom.git
$ cd freedom
freedomで使用するsubrepositoryをupdateします。
私の場合、toolchainの更新に1時間以上を要しました。
$ git submodule update --init --recursiv
追加パッケージ
追加パッケージをインストールします。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev python wget
$ sudo apt-get install default-jre
既にインストール済みのものは無視されるだけなので、上記コマンドをそのまま入力すれば問題ありません。
環境構築
sbt、varilator、scala、toolchainのriscv64-unknown-elf-gcc、vivadoをインストールしないといけないのですが、私は既に以下の手順でインストール済みなのでパスします
ビルド
riscv64-unknown-elf-gccにパスを通します。
pathの位置が手順書と異なっているのでご注意ください。各位の環境に合わせてご変更ください。
私の場合、/opt/riscv/bin/riscv64-unknown-elf-gccなので以下を実行します
$ export RISCV=/opt/riscv
(2019/10/27追記)
後で紹介するfreedom-e-sdkのビルドは最新のgccを使用しないとビルドエラーになるので、この段階でそちらを使用した方がいいかもしれません。
https://www.sifive.com/boards
上記サイト中央位置にある「GNU Embedded Toolchain — v2019.08.0」のUbuntu版をインストールして、各位の環境に合わせてpathを指定ください。
$ export RISCV=${HOME}/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14
(追記終わり)
手順書ではvivadoにもパスを通すように指示されていましたが、私の環境では必要ありませんでした。
以下のコマンドを実行してmcsファイルを生成します。
$ make -f Makefile.e300artydevkit verilog
$ make -f Makefile.e300artydevkit mcs
正常に完了すればfreedom/builds/e300artydevkit/objフォルダにE300ArtyDevKitFPGAChip.mcsファイルが生成されています。
私の場合、2番目のmcsファイル生成コマンド実行時に以下のエラーメッセージが出ました。
ERROR: [Board 49-71] The board_part definition was not found for digilentinc.com:arty:part0:1.1. The project's board_part property was not set, but the project's part property was set to xc7a35ticsg324-1L. Valid board_part values can be retrieved with the 'get_board_parts' Tcl command. Check if board.repoPaths parameter is set and the board_part is installed from the tcl app store.
原因はvivadoにArtyのボード定義ファイルが入っていないことでした。
以下からボード定義ファイルをダウンロードします。
vivado-boards-master/new/board_filesに置いてあるファイルをvivadoのdata/boards/board_filesフォルダにコピーします。
普通にコピー&ペーストできない場合は、管理者権限でcpコマンドを実行してください。
sudo cp -r vivado-boards-master/new/board_files/* /tools/Xilinx/Vivado/2019.1/data/boards/board_files/
(参考)
ひでみのアイデア帳
FPGAボードへの書き込み
私はmacのVirtualBoxでUbuntuを使用しているのですが、USBがFPGAボードを認識しませんでした。
以下のサイトなどを参照して色々と試しましたが、認識されませんでした。
MacでVirtualBox上にてUSB機器を認識しない時の対処
そこで仕方なく、ARty A7への書き込みはwindows環境のvivadoで行いました。
まずvivadoを起動後、「Flow」→「Open Hardware Manager」を選択してください。
「Open Target」→「Auto Connect」でArty A7が選択されます。
次にFPGAボード名「xc7a35t」を右クリックして「Add Configuration Memory Device」を選択してください。
ここで手順書では以下を選択するように書かれています
- 25q128-3.3v-spi-x1_x2_x4
- Micron
- 128
- spi
- x1_x2_x4
ですが、私の購入したFPGAボードに搭載されていたのは別のメモリでした。
- s25fl128sxxxxxx0
- Spansion
- 128
- spi
- x1_x2_x4
正しいメモリを選択した上で「Do you want to program the configuration memory device now?」にOKします。
次にConfiguration file にE300ArtyDevKitConfig.mcs を選択して実行します。
書き込みに成功したら、ボード上のPROGボタンを押してください。
FPGAボード上の3つのLED、LD4、LD5、LD6が点灯します。
次にすること
freedom-e-sdkには様々なサンプルが置かれています。
次はこれらを実際に試してみたいと思います。
(2019/10/27追記)
freedom-e-sdk サンプルプログラムのビルドを追加しました
freedom-e-sdk サンプルプログラムのビルド
freedom-e-sdkには幾つかのサンプルがあります。
今回は試しに"hello"をビルドしてみます。
このサンプルプログラムは/opt/riscv/bin/riscv64-unknown-elf-gccでは正常にビルドできませんでした。
フォーラムなどを見たところ、gccのバージョン違いがエラーの原因になるようです。
そこでSiFiveのサイトから適切なバージョンを直接ダウンロードします
上記リンク先から、以下の3項目のUbuntu版をインストールしてください。
- GNU Embedded Toolchain — v2019.08.0
- OpenOCD — v2019.08.2
- QEMU — v2019.08.0
ビルドに必要なのは「GNU Embedded Toolchain — v2019.08.0」だけですが、OpenOCDはFPGAボードへの書き込み時に使用するので、インストールしておきます。
QEMUは念の為にインストールしておきました。
次にパスを通します。.bashrcを編集します。
$ vi ./.bashrc
binファイルのある階層を以下のように記述します。
インストールした場所に応じて変更してください。
# FREEDOM E SDK
export RISCV_OPENOCD_PATH=/home/kosukematsui/riscv-openocd-0.10.0-2018.12.0-x86_64-linux-ubuntu14
export RISCV_PATH=/home/kosukematsui/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14
以上の準備が済みましたら、freedom-e-sdkをダウンロードします
$ git clone --recursive https://github.com/sifive/freedom-e-sdk.git
$ cd freedom-e-sdk
$ git submodule update --init --recursive
以下のコマンドでビルドが実行されます。
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] software
もしくは
$ make BSP=metal PROGRAM=hello TARGET=freedom-e310-arty software
ビルドに成功すると、/hello/debugの階層に、hello.elfファイル、hello.hexファイル、hello.lstファイルが生成されています。
再ビルドする場合は、ビルド前にcleanで削除してください。
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] clean
JTAG接続した状態で以下のコマンドを実行すると、FPGAボードに書き込まれるそうです。
私はOlimex ARM-USB-TINY-H を取り寄せ中なので、まだ試せていません。
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] upload
(追記)
Olimex ARM-USB-TINY-H を用いて、実際にアップロードできることを確認しました。
SiFive Freedom E310のサンプルプログラムをArty A7に書き込む
参考
本記事作成後に以下の記事を見つけました。
とても詳細に手順が説明されているのでご参照ください。
RISC-VをArty A7 FPGA用にビルドする方法
RISC-VをArty A7 FPGAに実際に書き込む
RISC-VをFreedom Studioでビルド・デバッグする方法
(2019/10/27追記)
InterFace 2019年12月号の7章「定番ボードではじめるRISC-Vマイコン」でHiFiveボードを対象に、freedom-e-sdkのビルドと書き込み手順が紹介されていました。
本記事の手順よりも洗練されていると感じたので、是非ご参照ください。
その記事では、更にリアルタイムOS Zephyrの実装、OS上で動作するアプリの作成方法まで紹介されており、Arty A7でも同様のことができるか試してみたいと思います。