RISC-V

カリフォルニア大バークレー発の オープンな RISC 系命令セットアーキテクチャ (ISA)。使用にライセンス料が不要で、非営利団体が中立に管理する。『LLVMとRISC-Vによる低レイヤプログラミングの基礎』の読書を通じた整理。ISA 一般の位置づけは cpu-architecture-isa

基本設計

  • RISC = 命令をシンプルに保つ (対する CISC は多機能命令で clock が低くなりがち。x86 は内部でマイクロ ops に分解)。
  • これまでの ISA にあった HW 実装上の非効率を排除。命令数が少なくコードサイズを抑えられ高速化にも寄与。
  • XLEN = レジスタ長。32/64/128bit のレジスタを各32本持つ (組み込み向けは16本)。128bit ISA は意図的に未定義。
  • リトルエンディアン (Intel と同様。MIPS/ARM は両対応)。
  • オーバーフローでフラグが立たない設計 → ユーザー側で検査が必要。

命令

  • 比較は汎用レジスタへ格納 (SLT/SLTI)。x86 のようなフラグレジスタを使わない。
  • 分岐: BEQ (条件), J (ジャンプ), JAL (リンクレジスタに PC 退避してジャンプ = 関数呼び出し), JR (リンクレジスタへ戻る = return)。標準では戻りアドレス用に x1 を使う規約。
  • ロード: LW/LH/LB (4/2/1 byte, アライン違反でミスアライン例外)。
  • アトミック: LR.W/SC.W (Load Reserved / Store Conditional, 成功するまで繰り返し)、AMO 系 (amoadd 等)。
  • CSR 操作命令で制御レジスタを操作。例外時は mepc (PC), mcause (要因), mtval (付随情報)。

命令セット構成

  • 基本: RV32I/RV32E (組み込み)/RV64I/RV128I/RVWMP (メモリモデル)。
  • 拡張は独立性が高く基本に載せる。G = IMAFD_Zicsr_Zifencei (Zicsr = CSR制御拡張, Zifencei = 命令フェッチのフェンス拡張)。一般的には RVC (短縮命令) を加えた RV64GC。RVC でコードサイズを圧縮。
  • J-type 等は即値ビットを imm[20|10:1|11|19:12] のように並べ替えて符号化する。

特権モードと ABI

  • 特権モード: マシン(M) / スーパーバイザ(S) / ユーザー(U)。OS が資源 (disk 等) にアクセスする際に特権モードへ移行。ハイパーバイザ用モードも検討中。
  • 呼び出し規約 (ABI): 引数は reg 8個まで (超過は mem)、戻り値は reg 2つまで。t = caller saved、s = callee saved。

ツールチェーン

  • Compiler Explorer (godbolt) でアセンブリ確認、RDCYCLE でサイクル数測定。
  • pk (OS 機能 printf 等の肩代わり)、spike (命令エミュレータ): spike pk <prog> で実行。

関連