Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emula...
Search
hachi (Hayao Kimura)
May 11, 2025
Programming
2.4k
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby で作る RISC-V CPU エミュレーター / RISC-V CPU emulator made with Ruby
hachi (Hayao Kimura)
May 11, 2025
Transcript
62 slides
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
More Decks by hachi (Hayao Kimura)
See All by hachi (Hayao Kimura)
転職を「転機」にする/Turning a job change into a turning point
hayaokimura
2
220
Integration of PRK Firmware and R2P2
hayaokimura
1
430
PicoRuby で拓く電子工作の世界/The World of Electronics Projects Opened by PicoRuby
hayaokimura
2
1.7k
RISC-V CPU emulator made with Ruby
hayaokimura
2
130
Fiber Scheduler vs. General-Purpose Parallel Client
hayaokimura
1
1.1k
社内でGemを読む会をして捗っている/Progressing Well: A Gem Reading Session at Work
hayaokimura
1
100
Raw HID とOLEDで広げるキーボードの可能性/Expanding Keyboard Possibilities with Raw HID and OLED
hayaokimura
0
250
freee請求書プロダクトにおけるFiber活用/Utilization of Fiber in the freee Invoice Product
hayaokimura
1
210
いいチームでいるためにやっていること/Things we are doing to remain a good team
hayaokimura
2
810
Other Decks in Programming
See All in Programming
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
180
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
250
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.3k
LLM 101
dalinaum
0
480
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.7k
Growing PicoRuby's Ecosystem on ESP32
yuuu
2
120
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
330
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
370
オーケストレーション記述言語 Katari
yukikurage
0
260
Event is what happens
moro
2
4.6k
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
290
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
980
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.7k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
750
The agentic SEO stack - context over prompts
schlessera
0
1k
The Limits of Empathy - UXLibs8
cassininazir
2
780
Amusing Abliteration
ianozsvald
1
390
Code Reviewing Like a Champion
maltzj
529
40k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
Chasing Engaging Ingredients in Design
codingconduct
0
390