FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (4. vstartレジスタ)

RISC-Vベクトル拡張仕様書の読み直し、次はvstartについて。

これは単純。要するにベクトル要素のどこから演算を開始させるか、という話。

github.com

github.com


3.6. ベクトルスタートインデックスCSR vstart

読み書き可能なCSRである vstart は、 Prestart, Active, Inactive, Body, and Tail Element Definitions 項で説明したように、 ベクトル命令で実行される最初の要素のインデックスを指定します。

通常、vstart はベクトル命令の例外発生時にハードウェアによってのみ書き込まれ、 vstart の値は例外発生した要素 (同期例外または非同期割り込み) を表し、 再開可能な例外が処理された後に実行が再開されるべき要素を表します。

すべてのベクトル命令は、 vstart CSR で指定された要素インデックスから実行を開始し、 書き込みベクトル内の以前の要素には影響を与えず、実行終了時には vstart CSR をゼロにリセットするように定義されています。

Note: vset{i}vl{i} を含むすべてのベクトル命令は、vstart CSR をゼロにリセットします。 vstart は、不正命令例外を発生させるベクトル命令によって変更されません。

vstart CSR は、最大の要素インデックスを保持するのに十分な書き込み可能なビットのみを持つように定義されます (最大 VLMAX より 1 つ少ない)。

Note: 最大のベクトル長は、最大のLMUL設定(8)と最小のSEW設定(8)で得られるため、VLMAX_max = 8*VLEN/8 = VLENとなります。 例えば、VLEN=256の場合、vstart は、0から255までのインデックスを表す8ビットを持つことになります。 現在のSEW設定の最大要素インデックスよりも大きい vstart 値の使用は予約されています。

Note: vstart が範囲外の場合には、実装で例外を発生させることが推奨されています。 上位の vstart ビットの将来的な使用法として、 不正確な例外情報を保存することが考えられるため、 例外を発生させることは必須ではありません。 vstart CSR は非特権コードによって書き込み可能ですが、 非ゼロの vstart 値はいくつかの実装でベクトル命令の実行速度を大幅に低下させる可能性があるため、 vstart はアプリケーション・プログラマーが使用すべきではありません。 いくつかのベクトル命令は、非ゼロの vstart 値では実行できず、 以下に定義するような不正な命令例外を発生させます。

Note: vstart を非特権コードから見えるようにすることは、 ユーザレベルのスレッディングライブラリをサポートします。 実装は、同じ vtype 設定で同じ命令を実行した場合でも、 実装が決して生成できない vstart の値を持つベクトル命令を実行しようとした場合、 不正命令例外を発生させることが許可されています。

Note: 例えば、ある実装では、ベクトル演算命令の実行中には決して割り込みを受け取らず、 命令が完了するまで待って割り込みを受け取ります。 そのような実装では、 vstart が0でないときにベクトル演算命令を実行しようとすると、 不正な命令例外を発生させることができます。

Note: マイクロアーキテクチャの異なる 2 つの hart 間でソフトウェア・スレッドを移行する場合、 vstart 値は新しい hart のマイクロアーキテクチャーではサポートされていない可能性があります。 その場合、受信側の hart のランタイムは、サポートされている vstart 要素の位置への命令実行をエミュレートしなければならないかもしれません。 あるいは、移行イベントは、相互にサポートされる vstart 位置でのみ発生するように制約することもできます。