RISC-Vの命令

RISC-Vの基本命令は次の図に示す32ビットの固定長命令で、4種類の形式がある。どの形式でもrd/rs1/rs2のレジスタ指定ビットの位置は同じでデコードがやり易い設計である。

整数レジスタはX0-X31の32個であるが、X0は固定値ゼロを保持するレジスタである。浮動小数点レジスタは32個で、4アドレスのFused型の積和フォーマットもサポートしている。

  • 基本ISAの命令フォーマット

    基本ISAの命令フォーマット。基本ISAの命令は、32ビット固定長である。整数レジスタは32個であるが、X0はゼロ固定

アトミックオペレーションは、フェッチ-OPタイプとLoad-Reserved/Store Conditionalタイプをサポートしている。また、すべてのアトミック命令は2ビットのAcquire/Releaseビットを持ち、リリースコンシステンシーかシーケンシャルコンシステンシーかを指定することができる。

  • Fetch-and-OPタイプとLoad-Reserved/Store Conditionalタイプのアトミックメモリ操作がサポートされている

    Fetch-and-OPタイプとLoad-Reserved/Store Conditionalタイプのアトミックメモリ操作がサポートされている

命令を16ビットに圧縮するC拡張

標準拡張のCは、命令コードの圧縮を行う拡張である。命令コードの圧縮は、ローエンドの組み込みデバイスでは命令メモリを節約するために重要である。また、ハイエンドのコマーシャルなワークロードの場合でも、命令キャッシュのフットプリントを小さくしてキャッシュミスを減らすことができる。

32ビットのRISC-V命令は3アドレス命令であるが、圧縮する場合は、2アドレス命令に変更し、オフセットなどの直値のビット数を減らし、圧縮対象となる命令の種類を限定することで命令コードのビット数も減らして命令を16ビット長に短縮している。また、使用するレジスタをよく使われる8個に限定してレジスタ指定欄のビット数を3ビットに切り詰めるというやり方も使っている。

もちろん、2アドレスではだめなケースや、直値を切り詰められない場合もあるのであるが、通常、50%~60%の命令が圧縮できるという。圧縮できる場合は、命令長が16ビットと半減するので、全体としては25%~30%の命令領域の縮小が行える。

  • RISC-Vは、Cという命令を圧縮する拡張ISAを持っている

    RISC-Vは、Cという命令を圧縮する拡張ISAを持っている。2アドレス命令で良い場合や直値のビット数を切り詰められる場合は、32ビット長の命令を16ビットに圧縮する。通常、50%~60%の命令が圧縮可能で、25%~30%命令メモリを減らせる

また、これらの拡張に加えて、ベクトル命令の拡張やハイパバイザサポートのための拡張などが検討されているとのことである。

RISC-Vの特権アーキテクチャ

RISC-Vの特権アーキテクチャは、User(U-mode)、Supervisor(S-mode)とMachine(M-mode)の3つのモードを持つ。また、これらを組み合わせたM,UとM,S,Uというモードもサポートされる。

  • RISC-Vの特権アーキテクチャ

    RISC-Vの特権アーキテクチャ。RISC-Vはユーザモード、スーパバイザモード、マシンモードという3つの特権モードを持つ

単純な組み込みシステムではM-modeだけで済み、最低、384ビットのステートを必要とするだけなので、384ビットの状態記憶があればよい。このように必要資源が非常に少ない実装が可能になっている。

  • マシンモードだけの単純な組み込みシステムでは384ビットの状態記憶があればよく、非常に小さな実装が可能である

    マシンモードだけの単純な組み込みシステムでは384ビットの状態記憶があればよく、非常に小さな実装が可能である

仮想メモリアーキテクチャ

仮想メモリアーキテクチャは、現在のUnixスタイルのOSをサポートする設計になっている。Sv32はRV32用で、デマンドページの32ビット仮想空間をサポートする。ページテーブルは2レベルで、4KiBページと4MiBのメガページをサポートしている。

Sv39はRV64用で、デマンドページの39ビット仮想空間をサポートする。ページテーブルは3レベルで、4KiBのページと2MiBのメガページ、1GiBのギガページをサポートする。Sv48、Sv57、Sv64はSv39にそれぞれ1/2/3段のページテーブルを追加して仮想空間のサイズを広げたものである。

  • 仮想メモリアーキテクチャは、現在のUnixスタイルのOSをサポートする設計になっている

    仮想メモリアーキテクチャは、現在のUnixスタイルのOSをサポートする設計になっている。Sv32はRV32用の仮想メモリアーキテクチャで32bit仮想空間。Sv39はRV64用の39bit仮想メモリ空間。そして、ページテーブルの階層を増やしたSv48、Sv57、Sv64というより広い仮想メモリ空間も使える

次の図はS-modeでセキュアブートやモニタを走らせ、S-modeでOSを走らせ、U-modeでアプリケーションを走らせるという使い方を示している。

  • Mモードでモニタを走らせ、その上のSモードでOSを走らせ、さらにその上のUモードでアプリケーションを走らせる

    Mモードでモニタを走らせ、その上のSモードでOSを走らせ、さらにその上のUモードでアプリケーションを走らせる

(次回は12月28日に掲載します)