FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す

RISC-Vベクトル拡張が V1.0のためのRC1になったので、改めて読み直してみることにした。 数年前にベクトル拡張の仕様書0.8あたりを日本語に翻訳したのだが、同じように日本語に変えながら理解していく。

この翻訳の成果は、以下に格納している。

github.com

v1.0-rc1からの変更点

現在まで変更なし。

1. イントロダクション

このドキュメントは、RISC-Vベクトル拡張のバージョン1.0の第2リリース候補のドラフトであり、 パブリックレビューのためのものです。

これはパブリックレビュー用の1.0の凍結版ではありません。


最終的に承認され、リリース候補のタグが外されたバージョン1.0は、 RISC-Vインターナショナルの批准プロセスの一環として、パブリックレビューのために送り出されることを意図しています。 また、バージョン1.0は、上流のソフトウェアプロジェクトを含め、ツールチェーン、機能シミュレータ、 初期実装の開発を開始するのに十分な安定性があると考えられており、 批准中に重大な問題が発見された場合を除き、 大きな機能変更はないと予想されています。批准されると、仕様書のバージョンは2.0になります。


本仕様書ドラフトには、現在定義されているベクトル命令の全セットが含まれています。 Standard Vector Extensions セクションには、標準的なベクトル拡張機能と、 それぞれの拡張機能でサポートされる命令および要素幅が記載されています。

  1. 実装により定義される定数パラメータ ベクトル拡張をサポートする各hartには、2つのパラメータが定義されています。

任意の演算で生成または消費できるベクター要素の最大サイズ(ビット) ELEN ≥ 8 で、これは2の累乗でなければなりません。

1つのベクトルレジスターのビット数 VLEN 、これは2の累乗でなければならず、2の累乗であり、216以上であってはなりません。

標準的なベクトル拡張(Standard Vector Extensions セクション)とアーキテクチャプロファイルは、 ELEN と VLEN にさらなる制約を設定することができます。


VLENの上限により、ソフトウェアはインデックスが16ビットに収まることを前提に組み立てることができます (LMUL=8およびSEW=8でVLEN=65,536の場合、最大のVLMAXは65,536になります)。 将来的にクトルレジスタあたり64Kib以上に拡張する場合は、 新しいコンフィグレーション命令が必要になりますが、 従来のコンフィグレーション命令を使用しているソフトウェアでは、 ベクトルの長さが大きくなることはありません。


ISAは、特定の制約の下で、VLENパラメータの値が異なるhart上でバイナリコードが実行されるポータブルな記述をサポートしていますが、 両方のhartが必要な要素型をサポートしていることが条件となります。


実装パラメータの違いを露呈するようなコードを書くことも可能です。



一般的に、ベクトルのステートがアクティブであるスレッドコンテキストは、 VLENまたはELENパラメータに違いのあるhart間で実行中にコンテキストを移動するとはできません。


3. ベクトル拡張のプログラミングモデル

ベクトル拡張はRISC-VのベーススカラISAに対して、 32本のベクトルレジスタと7つの非特権CSR(vstart, vxsat, vxrm, vcsr, vl, vlenb)が追加されます。

3.1. ベクトルレジスタ

ベクトル拡張により、RISC-VベーススカラISAに対して 32本のアーキテクチャベクトルレジスタv0-v31が追加される。

各ベクトルレジスタのサイズは固定長でVLENビットである。


Zfinx ("F in X") は現在議論が行われている、浮動小数点命令を 整数レジスタファイル上で実行する新しいISAオプションです。 Vector 1.0拡張はZfinxに対して互換性があります。


3.2. mstatus 内のベクトルコンテキストステータス

ベクトルコンテキストステータスフィールド VS は、 mstatus[10:9] に追加され、 sstatus[10:9] でシャドウイングされます。 これは、浮動小数点コンテキストステータスフィールドである FS と同様に定義されます。

VS フィールドがOFFに設定されている場合は、 ベクトル命令を実行しようとしたり、ベクトルCSRにアクセスしようとすると、 不正命令例外が発生します。

VS フィールドがInitialまたはCleanに設定されている場合、 ベクトルCSRを含むベクトルの状態を変更する命令を実行すると、VS がDirtyに変更されます。 また、実装では、ベクトルの状態が変化していなくても、 いつでもVS フィールドをInitialまたはCleanからDirtyに変更することができます。


VS フィールドの正確な設定は最適化に繋がります。 ソフトウェアは通常、コンテキストスワップのオーバーヘッドを減らすためにVSを使用します。


実装では、書き込み可能な misa.v フィールドを持つことができます。 浮動小数点演算ユニットの処理方法と同様に、 misa.v がクリアされていても mstatus.vs フィールドが存在する場合があります。


misa.v がクリアされているときに mstatus.vs フィールドへのアクセスを許可すると、 ベクトル操作のエミュレーションが可能になり、書き込み可能な misa.v を持つシステムでの mstatus.vs の処理が簡単になります。