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
8日で作るオレオレRISC-V CPU
Search
Daiki Matsunaga
August 16, 2022
Technology
2.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
8日で作るオレオレRISC-V CPU
Daiki Matsunaga
August 16, 2022
More Decks by Daiki Matsunaga
See All by Daiki Matsunaga
Satyrographos Package Indexの宣伝
matsud224
0
230
Prolog
matsud224
1
180
GAMEBOYエミュレータ
matsud224
0
160
オレオレ言語 soramame の紹介
matsud224
0
130
Other Decks in Technology
See All in Technology
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
330
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
5分でわかるDuckDB Quack
chanyou0311
2
250
入門!AWS Blocks
ysuzuki
1
180
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
200
Kiro Ambassador を目指す話
k_adachi_01
0
130
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.8k
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
160
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
480
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
130
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
110
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
160
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
860
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
GitHub's CSS Performance
jonrohan
1033
470k
Navigating Team Friction
lara
192
16k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Optimizing for Happiness
mojombo
378
71k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
170
Transcript
8日で作るオレオレRISC-V CPU 無線と実験_令和版@アックス京都本社 2022/AUG/16 株式会社アックス 松永大輝
自己紹介 • 松永 大輝 (@matsud224) • 株式会社アックス 勤務 • 趣味で作ったもの
◦ TCP/IP搭載のUNIXライクOS(matsud224/tinyos) ◦ オレオレプログラミング言語(matsud224/soramame) ◦ Prolog to WAM codeコンパイラ(matsud224/wamcompiler) ◦ ラズパイで動くハイパーバイザ( matsud224/raspvisor) ◦ GameBoyエミュレータ(matsud224/gb_emu) ◦ など...
きっかけ • OSSコンソーシアム様よりTang Primer FPGAをお借りした • とりあえず遊んでみた ◦ 大学の講義で少し触ったVerilog(ハードウェア記述言語)を思い出しながら、論理 を記述
◦ まずは定番のLチカ ◦ カラーバーやキャラクタのVGA出力 ▪ Verilog以上に、ピンヘッダのはんだ付けに苦戦...
きっかけ • 格安FPGAといえども、まだまだリソースには余裕がある • せっかくなので、もう少し複雑な論理を書きたい • そこで、CPUを作ることにした ◦ ISAは今流行りのRISC-Vで
今回実装したもの • RISC-V 32bit CPU ◦ ソースコード: https://github.com/matsud224/rvcpu/tree/simple-cpu ▪ Verilogで記述、500行を切っている
◦ 整数命令セット RV32I を実装 ▪ 整数演算・分岐・ロード・ストア • 以降、製作記...
0日目:仕様書読み • RV32Iの仕様は、Specifications - RISC-V International の”Volume 1, Unprivileged Spec”にある
◦ たったの18ページ! ◦ 40命令ある • イタリック体のメモ部分が面白い ◦ この仕様に決定した理由や、実装上の注意点が書かれている
1-2日目:実装 • 命令から各フィールドを切り出すデコーダの実装 ◦ 仕様書の後ろにある”Instruction Set Listings”とにらめっこ • 1命令の実行に複数サイクル使う実装にした ◦
ステートマシンを書く ◦ 命令の種類で分岐し、対応する演算やレジスタ書き込み、メモリアクセスを行う • 趣味ではあるが、まじめにテストも行う ◦ riscv-tests (https://github.com/riscv-software-src/riscv-tests) を使用 ◦ 命令ごとにテスト(アセンブリ言語で記述)が用意されている ◦ Verilogシミュレータ(Icarus Verilog)でシミュレーションを行い、このテストを流す
3-4日目:論理合成にかける • 全テストをパスしたので、次は実機動作を目指す • が、Tang Primerではリソース不足に • プログラマ的なVerilog記述になっていたことが原因 ◦ さまざまな場所で代入や演算を行っており、演算器が多数生成されてしまっていた
◦ (論理合成系がリソースシェアリングしてくれることを期待していたが.....) • ハードウェアを意識した書き方に変更してみた ◦ ALU部を独立させ、オペランドや演算種別の切り替え論理を明示的に記述 ◦ リソースシェアリングされるよう、入力オペランドの切り替えを明示的に記述 ◦ 書きやすさのために可変回数シフトを使用していたが、必要最小限に減らした ◦ 結果、リソース使用量が激減した
5-6日目:クロスコンパイル環境構築、ROM・RAM・LEDをCPUに接続 • ROM, RAMにはFPGAのIPを使用 • RISC-V用gccでクロスコンパイルしたプログラムをROMに書き込んだ状態で実行 できるようにする ◦ ELFから必要なセクションを抽出 ◦
FPGAのツールが認識する MIF形式に変換するツールを作成 • Lチカのために、RGB LEDをメモリにマッピング
7日目:Lチカ on 自作RISC-V CPUに成功 • デバッグを繰り返し... • RGB LEDの色を順番に切り替える、下記のコードが実機で動作した! •
この時点で、リソース使用はLUT 34%、REG 6%(2コアにできそう??) • 最大動作周波数は24MHz void main() { volatile unsigned int *led = (volatile unsigned int *)0x1000000; *led = 0; while (1) { for (volatile int i=0; i<2400000; i++); int prev = *led; *led = prev==8 ? 0 : prev+1; } }
他にやったこと • UARTの送信部を追加し、文字を出力できるようにした • CoreMarkベンチマークを移植し、走らせてみた ◦ CoreMark値: 35 ◦ CoreMark/MHz値:
1.46 ◦ (単純に比較はできないが、 ◦ E203は2.14, RocketChipは2.32) 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 1363203067 Total time (secs): 56 Iterations/Sec : 35 Iterations : 2000 Compiler version : GCC11.1.0 Compiler flags : -Wall -O2 -ffreestanding -nostartfiles -T link.ld -march=rv32im -mabi=ilp32 -mno-div Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0x4983 Correct operation validated. See README.md for run and reporting rules.
データパス(概略)
Tang Primerについて • 激安FPGAだがRISC-Vコアが載る程度のリソース量はあり、楽しく遊べた • IDEが簡素で使いやすい • 論理合成系がかなり不安定 ◦ 正しいVerilogコードを入力しても、突然ハングアップすることが多々あった
◦ 合成が進むようコードの順番を無意味に入れ替えたりした ◦ 論理合成が通ることを祈るしかない • 中国語マニュアルしか付属しないが、ネットを探せば英語版も見つかった: ◦ Tang Dynasty (TD) Software Manual (v4.2, 2018.07) ◦ Anlogic Technology EAGLE Series FPGA Data Sheet
まとめ • 素朴なRISC-V CPUを作った • 動作は遅いが、消費するリソースが少ないという長所はある • 次はパイプライン化を行ってIPCと動作周波数を上げたい • FPGAならではの、CPUとはアーキテクチャの異なるアクセラレータも作ってみたい
以上