FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vの命令拡張に関するポリシに関して

RISC-Vの仕様書を一から読みなおすことを地道に続けている。RISC-Vの仕様自体についてはあまり言及することはないのだが、仕様書には面白いことに「RISC-Vの拡張」関する取り決めをした章が設けられている。"Chapter26 Extending RISC-V"がそれに相当する。

そもそもRISC-Vは、「ベースISA」である"RV32I", "RV64I",に対して拡張を搭載することで機能を拡充する、というポリシを取っている。 つまり、最も基本的な整数演算命令以外はすべて拡張機能であると決められている。この拡張機能には大きく2種類が取り決められていて、

  • 標準拡張 (Standard Extension) : MAFDQLCBTPVがそれに相当する。ハードウェア除算、浮動小数点、アトミック拡張などがそれに相当する。非常に一般的な拡張命令群で、これらは互いに命令エンコーディング空間内で衝突しないように設計されている。
  • 非標準拡張 (Non-standard Extension) : 標準拡張よりもより高度に専門化された拡張で、他の標準拡張や非標準拡張と命令エンコーディング空間がぶつかってしまう可能性もある。

RISC-Vでは32ビット命令長の命令は下位2ビットが2'b11になっており、16ビット命令は2'b00, 2'b01, 2,b10に割り当てられている。そういう意味で、RISC-Vでは下位の2ビットを「プレフィックス」と呼んでいる。 RISC-Vはリトルエンディアンなので、下位の2ビットは一般的に先にフェッチされるため、最も低いビットにプレフィックスが挿入されているという訳だ。

例えば、アトミック拡張"A"は下位の7ビットが"0101111"となっており、これがアトミックのメジャーオペコードであるということを示している。 さらにfunct3フィールドの3ビットを使ってより細かなエンコーディングを行われるが、この3ビットも残りの22ビット(32-7-3=22)のプレフィックスととらえることができる。

f:id:msyksphinz:20210817002001p:plain

さらに"グリーンフィールド拡張"と"ブラウンフィールド拡張"という分類もされている。 グリーンフィールド拡張は、新しい命令エンコーディング空間を用いて定義される拡張機能のこと。ブラウンフィールド拡張は既存のエンコーディング空間に対して特定のビットに制限を付けることで定義される拡張となり、既存のエンコーディング空間を利用するため必ず親となるグリーンフィールド拡張が存在している。

例えば、ベースISAは30ビットの空間を持つグリーンフィールド拡張であり、FDQ浮動小数点拡張はベースISAに対する30ビットのブラウンフィールド拡張であると考えることができる。 このとき、A拡張は32ビットから下位の7ビットを除いた空間である25ビットにエンコーディングされたグリーンフィールド空間であると考えることができる。

以下の図はちょっとややこしいが、

f:id:msyksphinz:20210817002102p:plain
  • RV32I / RV64I はグリーンフィールド拡張(エンコーディング空間は30ビット)
  • A拡張はグリーンフィールド拡張(エンコーディング空間は25ビット)
  • F拡張はブラウンフィールド拡張で、親となる拡張はI命令
  • D拡張はブラウンフィールド拡張で、親となる拡張はF拡張
  • Q拡張はブラウンフィールド拡張で、親となる拡張はD拡張
  • M拡張はブラウンフィールド拡張で、親となる拡張はI拡張

"No new state"というのは新しいステート(まあ端的にいえばレジスタ)が追加されるかどうかで、FDQは浮動小数レジスタとフラグが追加されるので"Add state"に分類され、A拡張とM拡張は新しいステートが追加されないので"No new state"と分類されていると考えれば良かろう。