RISC-V技術資料集
カリフォルニア大学バークレー校で開発され現在普及しつつあるRISC-Vの技術仕様や資料についてのまとめです。特に公式資料の日本語訳や日本語での解説について積極的に載せています。
基本的には自分用のメモですがRISC-Vの技術資料のまとめとして参考にしてください。必要に応じて適宜更新します。
RISC-V技術仕様
RISC-Vの技術仕様一覧より必要な情報をピックアップしました。
命令セットアーキテクチャ
CPUの命令セットアーキテクチャ(Instruction Set Architecture、 ISA)の仕様書です。
-
非特権命令仕様(20191213)
ユーザプログラムが使用する非特権命令(Unprivileged Instruction)の仕様に関する文書です。 -
特権命令仕様(20211203)
OSやファームウェアなどは非特権命令に加え特権命令(Privileged Instruction)も使用します。またRISC-Vではシステムを制御するために様々なControl and Status Registers(CSR)が使われています。さらにシステムを保護するためにユーザプログラムを動かすU-ModeとOSを動かすS-Modeなど複数の実行モードを持ち、メモリ保護のための機構を持ちます。外部機器の管理のための割り込み機構なども持ちます。これらOSやファームウェアに関するCPU側に必要な機能の仕様を規定しています。
承認済み拡張
承認済み拡張(Ratified Extension) のうち重要だと自分が思うものを抜き出しました。
-
RISC-V Profiles
RISC-Vは最低限必要な基本命令セットに対して乗算除算命令のM拡張など様々な標準拡張を追加することで他の一般的なCPUと同等の機能を実現しています。RV64IMAC等拡張名を並べただけだと、組み込み向けCPUなのか、LinuxのようなOSが動くパソコン向けCPUなのかわかりにくいので、用途ごとに対応すべき拡張をまとめたプロファイルの仕様がこの拡張になります。 -
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
非特権命令の仕様書の14章にあるように、RISC-Vはメモリの一貫性モデルとしてRISC-V Weak Memory Ordering(RVWMO)というARMと同様の弱いメモリオーダリングモデルを採用しています。ZtsoはRVWMOに加えてx86_64と同様のより強いTotal
Store Ordering(TSO)に対応する拡張の仕様です。x86_64をエミュレーションする場合などに必要となります。- wikipediaのメモリオーダリングの説明
- ARMアーキテクチャのApple SiliconのTSOについてyamasa氏によるメモリオーダリングに関するApple SiliconのTSOモードの解説はRISC-Vでも参考になると思います。Apple SiliconでのTSO関連システムレジスタも参照してください。
- LINEヤフー Tech Blogのメモリモデル入門 Sequential ConsistencyとTotal Store Orderを理解する (2023/12/17追加)
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追加)。
RISC-Vの実装
アウトオブオーダースーパースカラの高性能コア
- The Berkeley Out-of-Order RISC-V Processor
- OpenC910
- rsd
- XiangShan (2024/3/19追加)
パイプラインコアの例
変わり種
-
SERV
1bit単位で処理することで非常に少ないリソースでRISC-Vの命令を実行できるようにしたコアです。
命令セット外の技術仕様
呼び出し規則(Calling Convention)や割り込み処理、デバッグやトレース、ファームウェアがOSに提供する機能など、システムを実装するのに必要な命令セット外の機能の仕様に関する文書です。リンク元は承認順ですが機能順に並べています。
-
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
デバッグ機能の一つであるトレースに関する仕様書です。 -
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)環境でプログラミングする際には特に重要です。
-
ACPICA User Guide and Programmer Reference
Intelが提供するACPIをOSから使用するためのライブラリであるACPICAの文書です。Linuxで実際に使われています。 -
EDK2
UEFIファームウェアやUEFIアプリケーションを開発するための開発環境です。
ファームウェア
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への対応が必要になると思います。
ベアメタル
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を実行する例です。
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氏による日本語での説明です。
開発ツール
-
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氏が文章で説明しています。
書籍
-
コンピュータアーキテクチャ第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の実装等に関する解説です。ちなみに『作って学ぶコンピュータアーキテクチャ』の著者はこの記事で何度も参照している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修正と追加)。
更新履歴
- 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
- 公開