Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emula...
Search
hachi (Hayao Kimura)
May 11, 2025
Programming
5
2k
Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emulator made with Ruby
hachi (Hayao Kimura)
May 11, 2025
Tweet
Share
More Decks by hachi (Hayao Kimura)
See All by hachi (Hayao Kimura)
PicoRuby で拓く電子工作の世界/The World of Electronics Projects Opened by PicoRuby
hayaokimura
2
350
RISC-V CPU emulator made with Ruby
hayaokimura
2
76
Fiber Scheduler vs. General-Purpose Parallel Client
hayaokimura
1
630
社内でGemを読む会をして捗っている/Progressing Well: A Gem Reading Session at Work
hayaokimura
1
63
Raw HID とOLEDで広げるキーボードの可能性/Expanding Keyboard Possibilities with Raw HID and OLED
hayaokimura
0
110
freee請求書プロダクトにおけるFiber活用/Utilization of Fiber in the freee Invoice Product
hayaokimura
1
150
いいチームでいるためにやっていること/Things we are doing to remain a good team
hayaokimura
2
710
やりたいことを仕事でやる技術 / The Technique of Turning Your Passion into Your Profession
hayaokimura
0
9.4k
Drive Your Code ~ Building an RC Car by Writing Only Ruby~
hayaokimura
2
2.6k
Other Decks in Programming
See All in Programming
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
120
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
150
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
290
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.5k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
440
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.4k
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
330
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
570
Implementation Patterns
denyspoltorak
0
140
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
830
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
160
Featured
See All Featured
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
410
WENDY [Excerpt]
tessaabrams
9
35k
Building AI with AI
inesmontani
PRO
1
600
We Have a Design System, Now What?
morganepeng
54
8k
Done Done
chrislema
186
16k
GitHub's CSS Performance
jonrohan
1032
470k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
170
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
270
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
67
Game over? The fight for quality and originality in the time of robots
wayneb77
1
72
Transcript
Ruby で作る RISC-V CPU エミュレーター hachi 2025/05/10
目次 • 大阪府交野市在住 Rubyist • 低レイヤーエケチェン ◦ 京都の?大学で電気電子工学 を修めたんだが… •
Kernel/VM探検隊は初参加です • 初参加初登壇を選んだことをちょっ と後悔しています hachi (@hachiblog)
なんで Ruby で? 作って意味ある?🤔
まあ聴いてくれ
2025年3月初旬
技術書典18サークル応募
技術書典18サークル応募
None
実践で学ぶ基本情報を テーマにしてみるか
基本情報技術者試験の本をちょっと読む
基本情報技術者試験 • 基本 • 大学の時やったなぁみたいな内容が結構出てくる ◦ データ構造 ◦ アルゴリズム ◦
ネットワーク ◦ etc • マイナスの数の表し方とかも出てくる ◦ 1の補数、2の補数 ◦ 2の補数を一般的には使っていることが多い
なんで2の補数がいいんだっけ
作ってみればわかるか?
CPU作ってみるかー
ちなみに
ちなみに
自分の前提知識 • 高校生ぐらいの時に書籍 「CPU の創りかた」を買って放置する • 大学2年生ぐらいの時に実験でロジックICを組み合わせてなんか作る課題 ◦ 全然記憶ない •
大学4年生ぐらいの時に実験でFPGAでなんかCPUみたいなものを作った気がす る ◦ これは結構楽しかった
自分の前提知識 • 高校生ぐらいの時に書籍 「CPU の創りかた」を買って放置する • 大学2年生ぐらいの時に実験でロジックICを組み合わせてなんか作る課題 ◦ 全然記憶ない •
大学4年生ぐらいの時に実験でFPGAでなんかCPUみたいなものを作った気がす る ◦ これは結構楽しかった つまりほぼ無い
早速作っていこう
前提知識
CPUエミュレーター
一般的なCPU(エミュレーター)の構成 レジスタ CPU デコーダ 演算器 メモリ
一般的なCPU(エミュレーター)の動き①フェッチ レジスタ CPU デコーダ 演算器 メモリ Program Counter 0x34202f73 0x800001a0
一般的なCPU(エミュレーター)の動き②デコード レジスタ CPU デコーダ 演算器 メモリ 0x34202f73
一般的なCPU(エミュレーター)の動き②デコード レジスタ CPU デコーダ 演算器 メモリ 0x34202f73 34202f73
一般的なCPU(エミュレーター)の動き②デコード レジスタ CPU デコーダ 演算器 メモリ 0x34202f73 34202f73 110100001000000010111101110011
一般的なCPU(エミュレーター)の動き②デコード レジスタ CPU デコーダ 演算器 メモリ 0x34202f73 4c771663 1001100011101110001011001100011 bne
a4,t2,8000066c
一般的なCPU(エミュレーター)の動き③実行 レジスタ CPU デコーダ 演算器 メモリ bne a4,t2,8000066c
一般的なCPU(エミュレーター)の動き③実行 レジスタ CPU デコーダ 演算器 メモリ bne a4,t2,8000066c a4,t2
一般的なCPU(エミュレーター)の動き③実行 レジスタ CPU デコーダ 演算器 メモリ bne a4,t2,8000066c a4,t2 8000066c
Program Counter
RISC-V(リスクファイブ) • オープンソースの命令セットアーキテクチャ • RISC(reduced instruction set computer) というように基本の命令セット数が少な い
• 現状PC の CPU としての事例はまだ少なく、マイコンや特定の用途が多い
RISC-V(リスクファイブ) • オープンソースの命令セットアーキテクチャ • RISC(reduced instruction set computer) というように基本の命令セット数が少な い
• 現状PC の CPU としての事例はまだ少なく、マイコンや特定の用途が多い
RISC-V(リスクファイブ) • オープンソースの命令セットアーキテクチャ • RISC(reduced instruction set computer) というように基本の命令セット数が少な い
• 現状PC の CPU としての事例はまだ少なく、マイコンや特定の用途が多い
今回作るもののスコープ
今回作るもののスコープ add 命令テストが pass する
今回作るもののスコープ add 命令テストが pass する
実装した命令 ADD ADDI LUI AUIPC 算術演算 SW ストア JAL ジャンプ
&リンク SLLI シフト ORI 論理演算 ECALL 環境 CSRRS CSRRW CSRRWI CSR BEQ BNE BLT 分岐
実装方針 • とりあえず基本のレジスタ、メモリ、デコーダあたりを作る • テストを実行する • 実行不可能な命令が来たら例外を吐く ◦ 実装する •
テストが通る!
実装方針 • とりあえず基本のレジスタ、メモリ、デコーダあたりを作る • テストを実行する • 実行不可能な命令が来たら例外を吐く ◦ 実装する •
テストが通る!
実装 • RISCV32CPU class を作成 • load_program method でプログラムをメモリに読み込む •
execute method でプログラムを実行
実装 • RISCV32CPU class を作成 • load_program method でプログラムをメモリに読み込む •
execute method でプログラムを実行
実装
実装
実装
実装 これだけ!
実装
苦労したポイント①テスト用バイナリの作成 • riscv-tests は自分でコンパイルする必要がある ◦ Apple Silicon では結局うまくいかなかった ◦ Docker
on rosetta2 も撃沈 ◦ 結局 Linux 機を引っ張り出してくるとすんなり実行できた
苦労したポイント①テスト用バイナリの作成 • riscv-tests は自分でコンパイルする必要がある ◦ Apple Silicon では結局うまくいかなかった ◦ Docker
on rosetta2 も撃沈 ◦ 結局 Linux 機を引っ張り出してくるとすんなり実行できた
苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit
が最大 ◦ 符号拡張 ◦ オーバーフロー
苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit
が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8
苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit
が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8 0b100 -> -4
苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit
が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8 0b100 -> -4 2147483648 + 32768 = 2147516416
苦労したポイント②RubyのIntegerの扱い • Rubyの Integer は多倍長整数 • 一方で RISC-V で扱える数は 32bit
が最大 ◦ オーバーフロー ◦ 符号拡張 0b100 -> 8 0b100 -> -4 2147483648 + 32768 = 2147516416 2147483648 + 32768 = 32768
ということで無事実装完了 🎉
良かった点 • 曲がりなりにもバイナリが読めるようになった • 簡単にとりあえず動くCPUが作れた • 慣れ親しんだ Ruby で実装できた
良くなかった点 • Ruby の Integer は多倍長整数なので 32bit にわざわざ制限してやる必要がある ので面倒 •
HDL ほどハードウェアに寄ってないので実際どう配線するんだ?みたいなところは わからない
まとめ • Ruby で riscv-tests の add 命令のテストが通る CPU エミュレーターを作った
• 簡単に CPU の仕組みがまなべるよ(足りないところはたくさんあるので許して • みんなも好きな言語でやってみてね • Next Step は bootloader が動くところまで作りたい
なんで Ruby で? 作って意味ある?🤔
なんで Ruby で? 作って意味ある?🤔
なんで Ruby で? 作って意味ある?🤔 俺にとってはある!
ご清聴ありがとうございました
出典 • RISC-V原典 • コンピュータの構成と設計 • The RISC-V Instruction Set
Manual