FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (11. ベクトルロード命令)

RISC-Vベクトル拡張仕様書の読み直し。次はベクトルロード命令。

github.com

github.com


7. ベクトルロード・ストア命令

ベクトルのロードとストアは、ベクトルレジスタとメモリの間で値を移動させます。 ベクトルロードとストアはマスクされ、非アクティブな要素で例外を発生させません。 マスク付きベクタロード命令は、マスク付きAgnostics (vtype.vma=1) が指定されていない限り、 書き込みベクトルレジスタグループの非アクティブな要素を更新しません。 マスク付きベクトルストアは、アクティブなメモリ要素のみを更新します。 すべてのベクトルロードとストアは、ゼロではない vstart 値を生成して受け入れることができます。

7.1. ベクトルロードストア命令のエンコーディング

フィールド 説明
rs1[4:0] ベースアドレスを保持する x レジスタを指定する
rs2[4:0] ストライドを保持する x レジスタを指定する
vs2[4:0] アドレスオフセットを保持するための v レジスタを指定する
vs3[4:0] ストアデータを保持する v レジスタを指定する
vd[4:0] ロードの書き込み v レジスタを指定する
vm ベクトルマスキングが有効かどうか (0 = mask enabled, 1 = mask disabled) を指定する
width[2:0] メモリ要素のサイズを指定しする。FPスカラレジスタとは区別される
mew 拡張メモリ要素幅、 Vector Load/Store Width Encoding を参照のこと
mop[1:0] メモリアドレッシングモードを指定する
nf[2:0] セグメントロードストア命令において、各セグメントのフィールド数を指定する
lumop[4:0]/sumop[4:0] ユニットストライドの種類を指定するエンコーディングを指定する

ベクトルメモリユニットストライドおよびコンスタントストライド操作では、転送するデータのEEWを命令内で直接静的にエンコードすることで、 幅が混在するルーチンでメモリをアクセスする際の vtype の変更回数を減らすことができます。 インデックス付き演算では、命令内の明示的なEEWエンコーディングにより、 使用するインデックスのサイズを設定し、SEW/LMULによりデータ幅を指定します。

7.2. ベクトルロードストアアドレッシングモード

ベクトル拡張は、ユニットストライドストライド、インデックス(スキャッター/ギャザー)のアドレッシングモードをサポートしています。 ベクターのロード/ストアベースレジスタストライドは、GPRの x レジスタから取得されます。

すべてのベクトルアクセスのベースとなる実効アドレスは、 rs1 で指定された x レジスタの内容で与えられます。

ベクトルのユニットストライド演算は、ベース有効アドレスからメモリ内に連続して格納されている要素をアクセスします。

ベクターの定数ストライド演算では、ベース実効アドレスで最初のメモリ要素をアクセスし、 その後,rs2で指定されるxレジスタに含まれるバイトオフセットで与えられるアドレス増分で後続の要素をアクセスします。

ベクトルインデックス演算では、 vs2 で指定されたベクトルオフセットオペランドの各要素の内容をベース実効アドレスに加算し、 各要素の実効アドレスを得ることができます。 データベクトルレジスタ群は、EEW=SEW、EMUL=LMUL、オフセットベクトルレジスタ群は、 命令内でEEW符号化、EMUL=(EEW/SEW)*LMULとなります。

ベクトル・オフセット・オペランドは、バイトアドレス・オフセットのベクトルとして扱われます。

Note: インデックス付き演算は、オブジェクトのベクトル内のフィールドをアクセスするためにも使用できます。 この場合,vs2 ベクトルはオブジェクトのベースへのポインタを保持し、スカラ x レジスタは各オブジェクト内のメンバ・フィールドのオフセットを保持します。 このケースをサポートすることが、要素のインデックスをデータEEWでスケーリングするインデックス付き演算が定義されなかった理由です。 ベクトルオフセットの要素がXLENより狭い場合は、ベースの実効アドレスに追加する前にXLENまでゼロ拡張されます。 ベクトルオフセット要素の幅がXLENよりも広い場合は、アドレスの計算に最下位のXLENビットが使用されます。 EEWがオフセット要素に対してサポートされていない場合、実装は不正な命令例外を発生させることができます。

Note: プロファイルは、サポートされる最大のインデックスEEWに、ELENよりも小さい上限を設けることができます(例えば、XLENまでのみ)。 ベクトルアドレッシングモードは、2ビットの mop[1:0] フィールドを使ってエンコードされます。

mop [1:0] 説明 オペコード
0 0 unit-stride VLE
0 1 indexed-unordered VLUXEI
1 0 strided VLSE
1 1 indexed-ordered VLOXEI
mop [1:0] 説明 オペコード
0 0 unit-stride VSE
0 1 indexed-unordered VSUXEI
1 0 strided VSSE
1 1 indexed-ordered VSOXEI

ベクトルのユニットストライドおよびコンスタントストライドのメモリアクセスでは、個々の要素のアクセス間の順序付けは保証されません。 ベクトルのインデックス付きロードおよびストアのメモリ操作には、順序付きと非順序付きの2つの形式があります。 indexed-ordered の場合は、メモリアクセス時の要素の順序を保持します。

順序なしの命令(mop!=11)では、要素アクセスの順序は保証されません。 強く順序付けられたIO領域へのアクセスの場合、要素のアクセスはどのような順序でも開始できます。

Note: 強く順序付けられたIO領域への順序付けられたベクターアクセスを提供するためには、 順序付けられたインデックス付き命令を使用する必要があります。 精密なベクトルトラップを備えた実装では、 インデックス付きの非順序型ストアの例外も精密でなければなりません。

追加のユニットストライドベクトルアドレッシングモードは、 ユニットストライドロード命令およびストア命令のエンコーディングにおいて、 それぞれ5ビットの lumop および sumop フィールドにエンコードされます。

lumop[4:0] Description
0 0 0 0 0 unit-stride load
0 1 0 0 0 unit-stride, whole register load
0 1 0 1 1 unit-stride, mask load, EEW=8
1 0 0 0 0 unit-stride fault-only-first
x x x x x other encodings reserved
sumop[4:0] Description
0 0 0 0 0 unit-stride store
0 1 0 0 0 unit-stride, whole register store
0 1 0 1 1 unit-stride, mask store, EEW=8
x x x x x other encodings reserved

nf[2:0] フィールドは、各セグメントのフィールドの数をエンコードします。 通常のベクトルロード/ストアでは、 nf=0で、各要素の位置でベクターレジスターグループとメモリーの間で1つの値が移動することを示します。 より大きな値の nf フィールドは、後述の Vector Load/Store Segment Instructions 項で説明するように、 セグメント内の複数の連続したフィールドにアクセスするために使用されます。

Note: セグメントロード/ストアのための nf フィールドは、 アドレスオフセットフィールドのための同じビットの使用に取って代わりました。 セグメントロード/ストアは、メモリとの間でアイテムを移動するためのより強力なプリミティブを追加する一方で、 オフセットは単一のスカラー整数の計算で置き換えることができます。 また、 nf[2:0] フィールドは、ホールベクタレジスタの ロード/ストア命令で転送するホールベクタレジスタの数をエンコードします。