Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emula...

Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emulator made with Ruby

Avatar for hachi (Hayao Kimura)

hachi (Hayao Kimura)

May 11, 2025
Tweet

More Decks by hachi (Hayao Kimura)

Other Decks in Programming

Transcript

  1. 目次 • 大阪府交野市在住 Rubyist • 低レイヤーエケチェン ◦ 京都の?大学で電気電子工学 を修めたんだが… •

    Kernel/VM探検隊は初参加です • 初参加初登壇を選んだことをちょっ と後悔しています hachi (@hachiblog)
  2. 基本情報技術者試験 • 基本 • 大学の時やったなぁみたいな内容が結構出てくる ◦ データ構造 ◦ アルゴリズム ◦

    ネットワーク ◦ etc • マイナスの数の表し方とかも出てくる ◦ 1の補数、2の補数 ◦ 2の補数を一般的には使っていることが多い
  3. 自分の前提知識 • 高校生ぐらいの時に書籍 「CPU の創りかた」を買って放置する • 大学2年生ぐらいの時に実験でロジックICを組み合わせてなんか作る課題 ◦ 全然記憶ない •

    大学4年生ぐらいの時に実験でFPGAでなんかCPUみたいなものを作った気がす る ◦ これは結構楽しかった つまりほぼ無い
  4. 実装した命令 ADD ADDI LUI AUIPC 算術演算 SW ストア JAL ジャンプ

    &リンク SLLI シフト ORI 論理演算 ECALL 環境 CSRRS CSRRW CSRRWI CSR BEQ BNE BLT 分岐
  5. 苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit

    が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8 0b100 -> -4 2147483648 + 32768 = 2147516416
  6. 苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit

    が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8 0b100 -> -4 2147483648 + 32768 = 2147516416 2147483648 + 32768 = 32768
  7. 良くなかった点 • Ruby の Integer は多倍長整数なので 32bit にわざわざ制限してやる必要がある ので面倒 •

    HDL ほどハードウェアに寄ってないので実際どう配線するんだ?みたいなところは わからない
  8. まとめ • Ruby で riscv-tests の add 命令のテストが通る CPU エミュレーターを作った

    • 簡単に CPU の仕組みがまなべるよ(足りないところはたくさんあるので許して • みんなも好きな言語でやってみてね • Next Step は bootloader が動くところまで作りたい