FPGA開発日記

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

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

RISC-Vベクトル拡張仕様書の読み直し、次はvtypeについて。 ここがRISC-Vベクトル拡張の一番難しいところ。vlmulに応じてベクトルの長さとグルーピングが変わる。やっかいなところ。

結構昔に翻訳したバージョンだと、LMULは整数しか取れないようになっていたが、最新版では小数も取れるようになっている。これはベクトルレジスタをより短く扱おうというもの。


github.com

3.3. ベクトル型レジスタ vtype

読み取り専用のXLEN幅を持つ ベクトル 型 CSR (vtype)は、 ベクトルレジスタファイルの内容を解釈するために使用されるデフォルトの型を提供し、 vset{i}vl{i} 命令によってのみ更新することができます。 ベクトル型は、各ベクトルレジスタの要素の構成や、複数のベクトルレジスタをどのようにグループ化するかを決定します。

vtype レジスタには、 vill 、 vma 、 vta 、 vsew[2:0] 、 vlmul[2:0] の5つのフィールドがあります。

3.3.1. ベクトル選択要素幅 vsew[2:0]

vsew の値は、動的な 選択要素幅 (SEW)を設定します。 デフォルトでは、ベクトルレジスターは、 VLEN/SEW要素に分割されているとみなされます。

3.3.2. ベクトルレジスタのグループ化(vlmul[2:0])

複数のベクトルレジスタをグループ化することで、1つのベクトル命令で複数のベクトルレジスタを操作することができます。 本仕様書では、ベクトル命令の単一オペランドとして使用される1つまたは複数のベクトルレジスタを指すために ベクトルレジスタグループ という用語を使用しています。 ベクトルレジスタグループは、2倍以上の幅の要素を、選択された幅の要素と同じベクトル長で操作することを可能にします。 また、ベクトルレジスタグループは、長いアプリケーションベクターの実行効率を高めます。

ベクトル長 の倍数 LMUL が1より大きい場合は、ベクトルレジスタグループ形成するために 結合されるベクトルレジスタのデフォルト数を表します。 実装では、LMULは整数値1,2,4,8をサポートする必要があります。

LMUL は、ベクトルレジスタで使用されるビット数を減らすために、小数値を取ることもできます。 LMUL は、1/2、1/4、1/8 の分数値を持つことができます。 小数点以下のLMULは、幅の広いベクトルが複数のベクトルレジスタを使用する必要がないため、 幅の異なる値を操作する際に使用可能なアーキテクチャレジスタの数を増やすために使用されます。 その代わり、幅の広い値は1つのベクトルレジスタを占有し、 幅の狭い値はベクトルレジスタの端数を占有することができます。

実装では、LMUL ≥ SEW{LMUL1MIN}/SEW{LMUL1MAX} の小数の LMUL 設定をサポートする必要があります。 SEW{LMUL1MIN} はLMUL=1でサポートされる最も狭いSEW値で、 SEW{LMUL1MAX} はLMUL=1でサポートされる最も広いSEW値です。 サポートされていないSEWとLMULの設定を行おうとすると、vtypevillビットが設定されます。

サポートされている小数のLMUL設定に対して、 実装はSEW{LMUL1MIN} とLMUL * SEW{LMUL1MAX} の間のSEW設定をサポートしなければなりません。

LMUL=2の場合、ベクトレジスタグループには、ベクトレジスタv nとベクトレジスタv n+1が含まれ、 ビット単位で2倍のベクト長になります。 LMUL=2のベクトレジスターグループで、奇数番号のベクトレジスターを指定する命令は予約されています。

LMUL=4 の場合、ベクトレジスターグループには 4 個のベクトレジスターが含まれ、 4 の倍数ではないベクトレジスター番号を使用して LMUL=4 のベクトレジスターグループを指定する命令は予約されます。

LMUL=8 の場合、ベクトレジスターグループには 8 個のベクトレジスターが含まれ、 8 の倍数ではないレジスター番号を使用して LMUL=8 ベクトレジスターグループを指定する命令は予約されています。

マスクレジスタは、LMULにかかわらず、常に1つのベクトレジスタとして取り扱われます。