$30 off During Our Annual Pro Sale. View Details »

8日で作るオレオレRISC-V CPU

8日で作るオレオレRISC-V CPU

Daiki Matsunaga

August 16, 2022
Tweet

More Decks by Daiki Matsunaga

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. 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;
    }
    }

    View Slide

  11. 他にやったこと
    ● 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.

    View Slide

  12. データパス(概略)

    View Slide

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

    View Slide

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

    View Slide

  15. 以上

    View Slide