背景
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の回路設計からプログラムのビルドまでできるので、気になった部分を深堀出来るのが個人的に嬉しいです。
何かの参考になれば嬉しいです。
Lattice社FPGAの記事が少ない中,貴重なレポートと思います.RISC-V が載るのですね.LUTの使用率,Embedded RAM 使用率はどれ位かご教示願えますか?
返信削除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
Asuki Kono 様,詳しい返信をありがとうございます.とても助かります.私は,Xilinx社FPGAボードと開発ツール(Vivado)を少し使ったことがありますが,Lattice社と RISC-Vは未経験です.早速iCE40-HX8Kを買って同じように試してみたいと思います.ひとまずお礼まで.
返信削除お返事ありがとうございます。
削除自分もLatticeのFPGAやRISC-Vに関して分かっていないことが多いですが、情報が参考になったなら嬉しいです。