2018年12月1日土曜日

iCE40-HX8K(FPGA)でRISC-Vシステムを動かしてみた


背景

iCE40-HX8Kとは、Lattice社が製造販売しているFPGA(回路をプログラムのように合成できるハードウェア)です。
RISC-Vとは、CPUなどで使われるオープンソースの命令セットです。

iCE40-HX8KでRISC-Vシステムを動かすicicleというプロジェクトを見つけたので、動かしてみました。備忘録を兼ねて、実現手順や動作内容を共有します。

使ったもの

icestormが使えるPC

icestormとは、iCE40系のFPGAの回路を合成できる、オープンソースのプログラムです。
この記事ではUbuntu18.04にicestormをインストールして動作を確認しました。
環境構築手順は、icestormのインストール手順自分が書いた過去の記事(iCE40向けにIceStormで回路を合成してLEDを点滅させてみた)が参考になると思います。

iCE40-HX8K Breakout Board


LatticeのiCE40-HX8KというFPGAが載っているボードです。
Latticeのオンラインストアで購入できます。

iCE40-HX8K Breakout Board

icicleのコード

iCE40-HX8Kなどで動かせる、32bit RISC-Vシステムです。

grahamedgecombe/icicle | 32-bit RISC-V system on chip for iCE40 FPGAs

後ほど(「icicleを実行」で)ダウンロードとビルド方法を説明します。

RISC-Vの開発環境を構築

icicleのコードでRISC-VのCPUをFPGAで動かすには、icestormで合成する回路だけでなく、その環境で動かすプログラムが必要です。
記事を書いている時点では、icicleはriscv64-unknown-elf-gccというコンパイラを利用して、プログラムをCPUで実行可能なようにコンパイルしていました。
(Makefileに記述されていて、makeコマンド事項すると呼び出されます。)

riscv-gnu-toolchainのREADMEを参考にしながら、下記のようなコマンドを実行すると riscv64-unknown-elf-gcc が使えるようになります。
cloneに1時間くらい、ビルドに数時間かかるので、電波や電源が安定している環境で行うのが良いと思います。
このコマンドは ~/gitprojectsディレクトリにriscv-gnu-toolchainをダウンロードして、ビルドしています。
sudo apt install -y git autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
mkdir -p ~/gitprojects
cd ~/gitprojects
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv
sudo mkdir -p /opt/riscv
sudo chown $USER:$USER /opt/riscv
make
echo '# riscv
export PATH=$PATH:/opt/riscv/bin
' >> ~/.bashrc
source ~/.bashrc

icicleを実行

icestormとriscv64-unknown-elf-gccがPCにインストールできれば、下記のようなコマンドでicicleをビルドできます。
このコマンドは~/gitprojectsディレクトリにicicleをダウンロードしてビルドしています。
cd ~/gitprojects
git clone https://github.com/grahamedgecombe/icicle.git
cd icicle
make

PCにHX8K Breakout Boardを接続して下記のコマンドを実行すれば、回路とプログラムをFPGAボードに転送して、FPGAがrisc-vとして動作します。
cd ~/gitprojects/icicle
make flush

動作確認

確認内容

icicleのREADMEによると、記事を書いている時点では、メモリ操作でUARTとLEDの点灯ができるとのことでした。


それらの動作を確認してみます。

シリアル通信の内容を確認

メモリの値を書き換えるプログラム(progmem.c)を見ると、ボードレート9600bpsで1秒ごとに「Hello, workd!」と表示するようになっています。

screenを使う場合は、下記のコマンドでシリアルモニタを開けます。
screen [dev/ttyUSB0などポートのパス]
screenは「Ctrl + a」 -> 「k」 -> 「y」 -> エンター で終われます。

個人的にscreenはあまり使い勝手が良くないと思うので、ArduinoIDEやPlatformIOをPCにインストールしているのであれば、そちらのシリアルモニタで確認するのが良いと思います。

FPGAボードをPCに接続して、表れたポートに9600bpsでシリアル接続すると一定時間ごとに「Hello, world!」と表示されました。


LEDの光り方を確認

メモリの値を書き換えるプログラム(progmem.c)でLEDを0xAA(2進数だと10101010)と点灯させる記述があるため、LEDがそのように点灯しました。


まとめ

iCE-HX8Kが載ったボードで、RISC-Vシステムを動かせました。
オープンソースの開発環境でCPUの回路設計からプログラムのビルドまでできるので、気になった部分を深堀出来るのが個人的に嬉しいです。

何かの参考になれば嬉しいです。

4 件のコメント :

Koroyuki-Taiwan-Life さんのコメント...

Lattice社FPGAの記事が少ない中,貴重なレポートと思います.RISC-V が載るのですね.LUTの使用率,Embedded RAM 使用率はどれ位かご教示願えますか?

Asuki Kono さんのコメント...

icicleのREADMEのSize and performanceに「The entire system on chip currently occupies around 3,000 LUTs on an iCE40 when synthesized with Yosys.」とあるので、3000LUT前後だと思います。

詳しい内容を確認したいのでしたら、icicleでmakeしたときに実行されるyosysコマンドから-qオプションを取るとログが表示されるので、ご自分でコマンドを実行してそのログを確認するのが良いかと思います。
2019/05/04時点のコードをpullして-q無しでyosysコマンドを実行すると、このような内容が表示されました。
表示される内容に関して自分はまだ良くわかりませんが、cellsやSB_LUT4が回路規模の参考になりそうな気がします。

Number of cells: 3844
SB_CARRY 278
SB_DFF 66
SB_DFFE 393
SB_DFFESR 401
SB_DFFESS 1
SB_DFFSR 174
SB_DFFSS 1
SB_IO 2
SB_LUT4 2507
SB_PLL40_CORE 1
SB_RAM40_4K 20

koroyuki さんのコメント...

Asuki Kono 様,詳しい返信をありがとうございます.とても助かります.私は,Xilinx社FPGAボードと開発ツール(Vivado)を少し使ったことがありますが,Lattice社と RISC-Vは未経験です.早速iCE40-HX8Kを買って同じように試してみたいと思います.ひとまずお礼まで.

Asuki Kono さんのコメント...

お返事ありがとうございます。
自分もLatticeのFPGAやRISC-Vに関して分かっていないことが多いですが、情報が参考になったなら嬉しいです。