Slide 1

Slide 1 text

8日で作るオレオレRISC-V CPU 無線と実験_令和版@アックス京都本社 2022/AUG/16 株式会社アックス 松永大輝

Slide 2

Slide 2 text

自己紹介 ● 松永 大輝 (@matsud224) ● 株式会社アックス 勤務 ● 趣味で作ったもの ○ TCP/IP搭載のUNIXライクOS(matsud224/tinyos) ○ オレオレプログラミング言語(matsud224/soramame) ○ Prolog to WAM codeコンパイラ(matsud224/wamcompiler) ○ ラズパイで動くハイパーバイザ( matsud224/raspvisor) ○ GameBoyエミュレータ(matsud224/gb_emu) ○ など...

Slide 3

Slide 3 text

きっかけ ● OSSコンソーシアム様よりTang Primer FPGAをお借りした ● とりあえず遊んでみた ○ 大学の講義で少し触ったVerilog(ハードウェア記述言語)を思い出しながら、論理 を記述 ○ まずは定番のLチカ ○ カラーバーやキャラクタのVGA出力 ■ Verilog以上に、ピンヘッダのはんだ付けに苦戦...

Slide 4

Slide 4 text

きっかけ ● 格安FPGAといえども、まだまだリソースには余裕がある ● せっかくなので、もう少し複雑な論理を書きたい ● そこで、CPUを作ることにした ○ ISAは今流行りのRISC-Vで

Slide 5

Slide 5 text

今回実装したもの ● RISC-V 32bit CPU ○ ソースコード: https://github.com/matsud224/rvcpu/tree/simple-cpu ■ Verilogで記述、500行を切っている ○ 整数命令セット RV32I を実装 ■ 整数演算・分岐・ロード・ストア ● 以降、製作記...

Slide 6

Slide 6 text

0日目:仕様書読み ● RV32Iの仕様は、Specifications - RISC-V International の”Volume 1, Unprivileged Spec”にある ○ たったの18ページ! ○ 40命令ある ● イタリック体のメモ部分が面白い ○ この仕様に決定した理由や、実装上の注意点が書かれている

Slide 7

Slide 7 text

1-2日目:実装 ● 命令から各フィールドを切り出すデコーダの実装 ○ 仕様書の後ろにある”Instruction Set Listings”とにらめっこ ● 1命令の実行に複数サイクル使う実装にした ○ ステートマシンを書く ○ 命令の種類で分岐し、対応する演算やレジスタ書き込み、メモリアクセスを行う ● 趣味ではあるが、まじめにテストも行う ○ riscv-tests (https://github.com/riscv-software-src/riscv-tests) を使用 ○ 命令ごとにテスト(アセンブリ言語で記述)が用意されている ○ Verilogシミュレータ(Icarus Verilog)でシミュレーションを行い、このテストを流す

Slide 8

Slide 8 text

3-4日目:論理合成にかける ● 全テストをパスしたので、次は実機動作を目指す ● が、Tang Primerではリソース不足に ● プログラマ的なVerilog記述になっていたことが原因 ○ さまざまな場所で代入や演算を行っており、演算器が多数生成されてしまっていた ○ (論理合成系がリソースシェアリングしてくれることを期待していたが.....) ● ハードウェアを意識した書き方に変更してみた ○ ALU部を独立させ、オペランドや演算種別の切り替え論理を明示的に記述 ○ リソースシェアリングされるよう、入力オペランドの切り替えを明示的に記述 ○ 書きやすさのために可変回数シフトを使用していたが、必要最小限に減らした ○ 結果、リソース使用量が激減した

Slide 9

Slide 9 text

5-6日目:クロスコンパイル環境構築、ROM・RAM・LEDをCPUに接続 ● ROM, RAMにはFPGAのIPを使用 ● RISC-V用gccでクロスコンパイルしたプログラムをROMに書き込んだ状態で実行 できるようにする ○ ELFから必要なセクションを抽出 ○ FPGAのツールが認識する MIF形式に変換するツールを作成 ● Lチカのために、RGB LEDをメモリにマッピング

Slide 10

Slide 10 text

7日目:Lチカ on 自作RISC-V CPUに成功 ● デバッグを繰り返し... ● RGB LEDの色を順番に切り替える、下記のコードが実機で動作した! ● この時点で、リソース使用はLUT 34%、REG 6%(2コアにできそう??) ● 最大動作周波数は24MHz void main() { volatile unsigned int *led = (volatile unsigned int *)0x1000000; *led = 0; while (1) { for (volatile int i=0; i<2400000; i++); int prev = *led; *led = prev==8 ? 0 : prev+1; } }

Slide 11

Slide 11 text

他にやったこと ● UARTの送信部を追加し、文字を出力できるようにした ● CoreMarkベンチマークを移植し、走らせてみた ○ CoreMark値: 35 ○ CoreMark/MHz値: 1.46 ○ (単純に比較はできないが、 ○ E203は2.14, RocketChipは2.32) 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 1363203067 Total time (secs): 56 Iterations/Sec : 35 Iterations : 2000 Compiler version : GCC11.1.0 Compiler flags : -Wall -O2 -ffreestanding -nostartfiles -T link.ld -march=rv32im -mabi=ilp32 -mno-div Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0x4983 Correct operation validated. See README.md for run and reporting rules.

Slide 12

Slide 12 text

データパス(概略)

Slide 13

Slide 13 text

Tang Primerについて ● 激安FPGAだがRISC-Vコアが載る程度のリソース量はあり、楽しく遊べた ● IDEが簡素で使いやすい ● 論理合成系がかなり不安定 ○ 正しいVerilogコードを入力しても、突然ハングアップすることが多々あった ○ 合成が進むようコードの順番を無意味に入れ替えたりした ○ 論理合成が通ることを祈るしかない ● 中国語マニュアルしか付属しないが、ネットを探せば英語版も見つかった: ○ Tang Dynasty (TD) Software Manual (v4.2, 2018.07) ○ Anlogic Technology EAGLE Series FPGA Data Sheet

Slide 14

Slide 14 text

まとめ ● 素朴なRISC-V CPUを作った ● 動作は遅いが、消費するリソースが少ないという長所はある ● 次はパイプライン化を行ってIPCと動作周波数を上げたい ● FPGAならではの、CPUとはアーキテクチャの異なるアクセラレータも作ってみたい

Slide 15

Slide 15 text

以上