RISC-V技術資料集

# RISC-V技術資料集
カリフォルニア大学バークレー校で開発され現在普及しつつある[RISC-V](https://riscv.org/)の技術仕様や資料についてのまとめです。特に公式資料の日本語訳や日本語での解説について積極的に載せています。

基本的には自分用のメモですがRISC-Vの技術資料のまとめとして参考にしてください。必要に応じて適宜更新します。

## RISC-V技術仕様
[RISC-Vの技術仕様一覧](https://wiki.riscv.org/display/HOME/RISC-V+Technical+Specifications)より必要な情報をピックアップしました。

### 命令セットアーキテクチャ
CPUの命令セットアーキテクチャ(Instruction Set Architecture、 ISA)の[仕様書](https://riscv.org/technical/specifications/)です(2024/12/20修正)。

- [非特権命令仕様(20240411)](https://drive.google.com/file/d/1uviu1nH-tScFfgrovvFCrj7Omv8tFtkp/view)
ユーザプログラムが使用する非特権命令(Unprivileged Instruction)の仕様に関する文書です。
    - [柴田氏による以前の20191213版の日本語訳](https://booth.pm/ja/items/3551965)
- [特権命令仕様(20240411)](https://drive.google.com/file/d/17GeetSnT5wW3xNuAHI95-SI1gPGd5sJ_/view)
OSやファームウェアなどは非特権命令に加え特権命令(Privileged Instruction)も使用します。またRISC-Vではシステムを制御するために様々なControl and Status Registers(CSR)が使われています。さらにシステムを保護するためにユーザプログラムを動かすU-ModeとOSを動かすS-Modeなど複数の実行モードを持ち、メモリ保護のための機構を持ちます。外部機器の管理のための割り込み機構なども持ちます。これらOSやファームウェアに関するCPU側に必要な機能の仕様を規定しています。
    - [柴田氏による少し前のv1.10版の日本語訳](https://github.com/shibatchii/RISC-V/blob/master/riscv-privileged-v1.10_jp.pdf)

### RISC-V Profiles

RISC-Vは最低限必要な基本命令セットに対して乗算除算命令のM拡張など様々な標準拡張を追加することで他の一般的なCPUと同等の機能を実現しています。RV64IMAC等拡張名を並べただけだと、組み込み向けCPUなのか、LinuxのようなOSが動くパソコン向けCPUなのかわかりにくいので、用途ごとに対応すべき拡張をまとめたものが[RISC-V Profiles](https://lf-riscv.atlassian.net/wiki/spaces/HOME/pages/16154769/RISC-V+Technical+Specifications#Profiles)
になります(2024/12/20修正)。

- [mcufamily氏によるRISC-Vプロファイルの解説](https://ameblo.jp/mcufamily/entry-12803909886.html)

### 承認済み拡張
[承認済み拡張(Ratified Extension)](https://lf-riscv.atlassian.net/wiki/spaces/HOME/pages/16154769/RISC-V+Technical+Specifications#Non-ISA-Specifications)と[以前の承認済み拡張集](https://lf-riscv.atlassian.net/wiki/spaces/HOME/pages/16154899/RISC-V+Technical+Specifications+Archive) のうち重要だと自分が思うものを抜き出しました(2024/12/20修正)。
    
- [RISC-V "V" Vector
Extension v1.0](https://drive.google.com/file/d/1AQZ3l_EGeMa2NftMO562gVZ4vj61od2H/view)
複数のデータを同時に処理するベクトル命令の仕様です。x86_64のSSE2やARMのneonなどのSIMDとほぼ同様の命令に関する仕様です(厳密にはベクトル命令とSIMDは違いますが)。
    - [msyksphinz氏によるv1.0の日本語訳](https://msyksphinz-self.github.io/riscv-v-spec-japanese/html/index.html)
- [RISC-V Cryptography Extensions Volume I](https://drive.google.com/file/d/1Thd010Eh2DqnhDHpDd3SM7Ame7KENkPw/view)
- [RISC-V Cryptography Extensions Volume II](https://drive.google.com/file/d/1gb9OLH-DhbCgWp7VwpPOVrrY6f3oSJLL/view)
暗号を処理する拡張命令の仕様です。
- [RISC-V Bit-Manipulation ISA-extensions](https://drive.google.com/file/d/11-dKxnp7yfl9L3HESXGCtYl90dFKGTzE/view)
ビット操作命令の仕様です。RISC-Vにはシフト命令(例えば1101を左に1bitシフトすると1010)は基本命令セットに含まれていますが、ローテート命令(例えば1101を左に1bitローテートすると1011)は含まれていません。このような基本命令に含まれないビット操作に関する拡張命令がBit操作拡張です。
- [Zicond](https://drive.google.com/file/d/1ssWUkvSp_CCw6riw3ThSwJFKn4GH5QLM/view?usp=drive_link)
特定の条件を満たしている場合のみ実行する整数条件付き実行命令拡張に関する仕様です。ARMにも同様の命令があります。
    - [塩谷氏による解説](https://github.com/shioyadan/advanced-computer-organization/blob/master/aco-shioya-appendix-riscv-zicond.pdf)
- [“Ztso” Standard Extension for Total
Store Ordering](https://drive.google.com/file/d/173BGJQLqtEzAAD5lV9uaLMMjS91WeAt7/view)
[非特権命令の仕様書](https://drive.google.com/file/d/1uviu1nH-tScFfgrovvFCrj7Omv8tFtkp/view)の17章にあるように、RISC-Vはメモリの一貫性モデルとしてRISC-V Weak Memory Ordering(RVWMO)というARMと同様の弱いメモリオーダリングモデルを採用しています。ZtsoはRVWMOに加えてx86_64と同様のより強いTotal
Store Ordering(TSO)に対応する拡張の仕様です。x86_64をエミュレーションする場合などに必要となります。
    - [wikipediaのメモリオーダリングの説明](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%AA%E3%83%BC%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0)
    - [yamasa氏によるメモリオーダリングに関するApple SiliconのTSOモードの解説](https://yamasa.hatenablog.jp/entry/2020/12/07/041649)
    ARMアーキテクチャのApple SiliconのTSOについての解説ですがRISC-Vでも参考になると思います。[Apple SiliconでのTSO関連システムレジスタ](https://github.com/asfdrwe/asahi-linux-translations/wiki/HW:ARM-System-Registers#sys_apl_hid9_el1)も参照してください。
    - [LINEヤフー Tech Blog　メモリモデル入門 Sequential ConsistencyとTotal Store Orderを理解する](https://techblog.lycorp.co.jp/ja/20231216a) (2023/12/17追加)
    - [A Primer on Memory Consistency and Cache Coherence](https://course.ece.cmu.edu/~ece847c/S15/lib/exe/fetch.php?media=part2_2_sorin12.pdf)
    メモリオーダリングを含めたメモリの一貫性とキャッシュに関する書籍のPDFです。非常に詳しく説明されています(2024/6/20追加)
    - [ いかにして命令の入れ替わりについて心配するのをやめ、メモリモデルを愛するようになったか](https://speakerdeck.com/nullpo_head/ikanisiteming-ling-noru-reti-warinituitexin-pei-surunowoyame-memorimoderuwoai-suruyouninatutaka)
    nullpo_head氏によるメモリーオーダリングの解説です(2024/8/10)。
    
### 命令セット外の技術仕様
呼び出し規則(Calling Convention)や割り込み処理、デバッグやトレース、ファームウェアがOSに提供する機能など、システムを実装するのに必要な命令セット外の機能の仕様に関する文書です。[承認済み拡張](https://lf-riscv.atlassian.net/wiki/spaces/HOME/pages/16154769/RISC-V+Technical+Specifications#Non-ISA-Specifications)と[以前の承認済み拡張](https://lf-riscv.atlassian.net/wiki/spaces/HOME/pages/16154899/RISC-V+Technical+Specifications+Archive)より重要だと自分が思うものを抜き出しました(2024/12/20修正)。

- [RISC-V ABIs Specification](https://drive.google.com/file/d/1Ja_Tpp_5Me583CGVD-BIZMlgGBnlKU4R/view)
プログラムがサブルーチンコールする際にどのようにレジスタを使用するかなどの呼び出し規則や、プログラムファイル形式のExecutable and Linking Format(ELF)のRISC-Vでの仕様やデバッグデータ形式の[DWARF](https://dwarfstd.org/)のRISC-Vでの仕様など、RISC-Vで動くアプリケーションプログラムの形式(Application Binary Interface、 ABI)の仕様書です。

- [RISC-V External Debug Support v0.13.2](https://drive.google.com/file/d/1XSPqW3WIfflIMeuGJBxGTMOEyeuRAQ5F/view?usp=drive_link)
RISC-Vでデバッグに関する仕様書です。
    - [柴田氏によるv0.13.2の日本語訳](https://github.com/shibatchii/RISC-V/blob/master/riscv-debug-release_v0.13.2_jp.pdf)
- [Efficient Trace for RISC-V Version 2.0.3](https://github.com/riscv-non-isa/riscv-trace-spec/releases/download/v2.0.3/riscv-trace-spec-asciidoc.pdf)
デバッグ機能の一つであるトレースに関する仕様書です。
    - [DTSインサイトによるEfficient Trace for RISC-Vの解説](https://www.dts-insight.co.jp/product/systemlsi/tech-topics/risc-v/blog_no21.html)

- [RISC-V Platform-Level Interrupt
Controller Specification](https://drive.google.com/file/d/1at94PNJl4v2eAsKIwKOsZWBxsVcY2U2F/view)
周辺機器からの割り込みなど外部からの割り込みを処理するPlatform-Level Interrupt Controller(PLIC)の仕様です。
    - [tkato氏によるPLICの解説](https://qiita.com/tkato/items/80abce474f329676acb3)
- [The RISC-V Advanced Interrupt Architecture](https://drive.google.com/file/d/16life2Y5u7Plebbl4v1fFM1-NK-KHw0Y/view)
RISC-Vの新しい割り込みアーキテクチャの仕様です

- [RISC-V IOMMU Architecture
Specification](https://drive.google.com/file/d/1kVapIJPXUUNFQv_yauCDgtWzMvpgh6C2/view)
Input-Output Memory Management Unit (IOMMU)の仕様です。ハイパーバイザーで特に重要となります。

- [RISC-V Supervisor Binary Interface Specification](https://drive.google.com/file/d/1kVapIJPXUUNFQv_yauCDgtWzMvpgh6C2/view)
RISC-Vの標準的なファームウェアがOSに対して提供する機能(Supervisor Binary Interface、SBI)に関する仕様書です。SBIはBIOSやUEFI環境が提供する機能と同様のものになります。
- [RISC-V UEFI PROTOCOL
Specification](https://drive.google.com/file/d/1rbQDRkoeJyqTKTI6tTCKw8zmh7T9dLUZ/view)
UEFIについてRISC-V固有の仕様に関する文書です。

### UEFIとACPIとDevicetreeの仕様
ファームウェアとOSとのソフトウェアインターフェースに関する仕様である[Unified Extensible Firmware Interface(UEFI)](https://uefi.org/specifications)と、ハードウェアの構成要素を集めて管理するAdvanced Configuration and Power Interface(ACPI)と、ハードウェアの構成要素を静的に管理する[Devicetree](https://www.devicetree.org/)の仕様です。ACPIは電源管理だけの仕様ではなくハードウェア全般の管理に関する仕様です。

これらはRISC-V固有ではなくx86_64やARMでも広く使われており、OSを実装する場合やOSがないベアメタル(baremetal)環境でプログラミングする際には特に重要です。

- [UEFI Specification Version 2.10](https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf)
- [ACPI Specification Version 6.5](https://uefi.org/sites/default/files/resources/ACPI_Spec_6_5_Aug29.pdf)
- [ACPICA User Guide and Programmer Reference](https://cdrdv2.intel.com/v1/dl/getContent/772726)
Intelが提供するACPIをOSから使用するためのライブラリである[ACPICA](https://www.intel.com/content/www/us/en/developer/topic-technology/open/acpica/documentation.html)の文書です。Linuxで[実際に使われています](https://github.com/torvalds/linux/tree/master/drivers/acpi/acpica)。
- [Devicetree v0.4](https://github.com/devicetree-org/devicetree-specification/releases/download/v0.4/devicetree-specification-v0.4.pdf)
    - [mukosaka氏によるDevice-Tree v0.4-rc1の日本語訳](http://muko.damember.org/devicetree-specification/)
    - [萩原氏によるDevicetreeの解説](https://qiita.com/eofz/items/20cfa99601756fc98905)
- [EDK2](https://github.com/tianocore/edk2)
UEFIファームウェアやUEFIアプリケーションを開発するための開発環境です。

### セキュリティ機能
- [RISC-Vについて学ぶ-後編](https://www.lineo.co.jp/blog/linux/risc-v-2.html)
リネオブログのRISC-V のセキュリティ機能の解説です。
- [TEE(Trusted Execution Environment)と
それに関する研究開発動向](https://www.ieice.org/~dpf/wp-content/uploads/2021/08/DFS%E7%A0%94%E7%A9%B6%E4%BC%9A%E7%94%A3%E7%B7%8F%E7%A0%94%E9%A0%88%E5%B4%8E.pdf)
suzaki氏によるTrusted Execution Environment(信頼実行環境, TEE)は第三者がプログラミング可能なHardware-assisted Isolated Execution Environments(ハードウェア支援隔離実行環境, HIEE)の解説です。
- [RISC-V Keystone](https://keystone-enclave.org/)
KeystoneはRISC-V向けのカスタマイズ可能なTEEのフレームワークです。
- [RISC-Vのセキュリティ技術(TEE, Root of Trust, Remote Attestation)](https://www.slideshare.net/slideshow/riscvtee-root-of-trust-remote-attestation/252342192#2)
suzaki氏によるRISC-Vのセキュリティ技術の解説です。
- [RISC-V TEE I/Oまわりの状況](https://sc-sys.github.io/archive/WS20240129_kimura.pdf)
⽊村啓⼆氏によるRISC-VのTEEとI/Oに関する解説です。

## RISC-Vの実装
### アウトオブオーダースーパースカラの高性能コア
- [The Berkeley Out-of-Order RISC-V Processor](https://github.com/riscv-boom/riscv-boom)
- [OpenC910](https://github.com/T-head-Semi/openc910)
- [rsd](https://github.com/rsd-devel/rsd)
- [XiangShan](https://github.com/OpenXiangShan/XiangShan) (2024/3/19追加)

### パイプラインコアの例
- [Rocket-Chip](https://github.com/chipsalliance/rocket-chip)
- [Hummingbirdv2 E203 Core](https://github.com/riscv-mcu/e203_hbirdv2)
- [Hazard3](https://github.com/Wren6991/Hazard3)
Verilogで書かれた[Raspberry Pi Pico2](https://www.raspberrypi.com/news/raspberry-pi-pico-2-our-new-5-microcontroller-board-on-sale-now/)の3ステージのRV32IMACのコアです。コードは比較的読みやすいと思います(2024/8/9)。


### 変わり種
- [SERV](https://github.com/olofk/serv)
1bit単位で処理することで非常に少ないリソースでRISC-Vの命令を実行できるようにしたコアです。これを非シリコン素材で実装した[Flex-RV](https://gigazine.net/news/20240927-bendable-non-silicon-risc-v-cpu-flex-rv/)というCPUがあるようです(2024/9/27追加)。 

https://www.youtube.com/watch?v=m8dJAZST_Oo

### RISC-V V拡張のオープンソース実装
- [rvv implementations](https://github.com/stars/camel-cdr/lists/rvv-implementations)
RISC-Vのベクトル命令拡張に対応するRISC-Vのオープンソース実装へのリンク集です(2025/2/8追加)。

### RISC-VでのMacro-Op Fusion
RISC-Vでは上記のように色々な拡張が提案されていますが、[Christopher Celio氏の論文](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf
)では少ない命令でも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](https://github.com/OpenXiangShan/XiangShan-doc/blob/main/tutorial/20240302-HPCA24-2-Microarchitecture.pdf)は命令フュージョンすることで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を読む](https://vlsi.jp/RISCVGPU.html)
RISC-V GPUへのハードウェア拡張の実装に関する[論文](https://vortex.cc.gatech.edu/publications/vortex_micro21_final.pdf)の日本語での解説です(2024/6/10追加)。

### 実装検証ツール
- [riscv-test](https://github.com/riscv-software-src/riscv-tests)
Verilog 等でRISC-V CPUを実装した際に適切に命令を実装できているか確認するためのツールです。正常に動作しない場合なにか間違って実装している可能性が高いです。スーパースカラの場合などではこのツールが正常に動作しても必ずしも正しく実装できているとは限らないので、[CoreMark](https://github.com/eembc/coremark)のようなベンチマークなどが正常に動くかなどでも確認したほうがいいです(2024/12/22追加)。
- [RISCOF](https://riscof.readthedocs.io/en/latest/index.html)
別の互換性検証ツールです。
  - [RISC-Vの検証フレームワークRISCOFでCPUを検証する](https://kanataso.hatenablog.jp/entry/2024/12/13/145927) 
  kanataso氏によるRISCOFの使い方の解説です(2024/12/22追加)。

## ソフトウェア

### ファームウェア
RISC-Vコンピュータを起動したときに最初に実行するファームウェアに関する資料です。

- [RISC-V Open Source Supervisor Binary Interface](https://github.com/riscv-software-src/opensbi)
上記のSBIを実装するOpen Source Supervisor Binary Interface(OpenSBI)のリポジトリです。
    - [knknkn1162氏によるOpenSBIの実行の流れの解説](https://cstmize.hatenablog.jp/entry/2019/10/21/OpenSBI%E3%81%AE%E5%86%85%E9%83%A8%E5%AE%9F%E8%A3%85%28boot~linux_kernel%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%29)

- [das U-boot](https://docs.u-boot.org/en/latest/)
RISC-V以外にも様々なCPUに対応するブートローダーです。[u-bootからUEFI環境を呼び出す](https://docs.u-boot.org/en/stable/develop/uefi/uefi.html)ことも可能です。
- [coreboot](https://www.coreboot.org/)
U-bootと同様に様々なCPUに対応するブートローダーです。Chromebookなどに使われています。x86では[SeaBios](https://www.seabios.org/SeaBIOS)をロードすることで旧来のOSをブートさせたり[tianocoreをロード](https://www.coreboot.org/TianoCore)することでUEFI環境を提供することができます。
    - [corebootの文書](https://doc.coreboot.org/index.html)
    - [d0iasm氏によるARM版corebootのブートの流れの解説](https://d0iasm.github.io/blog/coreboot/2019/06/13/code-reading-of-coreboot-for-qemu-arm.html)
    - [Intel SkylakeでCache as Ramを利用するcorebootのコード](https://chromium.googlesource.com/chromiumos/third_party/coreboot/+/refs/heads/chromeos-2016.05/src/drivers/intel/fsp1_1/cache_as_ram.S)
![comparison_coreboot_uefi.svg](https://doc.coreboot.org/_images/comparison_coreboot_uefi.svg)[corebootの構造](https://doc.coreboot.org/getting_started/architecture.html)を見てください。corebootでコードの検証(verstage)後に最初に行う仕事はDRAMの初期化(romstage)です。CPUは起動直後ではNANDに焼かれたプログラムを実行しレジスタとデータのやり取りをすることはできますが、DRAMを初期化するまではDRAMを使用できません。DRAMを初期化するコードをレジスタだけでやりくりするのは大変なので、現在ではCPUのキャッシュメモリをメインメモリと対応付けさせずRAMとして使用できるように初期化し(Cache-As-Ram、 CAR)、その領域を活用してDRAMの初期化コードを実行し、キャッシュメモリを通常のキャッシュとして使うよう設定し直す流れになっています。Intel Skylakeでの実際のコードはIntelが提供している[Firmware Support Package(FSP)](https://github.com/intel/FSP/tree/master)を利用しているようです。RISC-VでもファームウェアでDRAMの初期化が必要な場合は同様にファームウェア側とCPU側でのCache-As-Ramへの対応が必要になると思います。
    - [tanakmura氏によるCache-As-Ramの解説](https://qiita.com/tanakmura/items/ca0aaf4402ea0d399e0e)(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ベアメタルプログラミング](http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/)
- [フルスクラッチで作る!UEFIベアメタルプログラミング パート2](http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/)
RISC-Vではなくx86_64ですが大神 祐真氏によるUEFIファームウェアを利用したベアメタルプログラムの解説です(2024/11/17追加2024/11/24追記)。
- [uchan氏によるedk2でのUEFIアプリケーション開発例](https://osdev-jp.readthedocs.io/ja/latest/2017/create-uefi-app-with-edk2.html)

### OS
RISC-VにはLinuxなど様々なOSが実装されています。

- [xv6](https://github.com/mit-pdos/xv6-riscv)
xv6はUnix v6をx86に再実装したものをさらに現代のマルチコアのRISC-Vに移植したものです。構造がシンプルなので、RISC-VでのOSの実装だけでなく、OSそのものの学習にも向いていると思います。
    - [msyksphinz氏によるxv6の解説文書の日本語訳](https://github.com/msyksphinz-self/xv6_translate/blob/master/index.md)
    - [菅原氏による同じ文書のの日本語訳](https://www.sugawara-lab.jp/fig/xv6-riscv-jpn.pdf)
- [RISC-V OSを作ろう](https://www.valinux.co.jp/technologylibrary/document/linux/riscvos0001/)
VA LinuxによるRISC-Vで動くOSの解説です。
- [Writing an OS in 1,000 Lines](https://operating-system-in-1000-lines.vercel.app/ja/welcome)
怒田氏によるRISC-V/QEMU/C言語で1000行のOSの解説です。[自作OSで学ぶマイクロカーネルの設計と実装](https://www.shuwasystem.co.jp/book/9784798068718.html)の補足資料とのことなのでこちらも参照するとよいと思います。
- [Linux on RISC-V 2022を読む(1)](https://msyksphinz.hatenablog.com/entry/2022/06/07/040000)、[Linux on RISC-V 2022を読む(2)](https://msyksphinz.hatenablog.com/entry/2022/06/08/040000)、[Linux on RISC-V 2022を読む(3)](https://msyksphinz.hatenablog.com/entry/2022/06/09/040000)
RISC-VでのLinuxの解説である[Linux on RISC-V | Kernel Recipes 2022](https://kernel-recipes.org/en/2022/talks/linux-on-risc-v/)のmsyksphinz氏による日本語での説明です。

### ハイパーバイザ
[ハイパーバイザ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)はシステムを仮想化するソフトウェアです。OSの下で動き、複数のOSを同時に動かすことができます。
- [RISC-V ハイパバイザを作ろう](https://valinux.hatenablog.com/entry/20241017)
VA LinuxによるRISC-Vで動くハイパーバイザの解説です。
- [hikami](https://github.com/Alignof/hikami)
RISC-Vのさまざまな拡張をハードウェアで実装するのは大変ですが、多くの拡張はハイパーバイザ上でエミュレーション可能です。RISC-Vの拡張をソフトウェア的に実装して検証等を行う目的で作られたハイパーバイザがこちらになります。[解説スライド](https://docs.google.com/presentation/d/18CNFABej3PnTpqkMZHcmZA1T7acqc6c3thKPoz4Z4wQ/)。[未踏プロジェクト2024年度で採択](https://www.ipa.go.jp/jinzai/mitou/it/2024/gaiyou-tn-3.html)(2024/11/9追加)(2025/2/16追記)。


### 開発ツール
- 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](https://github.com/rui314/mold)というリンカの様々なアーキテクチャへの移植に関する[解説動画](https://www.youtube.com/watch?v=yuSVbuiaBuU)についてquiver氏が文章で説明しています。

### エミュレータ
- [Spike RISC-V ISA Simulator](https://github.com/riscv-software-src/riscv-isa-sim)
RISC-Vの様々なISAに対応するエミュレータです。
- [[RISC-V技術ブログ連載第17回]QEMUを使ってRISC-Vを試す①](https://www.dts-insight.co.jp/product/systemlsi/tech-topics/risc-v/blog_no17.html)
[QEMU](https://www.qemu.org/)を利用してLinuxを動かす手順の解説です。
- [RustでRISC-Vエミュレータを書いてNOMMU Linuxをブラウザで動かした](https://bokuweb.github.io/undefined/articles/20230523.html)
ブラウザ(Wasm)でMMUなしのLinuxが動くRust 1000 行のエミュレータの実装に関する解説です。
- [felix86](https://github.com/OFFTKP/felix86/)
RISC-V用のx86_64エミュレータです(2025/5/3追加)。

## 書籍
- [ディジタル回路設計とコンピュータアーキテクチャ RISC-V版](https://www.amazon.co.jp/dp/4434305220/)
- [コンピュータアーキテクチャ第6版定量的アプローチ](https://www.amazon.co.jp/dp/4434264001/)
どちらもCPUを学習するための定番の書籍です。

- [Computer Organization and Design RISC-V Edition](https://www.amazon.co.jp/dp/0128203315/)
いわゆるパタヘネ本の原書です。日本語訳はMIPS版[上巻](https://www.amazon.co.jp/dp/4296070096/)[下巻](https://www.amazon.co.jp/dp/429607010X/)しかないはずなので、RISC-Vで学習したい場合は原書を読んでください。上記のコンピュータアーキテクチャ第6版定量的アプローチ(いわゆるヘネパタ本)よりはやさしいです。

- [プログラマーのためのCPU 入門 CPU は如何にしてソフトウェアを高速に実行するか](https://www.amazon.co.jp/dp/4908686165/)
RISC-V固有ではなくx86やARM等を含めCPUがどのようにソフトウェアを実行し、どう高速化しているかマイクロアーキテクチャレベルで説明しています。CPUの内部構造についてヘネパタ本レベルの内容を日本語でわかりやすく解説しており参考になります(2024/3/2追加)。

- [RISC-VとChiselで学ぶ はじめてのCPU自作](https://www.amazon.co.jp/dp/4297123053/)
日本人によるRISC-Vの実装等に関する解説です。[セキュリティ・キャンプ 2023 全国大会 RISC-V CPU自作ゼミ 資料](https://github.com/ciniml/seccamp_riscv_cpu/tree/2023/fpga_impl)にFPGAへの実装やLEDやUART出力などの追加の資料があります(2024/6/2追記)。
- [作って学ぶコンピュータアーキテクチャ](https://www.amazon.co.jp/dp/4297129140/)
こちらも日本人によるRISC-Vの実装等に関する解説です。ちなみに『作って学ぶコンピュータアーキテクチャ』の著者はこの記事で何度も参照しているmsyksphinz氏です。
- [新・標準プログラマーズライブラリ　RISC-Vで学ぶコンピュータアーキテクチャ　完全入門](https://www.amazon.co.jp/dp/429714008X/)
Verilogを使ってRISC-Vのサブセットをシングルサイクルから5段パイプラインまで順次実装していくことでコンピュータアーキテクチャの基礎やRISC-Vの基礎について学べます。よくまとまっていると思います(2024/3/2追加)。

- [RISC-V原典 オープンアーキテクチャのススメ](https://www.amazon.co.jp/dp/4822292819/)
RISC-Vに関する原典であり、RISC-Vがどのような理論的技術的背景から設計されているかなど仕様に関する深い説明がなされています。ただ、原書は2017年出版で訳書も2018年出版なので、すでに古くなっており、現在の仕様と異なっているところがあるので、気を付けてください。[2023/3/16時点でどの辺が古くなっているかの参考資料](https://zenn.dev/tetsu_koba/articles/4caa0bb897bcfb)(2024/3/17修正と追加)。

- [Verylで作るCPU 基本編 第I部](https://techbookfest.org/product/h1hG3qHj89bxFVEu2jWLnx?productVariantID=gdbWTV3i9Ewwzvyp4C03wZ)
- [Verylで作るCPU 基本編 第II部 第III部](https://techbookfest.org/product/78EBu4yThEgXxWZyF5pARJ?productVariantID=kgwUNwzpcguLKf9Fj3KVEE)
Verylというハードウェア記述言語でRV32IやRV64Iを実装する方法を解説する無料の書籍です。RISC-VのサブセットではなくRV32IやRV64Iフルセットの実装について詳しく解説されています。
第II部 第III部では組み込みOSに必要な A拡張や M-MODE での CSR と割り込みの実装に加え、Linuxのような汎用OSを動かすのに必要な S-MODE での CSR の実装やページングの実装なども解説されています。汎用OSの動作が可能なレベルで RISC-V の実装を解説しているものは2025/6/1時点で英語のものを含めて他に存在していないと思うので、大変参考になります。VerylでなくVerilogやSystem VerilogでRISC-Vを実装する場合にも非常に参考になるはずです。(2025/6/1追記)。

## 学習資料のリンク集
- [Learn RISC-V](https://github.com/riscv/learn)
英語で書かれたRISC-Vを学ぶための資料集です。さらなる情報を得たい場合にはこちらを参照してください。

## 更新履歴
- 2025/6/1
    - Verylで作るCPU基本編 第II部 第III部に関する情報を追加
- 2025/5/3
    - felix86へのリンクを追加
- 2025/2/16
    - hikamiの資料を追加
- 2025/2/8
    - RISC-Vのベクトル命令拡張のオープンソース実装へのリンク集へのリンクを追加
- 2025/1/28
    - Verylで作るCPUへのリンクを追加
- 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
    - 公開