プロセッサ・アーキテクチャ

RISC-V

オープンな命令セットアーキテクチャ。ライセンス不要で注目。

概要

RISC-V(リスク・ファイブ)は、カリフォルニア大学バークレー校で開発されたオープンな命令セットアーキテクチャ(ISA)です。最大の特徴は仕様がオープンソースとして公開されており、誰でも無償でISAを実装・利用できる点です。ARMやx86のように高額なライセンス料が不要なため、スタートアップ・研究機関・新興国のチップベンダーが参入しやすく、急速に普及が進んでいます。

モジュラー設計が特徴で、整数演算の基本命令セット(RV32I/RV64I)に対して、乗算・除算(M拡張)・アトミック命令(A拡張)・単精度FPU(F拡張)・倍精度FPU(D拡張)・圧縮命令(C拡張)などを組み合わせることができます。RV32IMAC(整数+乗除+アトミック+圧縮)はRTOS向けマイコンの標準的な構成です。

EspressifのESP32-C3/C6シリーズはRISC-Vを採用したWi-Fi/BLE内蔵マイコンとして組み込み開発者の注目を集めています。また、SiFiveを始めとする専業ベンダーが高性能コアを提供し、Linuxが動作するアプリケーションプロセッサも登場しています。

歴史・背景

RISC-Vの開発は2010年にバークレー校のKrste Asanovic教授とAndrews Waterman・Yunsup Leeらを中心に始まりました。当時の既存ISA(ARMv7・x86・MIPS等)への不満——複雑な歴史的経緯による命令の複雑化・高額なライセンス・設計の自由度の低さ——を解消するため、シンプルで拡張可能なオープンISAをゼロから設計しました。

2014年にRISC-V ISA仕様が公開され、2015年にRISC-V FoundationをIntel・Google・Nvidia・Qualcomm等が支援する形で設立。2020年にはRISC-V Internationalとして非営利の国際標準化団体に再編されました(スイスに法人移転)。

中国ではライセンスフリーのRISC-Vが特に歓迎され、Alibaba(T-Head/玄铁)・Huawei・中国国防関連機関が積極的に採用。インドはRISC-VをITイニシアチブの基盤として位置付けています。

2023〜2024年にはESP32-C6(RISC-V)・GigaDevice GD32VF103・StarFive JH7110(Linuxが動くRISC-V SoC、Raspberry Piの競合)など多数の製品が登場し、実用段階に入っています。

技術仕様

基本命令セット

命令セットビット幅説明
RV32E32ビット組み込み向け縮小版(16レジスタ)
RV32I32ビット32ビット整数命令(標準)
RV64I64ビット64ビット整数命令
RV128I128ビット将来向け(未実用化)

標準拡張

拡張名称内容
MMultiply整数乗算・除算・剰余
AAtomicアトミック操作(マルチコア同期)
FFloat単精度浮動小数点
DDouble倍精度浮動小数点
CCompressed16ビット圧縮命令(コードサイズ削減)
BBit manipulationビット操作命令
VVectorSIMD/ベクトル演算
HHypervisor仮想化サポート
NUser-level interruptsユーザーモード割り込み
JJIT動的言語最適化
TTransactionalトランザクションメモリ
PPacked-SIMDパック型SIMD

よく使われる組み合わせ:

  • RV32IMAC: RTOSマイコン向け標準(ESP32-C3等)
  • RV64GC (=RV64IMAFD+C): Linux向け標準(SiFive U74等)

レジスタセット

RV32I/RV64Iは32本の汎用レジスタ(x0〜x31)を持ちます:

x0  (zero): 常に0(書き込み無視)
x1  (ra):   リターンアドレス
x2  (sp):   スタックポインタ
x3  (gp):   グローバルポインタ
x4  (tp):   スレッドポインタ
x5-x7  (t0-t2):  一時レジスタ
x8  (s0/fp): セーブドレジスタ/フレームポインタ
x9  (s1):   セーブドレジスタ
x10-x11 (a0-a1): 関数引数/戻り値
x12-x17 (a2-a7): 関数引数
x18-x27 (s2-s11): セーブドレジスタ
x28-x31 (t3-t6):  一時レジスタ

特権モード

RISC-Vの特権アーキテクチャは3段階のモードを定義:

M-mode(Machine mode): 最高特権。ファームウェア・RTOSが動作
S-mode(Supervisor mode): OSカーネル(Linux等)が動作
U-mode(User mode): ユーザープロセス

マイコン向け実装ではM-modeのみ実装することが多く、Linux向けはM/S/U全モードを実装します。

動作原理

モジュラーISA設計

RISC-Vはロードストアアーキテクチャを採用しており、演算はすべてレジスタ間で行い、メモリアクセスはLOAD/STORE命令のみです:

# RISC-V アセンブリ例(RV32I)
lw   a0, 0(sp)      # メモリからレジスタに読み込み
addi a1, a0, 42     # 即値加算
sw   a1, 4(sp)      # レジスタからメモリに書き込み

C言語からのコンパイル例:

// C言語
int add(int a, int b) {
    return a + b;
}
# GCCによるRV32I コンパイル結果
add:
    addw a0, a0, a1   # a0 = a0 + a1 (引数a, b → 戻り値)
    ret               # ja ra (リターン)

CSR(制御・状態レジスタ)

RISC-Vはシステム制御用にCSR(Control and Status Register)を持ちます:

csrr a0, mhartid    # ハートID読み取り(マルチコアのコアID)
csrw mtvec, t0      # 割り込みベクタ設定
csrr a0, mcycle     # サイクルカウンタ読み取り

割り込み・例外処理

RISC-Vの割り込みは外部割り込み(PLIC経由)・タイマー割り込み(CLINT経由)・ソフトウェア割り込みの3種類:

// RISC-V 割り込みハンドラ(FreeRTOS on RISC-V)
void vPortSetupTimerInterrupt(void) {
    // MACHINEタイマー割り込み設定
    *CLINT_MTIMECMP = *CLINT_MTIME + TIMER_INTERVAL;
    // タイマー割り込み有効化
    __asm volatile("csrs mie, %0" :: "r"(MIE_MTIE));
}

用途・ユースケース

IoTマイコン

ESP32-C3(RV32IMC、160MHz)・ESP32-C6(RV32IMC、160MHz、Wi-Fi6/BLE5.3搭載)はRISC-Vベースのマイコンとして普及しています。Arduino IDE・ESP-IDF両方で開発でき、既存のESP32資産を活用できます。

// ESP32-C3 (RISC-V) でのGPIO制御(ESP-IDF)
#include "driver/gpio.h"
gpio_set_direction(GPIO_NUM_8, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_NUM_8, 1);

FPGA上のソフトコア

RISC-Vのオープン性はFPGA上のソフトコアプロセッサに最適です。VexRiscV・PicoRV32・NEORV32などのオープンソースRISC-VコアをFPGAに実装し、カスタムアクセラレータと組み合わせた独自SoCを構築できます。

研究・教育

オープンなISAのため、大学の計算機アーキテクチャ講義での採用が増えています。バークレーのChisel(Scala DSL)でのRISC-V実装演習が世界的に普及しています。

高性能組み込みLinux

SiFive U74(RV64GC)・StarFive JH7110はLinuxが動作するRISC-Vプロセッサです。StarFive VisionFive 2(JH7110搭載)はRaspberry Pi 4に近い性能を持つRISC-V SBCとして注目を集めています。

実装・開発のポイント

ツールチェーン

# RISC-V GCCツールチェーンのインストール
sudo apt install gcc-riscv64-unknown-elf

# RV32IMAC向けコンパイル
riscv64-unknown-elf-gcc \
  -march=rv32imac \
  -mabi=ilp32 \
  -Os \
  -o firmware.elf \
  main.c

# ELFをバイナリに変換
riscv64-unknown-elf-objcopy -O binary firmware.elf firmware.bin

OpenOCDでのデバッグ

# OpenOCDを使ったJTAGデバッグ(ESP32-C3)
openocd -f board/esp32c3-builtin.cfg

# GDB接続
riscv64-unknown-elf-gdb firmware.elf
(gdb) target remote :3333
(gdb) monitor reset halt
(gdb) load

FreeRTOS on RISC-V

FreeRTOS v10.4以降はRISC-Vを公式サポートしています:

// FreeRTOS RISC-V ポートの設定(FreeRTOSConfig.h)
#define configMTIME_BASE_ADDRESS    0x200BFF8  // CLINT MTIME
#define configMTIMECMP_BASE_ADDRESS 0x2004000  // CLINT MTIMECMP

コードサイズ最適化

C拡張(圧縮命令)を使うとコードサイズが約30%削減されます:

# C拡張有効でコンパイル
riscv64-unknown-elf-gcc -march=rv32imc ...   # Cあり(圧縮命令有効)
riscv64-unknown-elf-gcc -march=rv32im ...    # Cなし(比較用)

他技術との比較

RISC-V vs ARM Cortex-M

項目RISC-VARM Cortex-M
ライセンス無償・オープンARM IPライセンス料
エコシステム成長中成熟・豊富
IDE・デバッガOpenOCD+GDB等Keil/IAR/CubeIDE等
実績新興(2015年以降)2004年から成熟
RTOS対応FreeRTOS・Zephyr等全主要RTOSが対応
NVIC相当PLIC/CLINT(設計依存)標準化NVIC
ベンダー数増加中ARM・ST・Nordic・NXP等多数

ARM Cortex-Mはエコシステムの成熟度と入手しやすさで優位ですが、RISC-Vはコスト・カスタマイズ性・ベンダー依存排除の観点で選ばれるケースが増えています。

RISC-V vs x86

x86/x64はCISCアーキテクチャで命令が複雑ですが、高度な最適化コンパイラとデコーダにより高い実効性能を出します。RISC-Vは設計のシンプルさ・消費電力の低さで組み込み向けに優位ですが、デスクトップ/サーバー市場ではまだx86に遠く及びません。

関連用語

参考リンク