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
1.6k
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)
RISC-V CPU emulator made with Ruby
hayaokimura
1
19
Fiber Scheduler vs. General-Purpose Parallel Client
hayaokimura
1
410
社内でGemを読む会をして捗っている/Progressing Well: A Gem Reading Session at Work
hayaokimura
1
44
Raw HID とOLEDで広げるキーボードの可能性/Expanding Keyboard Possibilities with Raw HID and OLED
hayaokimura
0
93
freee請求書プロダクトにおけるFiber活用/Utilization of Fiber in the freee Invoice Product
hayaokimura
1
140
いいチームでいるためにやっていること/Things we are doing to remain a good team
hayaokimura
2
690
やりたいことを仕事でやる技術 / The Technique of Turning Your Passion into Your Profession
hayaokimura
0
7.4k
Drive Your Code ~ Building an RC Car by Writing Only Ruby~
hayaokimura
2
2.4k
仕事がしやすくなる社内発信のすすめ/ Work happily by tweeting
hayaokimura
8
27k
Other Decks in Programming
See All in Programming
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
950
一人でAIプロダクトを作るための工夫 〜技術選定・開発プロセス編〜 / I want AI to work harder
rkaga
7
1.8k
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1.1k
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2k
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
340
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
5
810
階層化自動テストで開発に機動力を
ickx
1
480
SwiftでMCPサーバーを作ろう!
giginet
PRO
2
230
書き捨てではなく継続開発可能なコードをAIコーディングエージェントで書くために意識していること
shuyakinjo
0
240
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
38
11k
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
0
250
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
3
960
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
KATA
mclloyd
32
14k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Done Done
chrislema
185
16k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Balancing Empowerment & Direction
lara
1
540
The World Runs on Bad Software
bkeepers
PRO
70
11k
Gamification - CAS2011
davidbonilla
81
5.4k
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