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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
390
RISC-V CPU emulator made with Ruby
hayaokimura
2
80
Fiber Scheduler vs. General-Purpose Parallel Client
hayaokimura
1
680
社内でGemを読む会をして捗っている/Progressing Well: A Gem Reading Session at Work
hayaokimura
1
66
Raw HID とOLEDで広げるキーボードの可能性/Expanding Keyboard Possibilities with Raw HID and OLED
hayaokimura
0
120
freee請求書プロダクトにおけるFiber活用/Utilization of Fiber in the freee Invoice Product
hayaokimura
1
160
いいチームでいるためにやっていること/Things we are doing to remain a good team
hayaokimura
2
720
やりたいことを仕事でやる技術 / The Technique of Turning Your Passion into Your Profession
hayaokimura
0
10k
Drive Your Code ~ Building an RC Car by Writing Only Ruby~
hayaokimura
2
2.7k
Other Decks in Programming
See All in Programming
Basic Architectures
denyspoltorak
0
680
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
CSC307 Lecture 09
javiergs
PRO
1
840
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
Raku Raku Notion 20260128
hareyakayuruyaka
0
280
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.2k
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
CSC307 Lecture 01
javiergs
PRO
0
690
CSC307 Lecture 05
javiergs
PRO
0
500
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
Featured
See All Featured
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.1k
Writing Fast Ruby
sferik
630
62k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
96
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
440
Discover your Explorer Soul
emna__ayadi
2
1.1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
830
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
370
How GitHub (no longer) Works
holman
316
140k
Darren the Foodie - Storyboard
khoart
PRO
2
2.4k
Believing is Seeing
oripsolob
1
55
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