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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
hachi (Hayao Kimura)
May 11, 2025
Programming
5
2.1k
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
400
RISC-V CPU emulator made with Ruby
hayaokimura
2
82
Fiber Scheduler vs. General-Purpose Parallel Client
hayaokimura
1
720
社内でGemを読む会をして捗っている/Progressing Well: A Gem Reading Session at Work
hayaokimura
1
68
Raw HID とOLEDで広げるキーボードの可能性/Expanding Keyboard Possibilities with Raw HID and OLED
hayaokimura
0
130
freee請求書プロダクトにおけるFiber活用/Utilization of Fiber in the freee Invoice Product
hayaokimura
1
160
いいチームでいるためにやっていること/Things we are doing to remain a good team
hayaokimura
2
730
やりたいことを仕事でやる技術 / The Technique of Turning Your Passion into Your Profession
hayaokimura
0
11k
Drive Your Code ~ Building an RC Car by Writing Only Ruby~
hayaokimura
2
2.7k
Other Decks in Programming
See All in Programming
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
310
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
220
CSC307 Lecture 11
javiergs
PRO
0
580
ご飯食べながらエージェントが開発できる。そう、Agentic Engineeringならね。
yokomachi
1
270
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
190
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
490
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
3
430
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
470
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
400
Premier Disciplin for Micro Frontends Multi Version/ Framework Scenarios @OOP 2026, Munic
manfredsteyer
PRO
0
200
Raku Raku Notion 20260128
hareyakayuruyaka
0
420
The Ralph Wiggum Loop: First Principles of Autonomous Development
sembayui
0
3.7k
Featured
See All Featured
A better future with KSS
kneath
240
18k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
Building AI with AI
inesmontani
PRO
1
750
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
760
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
First, design no harm
axbom
PRO
2
1.1k
How to make the Groovebox
asonas
2
2k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
340
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
220
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
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