FPGA開発日記

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

RISC-V Vector Extension v0.9 が Readyになっているようなので要点をまとめる

RISC-V Vector ExtensionのGitHubリポジトリに静かにv0.9のタグが打たれた。 v0.8とv0.9の間にどれだけの差分があるか、調べておかなければならない。

  • v0.8のタグの付いたRevision

github.com

  • v0.9のタグの付いたRevision

github.com

という訳でGitリポジトリの差分を取ってざっくりと変更点をチェックしていく。

git diff -w 0.8..0.9 ./v-spec.adoc

変更点

  • 要素シフトのための命令追加。これまでslideupslidedownの亜種は整数レジスタとの間のみ通信する命令であったが、vfslide1up, vfslide1down命令が追加された。
vfslide1up.vf   vd, vs2, rs1, vm        # vd[0] = f[rs1], vd[i+1] = vs2[i]
vfslide1down.vf vd, vs2, rs1, vm        # vd[i] = vs2[i+1], vd[vl-1] = f[rs1]
  • 整数拡張命令。SEW/2のサイズからSEWに拡張する命令が新規追加された。
  • 整数と浮動小数点の変換命令のバリエーション追加。fcsrを無視してC言語/Javaでデフォルトとなるtruncateの丸めモードを使用する命令の追加。
# Convert float to unsigned integer, truncating.
vfcvt.rtz.xu.f.v  vd, vs2, vm
# Convert float to signed integer, truncating.
vfcvt.rtz.x.f.v   vd, vs2, vm

# Convert float to double-width unsigned integer, truncating.
vfwcvt.rtz.xu.f.v vd, vs2, vm   
# Convert float to double-width signed integer, truncating.
vfwcvt.rtz.x.f.v  vd, vs2, vm

# Convert double-width float to unsigned integer, truncating.
vfncvt.rtz.xu.f.w vd, vs2, vm
# Convert double-width float to signed integer, truncating.
vfncvt.rtz.x.f.w  vd, vs2, vm
  • ロードストア命令のバリエーション変更。vlw.v, vlh.v, vlb.v, vle.vなどのバリエーションだったが、取り扱うビット数によってバリエーションが変わる方式に変更。まあ確かに、この方が分かりやすい。
Unit-stride Load Strided Load Indexed Load Unit-stride Store Strided Store Indexed- Ordered Store Indexed- Unordred Store
8-bit vle8.v vlse8.v vlxei8.v vse8.v vsse8.v vsxei8.v vsuxei8.v
16-bit vle16.v vlse16.v vlxei16.v vse16.v vsse16.v vsxei16.v vsuxei16.v
32-bit vle32.v vlse32.v vlxei32.v vse32.v vsse32.v vsxei32.v vsuxei32.v
64-bit vle64.v vlse64.v vlxei64.v vse64.v vsse64.v vsxei64.v vsuxei64.v
128-bit vle128.v vlse128.v vlxei128.v vse128.v vsse128.v vsxei128.v vsuxei128.v
256-bit vle256.v vlse256.v vlxei256.v vse256.v vsse256.v vsxei256.v vsuxei256.v
512-bit vle512.v vlse512.v vlxei512.v vse512.v vsse512.v vsxei512.v vsuxei512.v
1024-bit vle1024.v vlse1024.v vlxei1024.v vse1024.v vsse1024.v vsxei1024.v vsuxei1024.v
  • アトミック命令も同様。ビットサイズに応じてバリエーションが変更された。
8-bit 16-bit 32-bit 64-bit
Amoswap vamoswapei8.v vamoswapei16.v vamoswapei32.v vamoswapei64.v
Amoadd vamoaddei8.v vamoaddei16.v vamoaddei32.v vamoaddei64.v
Amoxor vamoxorei8.v vamoxorei16.v vamoxorei32.v vamoxorei64.v
Amoand vamoandei8.v vamoandei16.v vamoandei32.v vamoandei64.v
Amoor vamoorei8.v vamoorei16.v vamoorei32.v vamoorei64.v
Amomin vamominei8.v vamominei16.v vamominei32.v vamominei64.v
Amomax vamomaxei8.v vamomaxei16.v vamomaxei32.v vamomaxei64.v
Amominu vamominuei8.v vamominuei16.v vamominuei32.v vamominuei64.v
Amomaxu vamomaxuei8.v vamomaxuei16.v vamomaxuei32.v vamomaxuei64.v

このvma, vtaの扱い方だが、ベクトルレジスタ内のinactive要素とtail要素をどのように取り扱うかということを規定している。

f:id:msyksphinz:20200519011026p:plain

vtype.vta vtype.vma Tail Elements Inactive Elements
0 0 undisturbed undisturbed
0 1 undisturbed agnostic
1 0 agnostic undisturbed
1 1 agnostic agnostic

Undisturbedの場合は、その要素は前の値から変更しない。一方でAgnosticの場合は、前の値から変更しないか、All-1を書き込むかのどちらかとなる。これは実装に依存する。また、vma, vtaのビットフィールド自体もRead Onlyなので、OoOのポリシに従って便利な方を選べばよい。