先日Design Solution Forumで発表をしてきたのだが、その時にRocket Chipを拡張して独自命令を追加した話をした。
そのあとで他の発表の方から、RISC-Vの拡張方法についていろんな考え方が聞けたため、そういえばRISC-Vって独自の命令を追加する場合に何か考え方でもあるんだろうかと思って調査してみた。
参考にしたのは、User's ManualのRISC-Vの拡張についての説明部分だ(Chapter-21. RISC-V Extension)
ここでは命令拡張というよりも、RISC-Vの命令形態がどのような考え方に基づいて構成されているのかについて見ることが出来る。
まず大前提として、RISC-Vの命令長は基本的に32ビットをベースとしており、Compressed命令の場合は下位の2bitを見て32bitか16bitかを判定している。
ここで、命令セットにはGreenFieldの命令とBrownFieldの命令があるというのを見ておかなければならない。
- GreenField命令
最も基本となる命令セットで、RV32I、RV64Iなどがそれに該当する。RISC-Vの中で最も基本的な命令群となる。
- BrownField命令
BrownField命令は、GreenField命令の上に拡張される命令群で、BrownFieldな命令をサポートする場合はそのベースとなるGreenFieldの命令がサポートされていることが大前提となる。 例えば、浮動小数点命令のFDQ拡張は、ベースとなる命令群の拡張なのでBrownFieldの命令となる。
この図は手前味噌で自分で作った未確認の表なのだが、おそらくGreenFieldとBrownFieldは以下のように分けられると思われる。この場合に注意なのは、"A"拡張であるAtomic命令はBrownFieldではないということだ。
命令の拡張についての基本的な考え方
RISC-Vの命令の拡張において、最低限の実装であるRV32I, RV64Iを実装していれば、それ以外の拡張を取り除いてそこに自分の独自命令を追加しても構わないとなっている。 ただしこれは研究や学術教育用の話であって、これをするともちろんRISC-Vの実装としてはRV32I/RV64Iまでしか認定されないだろうし、それ以上の拡張はすべて独自のものとなっている。
また、32bit命令の拡張を行う場合でも、Compressed命令を使用しない場合であれば、命令フィールドの下位2bitの2'b00,2'b01,2'b10(Compressed命令の使用しているフィールド)を利用しても構わないという構成になっている。 従って、RISC-Vは最低限の命令セットさえ残せば、それ以外の命令セット拡張は廃止した場合その場所に自由な命令を配置しても良いという構成になっていると考えることが出来る。