RISC-V技術資料集
カリフォルニア大学バークレー校で開発され現在普及しつつあるRISC-Vの技術仕様や資料についてのまとめです。特に公式資料の日本語訳や日本語での解説について積極的に載せています。
基本的には自分用のメモですがRISC-Vの技術資料のまとめとして参考にしてください。必要に応じて適宜更新します。
RISC-V技術仕様
RISC-Vの技術仕様一覧より必要な情報をピックアップしました。
命令セットアーキテクチャ
CPUの命令セットアーキテクチャ(Instruction Set Architecture、 ISA)の仕様書です(2024/12/20修正)。
-
非特権命令仕様(20240411)
ユーザプログラムが使用する非特権命令(Unprivileged Instruction)の仕様に関する文書です。 -
特権命令仕様(20240411)
OSやファームウェアなどは非特権命令に加え特権命令(Privileged Instruction)も使用します。またRISC-Vではシステムを制御するために様々なControl and Status Registers(CSR)が使われています。さらにシステムを保護するためにユーザプログラムを動かすU-ModeとOSを動かすS-Modeなど複数の実行モードを持ち、メモリ保護のための機構を持ちます。外部機器の管理のための割り込み機構なども持ちます。これらOSやファームウェアに関するCPU側に必要な機能の仕様を規定しています。
RISC-V Profiles
RISC-Vは最低限必要な基本命令セットに対して乗算除算命令のM拡張など様々な標準拡張を追加することで他の一般的なCPUと同等の機能を実現しています。RV64IMAC等拡張名を並べただけだと、組み込み向けCPUなのか、LinuxのようなOSが動くパソコン向けCPUなのかわかりにくいので、用途ごとに対応すべき拡張をまとめたものがRISC-V Profiles
になります(2024/12/20修正)。
承認済み拡張
承認済み拡張(Ratified Extension)と以前の承認済み拡張集 のうち重要だと自分が思うものを抜き出しました(2024/12/20修正)。
-
RISC-V "V" Vector
Extension v1.0
複数のデータを同時に処理するベクトル命令の仕様です。x86_64のSSE2やARMのneonなどのSIMDとほぼ同様の命令に関する仕様です(厳密にはベクトル命令とSIMDは違いますが)。 - RISC-V Cryptography Extensions Volume I
-
RISC-V Cryptography Extensions Volume II
暗号を処理する拡張命令の仕様です。 -
RISC-V Bit-Manipulation ISA-extensions
ビット操作命令の仕様です。RISC-Vにはシフト命令(例えば1101を左に1bitシフトすると1010)は基本命令セットに含まれていますが、ローテート命令(例えば1101を左に1bitローテートすると1011)は含まれていません。このような基本命令に含まれないビット操作に関する拡張命令がBit操作拡張です。 -
Zicond
特定の条件を満たしている場合のみ実行する整数条件付き実行命令拡張に関する仕様です。ARMにも同様の命令があります。 -
“Ztso” Standard Extension for Total
Store Ordering
非特権命令の仕様書の17章にあるように、RISC-Vはメモリの一貫性モデルとしてRISC-V Weak Memory Ordering(RVWMO)というARMと同様の弱いメモリオーダリングモデルを採用しています。ZtsoはRVWMOに加えてx86_64と同様のより強いTotal
Store Ordering(TSO)に対応する拡張の仕様です。x86_64をエミュレーションする場合などに必要となります。- wikipediaのメモリオーダリングの説明
-
yamasa氏によるメモリオーダリングに関するApple SiliconのTSOモードの解説
ARMアーキテクチャのApple SiliconのTSOについての解説ですがRISC-Vでも参考になると思います。Apple SiliconでのTSO関連システムレジスタも参照してください。 - LINEヤフー Tech Blog メモリモデル入門 Sequential ConsistencyとTotal Store Orderを理解する (2023/12/17追加)
-
A Primer on Memory Consistency and Cache Coherence
メモリオーダリングを含めたメモリの一貫性とキャッシュに関する書籍のPDFです。非常に詳しく説明されています(2024/6/20追加) -
いかにして命令の入れ替わりについて心配するのをやめ、メモリモデルを愛するようになったか
nullpo_head氏によるメモリーオーダリングの解説です(2024/8/10)。
命令セット外の技術仕様
呼び出し規則(Calling Convention)や割り込み処理、デバッグやトレース、ファームウェアがOSに提供する機能など、システムを実装するのに必要な命令セット外の機能の仕様に関する文書です。承認済み拡張と以前の承認済み拡張より重要だと自分が思うものを抜き出しました(2024/12/20修正)。
-
RISC-V ABIs Specification
プログラムがサブルーチンコールする際にどのようにレジスタを使用するかなどの呼び出し規則や、プログラムファイル形式のExecutable and Linking Format(ELF)のRISC-Vでの仕様やデバッグデータ形式のDWARFのRISC-Vでの仕様など、RISC-Vで動くアプリケーションプログラムの形式(Application Binary Interface、 ABI)の仕様書です。 -
RISC-V External Debug Support v0.13.2
RISC-Vでデバッグに関する仕様書です。 -
Efficient Trace for RISC-V Version 2.0.3
デバッグ機能の一つであるトレースに関する仕様書です。 -
RISC-V Platform-Level Interrupt
Controller Specification
周辺機器からの割り込みなど外部からの割り込みを処理するPlatform-Level Interrupt Controller(PLIC)の仕様です。 -
The RISC-V Advanced Interrupt Architecture
RISC-Vの新しい割り込みアーキテクチャの仕様です -
RISC-V IOMMU Architecture
Specification
Input-Output Memory Management Unit (IOMMU)の仕様です。ハイパーバイザーで特に重要となります。 -
RISC-V Supervisor Binary Interface Specification
RISC-Vの標準的なファームウェアがOSに対して提供する機能(Supervisor Binary Interface、SBI)に関する仕様書です。SBIはBIOSやUEFI環境が提供する機能と同様のものになります。 -
RISC-V UEFI PROTOCOL
Specification
UEFIについてRISC-V固有の仕様に関する文書です。
UEFIとACPIとDevicetreeの仕様
ファームウェアとOSとのソフトウェアインターフェースに関する仕様であるUnified Extensible Firmware Interface(UEFI)と、ハードウェアの構成要素を集めて管理するAdvanced Configuration and Power Interface(ACPI)と、ハードウェアの構成要素を静的に管理するDevicetreeの仕様です。ACPIは電源管理だけの仕様ではなくハードウェア全般の管理に関する仕様です。
これらはRISC-V固有ではなくx86_64やARMでも広く使われており、OSを実装する場合やOSがないベアメタル(baremetal)環境でプログラミングする際には特に重要です。
- UEFI Specification Version 2.10
- ACPI Specification Version 6.5
-
ACPICA User Guide and Programmer Reference
Intelが提供するACPIをOSから使用するためのライブラリであるACPICAの文書です。Linuxで実際に使われています。 - Devicetree v0.4
-
EDK2
UEFIファームウェアやUEFIアプリケーションを開発するための開発環境です。
セキュリティ機能
-
RISC-Vについて学ぶ-後編
リネオブログのRISC-V のセキュリティ機能の解説です。 -
TEE(Trusted Execution Environment)と
それに関する研究開発動向
suzaki氏によるTrusted Execution Environment(信頼実行環境, TEE)は第三者がプログラミング可能なHardware-assisted Isolated Execution Environments(ハードウェア支援隔離実行環境, HIEE)の解説です。 -
RISC-V Keystone
KeystoneはRISC-V向けのカスタマイズ可能なTEEのフレームワークです。 -
RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)
suzaki氏によるRISC-Vのセキュリティ技術の解説です。 -
RISC-V TEE I/Oまわりの状況
⽊村啓⼆氏によるRISC-VのTEEとI/Oに関する解説です。
RISC-Vの実装
アウトオブオーダースーパースカラの高性能コア
- The Berkeley Out-of-Order RISC-V Processor
- OpenC910
- rsd
- XiangShan (2024/3/19追加)
パイプラインコアの例
- Rocket-Chip
- Hummingbirdv2 E203 Core
-
Hazard3
Verilogで書かれたRaspberry Pi Pico2の3ステージのRV32IMACのコアです。コードは比較的読みやすいと思います(2024/8/9)。
変わり種
-
SERV
1bit単位で処理することで非常に少ないリソースでRISC-Vの命令を実行できるようにしたコアです。これを非シリコン素材で実装したFlex-RVというCPUがあるようです(2024/9/27追加)。
RISC-VでのMacro-Op Fusion
RISC-Vでは上記のように色々な拡張が提案されていますが、Christopher Celio氏の論文では少ない命令でもMacro-Op Fusionで複数の命令をまとめることができるから余計な拡張命令は不要だという話があります。Macro-Op Fusionの資料が少ないので自分が調べたことをリストしておきます。
-
https://qiita.com/asfdrwe/items/2a5a90ac52fd79356be2
以前調べたときに資料が全然見つからなかったので、何年か前に自分でRISC-VのMacro-Op Fusionを検証しています。シングルサイクルのインオーダースーパースカラで通常のCPUとは構造が異なっているため、そのまま実際のCPUに対応するわけではないですが。 - https://moonbaseotago.github.io/2023/03/05/instruction-fusion.html
- https://pc.watch.impress.co.jp/docs/2006/0306/kaigai247.htm
- https://en.wikichip.org/wiki/macro-operation_fusion
-
https://msyksphinz.hatenablog.com/entry/2024/03/19/040000
XiangShanは命令フュージョンすることでCoreMarkのDynamic Instruction Count(実際に実行している命令数)が数%減るようです(2024/3/19追加)。 -
https://developer.arm.com/documentation/109842/0001/
RISC-VではなくARMのCortex-X925ですがPDFのP.60の4.11 Instruction fusionに命令融合の具体例が書かれています(2024/6/2)。
GPUへの応用
-
Implementing Hardware Extensions for Multicore RISC-V GPUsを読む
RISC-V GPUへのハードウェア拡張の実装に関する論文の日本語での解説です(2024/6/10追加)。
実装検証ツール
-
riscv-test
Verilog 等でRISC-V CPUを実装した際に適切に命令を実装できているか確認するためのツールです。正常に動作しない場合なにか間違って実装している可能性が高いです。スーパースカラの場合などではこのツールが正常に動作しても必ずしも正しく実装できているとは限らないので、CoreMarkのようなベンチマークなどが正常に動くかなどでも確認したほうがいいです(2024/12/22追加)。 -
RISCOF
別の互換性検証ツールです。-
RISC-Vの検証フレームワークRISCOFでCPUを検証する
kanataso氏によるRISCOFの使い方の解説です(2024/12/22追加)。
-
RISC-Vの検証フレームワークRISCOFでCPUを検証する
ソフトウェア
ファームウェア
RISC-Vコンピュータを起動したときに最初に実行するファームウェアに関する資料です。
-
RISC-V Open Source Supervisor Binary Interface
上記のSBIを実装するOpen Source Supervisor Binary Interface(OpenSBI)のリポジトリです。 -
das U-boot
RISC-V以外にも様々なCPUに対応するブートローダーです。u-bootからUEFI環境を呼び出すことも可能です。 -
coreboot
U-bootと同様に様々なCPUに対応するブートローダーです。Chromebookなどに使われています。x86ではSeaBiosをロードすることで旧来のOSをブートさせたりtianocoreをロードすることでUEFI環境を提供することができます。- corebootの文書
- d0iasm氏によるARM版corebootのブートの流れの解説
-
Intel SkylakeでCache as Ramを利用するcorebootのコード
corebootの構造を見てください。corebootでコードの検証(verstage)後に最初に行う仕事はDRAMの初期化(romstage)です。CPUは起動直後ではNANDに焼かれたプログラムを実行しレジスタとデータのやり取りをすることはできますが、DRAMを初期化するまではDRAMを使用できません。DRAMを初期化するコードをレジスタだけでやりくりするのは大変なので、現在ではCPUのキャッシュメモリをメインメモリと対応付けさせずRAMとして使用できるように初期化し(Cache-As-Ram、 CAR)、その領域を活用してDRAMの初期化コードを実行し、キャッシュメモリを通常のキャッシュとして使うよう設定し直す流れになっています。Intel Skylakeでの実際のコードはIntelが提供しているFirmware Support Package(FSP)を利用しているようです。RISC-VでもファームウェアでDRAMの初期化が必要な場合は同様にファームウェア側とCPU側でのCache-As-Ramへの対応が必要になると思います。 - tanakmura氏によるCache-As-Ramの解説(2024/10/2追加)
ベアメタル
OSなしでプログラムを実行するベアメタル環境でのプログラミングに関する資料です。
-
https://mickey-happygolucky.hatenablog.com/entry/2019/03/03/170407
QEMUでのベアメタルプログラムの例です。 -
https://zenn.dev/yutyan/articles/bare-metal-programming
自作RISC-V CPUでプログラムを動かす例です。 - https://mickey-happygolucky.hatenablog.com/entry/2019/03/15/165020
-
https://mickey-happygolucky.hatenablog.com/entry/2019/03/28/115309
ベアメタルでの割り込み処理の例です。 -
https://zenn.dev/tetsu_koba/articles/d0a25ea5035b3e
tetsu_koba氏によるRISC-VのOpenSBIを利用してHelloWorldを実行する例です。 - フルスクラッチで作る!UEFIベアメタルプログラミング
-
フルスクラッチで作る!UEFIベアメタルプログラミング パート2
RISC-Vではなくx86_64ですが大神 祐真氏によるUEFIファームウェアを利用したベアメタルプログラムの解説です(2024/11/17追加2024/11/24追記)。 - uchan氏によるedk2でのUEFIアプリケーション開発例
OS
RISC-VにはLinuxなど様々なOSが実装されています。
-
xv6
xv6はUnix v6をx86に再実装したものをさらに現代のマルチコアのRISC-Vに移植したものです。構造がシンプルなので、RISC-VでのOSの実装だけでなく、OSそのものの学習にも向いていると思います。 -
RISC-V OSを作ろう
VA LinuxによるRISC-Vで動くOSの解説です。 -
Writing an OS in 1,000 Lines
怒田氏によるRISC-V/QEMU/C言語で1000行のOSの解説です。自作OSで学ぶマイクロカーネルの設計と実装の補足資料とのことなのでこちらも参照するとよいと思います。 -
Linux on RISC-V 2022を読む(1)、Linux on RISC-V 2022を読む(2)、Linux on RISC-V 2022を読む(3)
RISC-VでのLinuxの解説であるLinux on RISC-V | Kernel Recipes 2022のmsyksphinz氏による日本語での説明です。
ハイパーバイザ
ハイパーバイザはシステムを仮想化するソフトウェアです。OSの下で動き、複数のOSを同時に動かすことができます。
-
RISC-V ハイパバイザを作ろう
VA LinuxによるRISC-Vで動くハイパーバイザの解説です。 -
hikami
RISC-Vのさまざまな拡張をハードウェアで実装するのは大変ですが、多くの拡張はハイパーバイザ上でエミュレーション可能です。RISC-Vの拡張をソフトウェア的に実装して検証等を行う目的で作られたハイパーバイザがこちらになります。未踏プロジェクト2024年度で採択(2024/11/9追加)。
開発ツール
-
https://speakerdeck.com/a4lg/risc-v-kasutamunotamenoturutienkuo-zhang-gnu-binutils-to-gcc-nokuo-zhang-komiyuniteihenocan-jia-bian-wei-wan-cheng-ban
GNU bintutilsやGCCのコミッターであるa4lg氏によるRISC-Vに拡張命令を追加した場合にどのように開発ツールを修正するかやその際にどういう問題が起きたかなどの解説です(2024/3/7追加)。 -
https://zenn.dev/quiver/articles/7aa6deb2d77e44
Rui Ueyama 氏によるmoldというリンカの様々なアーキテクチャへの移植に関する解説動画についてquiver氏が文章で説明しています。
エミュレータ
-
Spike RISC-V ISA Simulator
RISC-Vの様々なISAに対応するエミュレータです。 -
[RISC-V技術ブログ連載第17回]QEMUを使ってRISC-Vを試す①
QEMUを利用してLinuxを動かす手順の解説です。 -
RustでRISC-Vエミュレータを書いてNOMMU Linuxをブラウザで動かした
ブラウザ(Wasm)でMMUなしのLinuxが動くRust 1000 行のエミュレータの実装に関する解説です。
書籍
-
コンピュータアーキテクチャ第6版定量的アプローチ
どちらもCPUを学習するための定番の書籍です。 -
Computer Organization and Design RISC-V Edition
いわゆるパタヘネ本の原書です。日本語訳はMIPS版上巻下巻しかないはずなので、RISC-Vで学習したい場合は原書を読んでください。上記のコンピュータアーキテクチャ第6版定量的アプローチ(いわゆるヘネパタ本)よりはやさしいです。 -
プログラマーのためのCPU 入門 CPU は如何にしてソフトウェアを高速に実行するか
RISC-V固有ではなくx86やARM等を含めCPUがどのようにソフトウェアを実行し、どう高速化しているかマイクロアーキテクチャレベルで説明しています。CPUの内部構造についてヘネパタ本レベルの内容を日本語でわかりやすく解説しており参考になります(2024/3/2追加)。 -
RISC-VとChiselで学ぶ はじめてのCPU自作
日本人によるRISC-Vの実装等に関する解説です。セキュリティ・キャンプ 2023 全国大会 RISC-V CPU自作ゼミ 資料にFPGAへの実装やLEDやUART出力などの追加の資料があります(2024/6/2追記)。 -
作って学ぶコンピュータアーキテクチャ
こちらも日本人によるRISC-Vの実装等に関する解説です。ちなみに『作って学ぶコンピュータアーキテクチャ』の著者はこの記事で何度も参照しているmsyksphinz氏です。 -
新・標準プログラマーズライブラリ RISC-Vで学ぶコンピュータアーキテクチャ 完全入門
Verilogを使ってRISC-Vのサブセットをシングルサイクルから5段パイプラインまで順次実装していくことでコンピュータアーキテクチャの基礎やRISC-Vの基礎について学べます。よくまとまっていると思います(2024/3/2追加)。 -
RISC-V原典 オープンアーキテクチャのススメ
RISC-Vに関する原典であり、RISC-Vがどのような理論的技術的背景から設計されているかなど仕様に関する深い説明がなされています。ただ、原書は2017年訳書も2018年出版ですでに古くなっており、現在の仕様と異なっているところがあるので、気を付けてください。2023/3/16時点でどの辺が古くなっているかの参考資料(2024/3/17修正と追加)。
学習資料のリンク集
-
Learn RISC-V
英語で書かれたRISC-Vを学ぶための資料集です。さらなる情報を得たい場合にはこちらを参照してください。
更新履歴
- 2024/12/22
- riscv-testsやRISCOFなど実装検証ツールの情報を追加
- 2024/12/20
- RISC-Vの仕様などへのリンクを中心に古くなっていた箇所を修正し、項目配置を全体的に修正
- 2024/11/24
- UEFIベアメタルプログラミングがx86_64でのものであることを追記
- 2024/11/18
- UEFIでの開発関連をベアメタルでのプログラミングへ移動
- 2024/11/17
- 大神 祐真氏のUEFIベアメタルプログラミングへのリンクを追加
- 2024/11/9
- kikamiというハイパーバイザを追加
- 2024/10/18
- ハイパーバイザの解説へのリンクを追加
- 2024/10/1
- tanakmura氏によるCache-As-Ramの解説を追加
- 2024/9/27
- SERVの実装例としてFlex-RVを追加
- 2024/8/10
- メモリーオーダリングに解説のリンクを追加し記述の修正
- 2024/8/9
- RISC-Vの実装にHazard3を追加
- 2024/8/1
- Trusted Execution Environmentに関する内容を中心にRISC-Vのセキュリティ関連の情報を追加
- 2024/6/20
- A Primer on Memory Consistency and Cache Coherenceへのリンクを追加
- 2024/6/10
- RISC-VのGPUへの応用に関する資料へのリンクを追加
- 2024/6/9
- Learn RISC-Vへのリンクを追加
- 2024/6/2
- ARMでのMacro-Op Fusionの資料追加
- 書籍『RISC-VとChiselで学ぶ はじめてのCPU自作』の関連資料を見つけたので追加
- 2024/3/19
- RISC-Vのアウトオブオーダースーパースカラの高性能コアにXiangShanに関する情報を追加
- 2024/3/17
- RISC-V原典について文章の修正と関連資料を追加
- 2024/3/07
- RISC-V カスタムのためのツールチェーン拡張へのリンクを追加
- 細かい内容の追加・修正
- 2024/3/02
- 書籍2冊追加
- 細かい内容の追加・修正
- 2024/1/08
- 細かい表現の修正
- 2023/12/17
- TSO関連でメモリモデル入門へのリンクを追加
- 2023/12/09
- 公開