FPGA開発日記

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

Sniperの動作原理をトレースする (4. RISC-V Decoderの解析)

SniperRISC-Vのベクトル命令をサポートするために、RISC-Vデコーダについて解析する。

SniperRISC-Vデコーダは、RV8をベースとしている。RV8のデコーダに情報を追加していく。

https://github.com/michaeljclark/rv8

  • 命令の追加 (meta/opcodes)
# RVV (actually its rvv but temporary assigned to F)
vsetvli    rd rs1 oimm12       31..31=0 14..12=7 6..2=21 1..0=3                                    i    rv64v
vle8.v     vd rs1              31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=0 6..2=1 1..0=3 i+v  rv64v
vse8.v     vs3 rs1             31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=0 6..2=9 1..0=3 s+v  rv64v
vle16.v    vd rs1              31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=5 6..2=1 1..0=3 i+v  rv64v
vse16.v    vs3 rs1             31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=5 6..2=9 1..0=3 s+v  rv64v
vle32.v    vd rs1              31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=6 6..2=1 1..0=3 i+v  rv64v
vse32.v    vs3 rs1             31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=6 6..2=9 1..0=3 s+v  rv64v
vle64.v    vd rs1              31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=7 6..2=1 1..0=3 i+v  rv64v
vse64.v    vs3 rs1             31..29=0 28..28=0 27..26=0 25..25=1 24..20=0 14..12=7 6..2=9 1..0=3 s+v  rv64v
vlse8.v    vd rs1 rs2          31..29=0 28..28=0 27..26=0 25..25=1          14..12=0 6..2=1 1..0=3 i+vs  rv64v
vsse8.v    vs3 rs1 rs2         31..29=0 28..28=0 27..26=0 25..25=1          14..12=0 6..2=9 1..0=3 s+vs  rv64v
vlse16.v   vd rs1 rs2          31..29=0 28..28=0 27..26=0 25..25=1          14..12=5 6..2=1 1..0=3 i+vs  rv64v
vsse16.v   vs3 rs1 rs2         31..29=0 28..28=0 27..26=0 25..25=1          14..12=5 6..2=9 1..0=3 s+vs  rv64v
vlse32.v   vd rs1 rs2          31..29=0 28..28=0 27..26=0 25..25=1          14..12=6 6..2=1 1..0=3 i+vs  rv64v
vsse32.v   vs3 rs1 rs2         31..29=0 28..28=0 27..26=0 25..25=1          14..12=6 6..2=9 1..0=3 s+vs  rv64v
vlse64.v   vd rs1 rs2          31..29=0 28..28=0 27..26=0 25..25=1          14..12=7 6..2=1 1..0=3 i+vs  rv64v
vsse64.v   vs3 rs1 rs2         31..29=0 28..28=0 27..26=0 25..25=1          14..12=7 6..2=9 1..0=3 s+vs  rv64v

命令とオペランドは良しとして、codecが謎すぎる。i+v / i+vs というのは、命令オペランドの組を示している。これは meta/codec で示されている。

  • codec (meta/codecs)
i+v        vd,rs1                 vd rs1
s+v        vs3,rs1                vs3 rs1
i+vs       vd,rs1,rs2             vd rs1 rs2
s+vs       vs3,rs1,rs2            vs3 rs1 rs2
v0  v0  vreg  caller  "Vector Registers"
v1  v1  vreg  caller  "Vector Registers"
v2  v2  vreg  caller  "Vector Registers"
v3  v3  vreg  caller  "Vector Registers"
v4  v4  vreg  caller  "Vector Registers"
...
v29 v29 vreg  caller  "Vector Registers"
v30 v30 vreg  caller  "Vector Registers"
v31 v31 vreg  caller  "Vector Registers"
  • フォーマット (meta/formats)
# Vector
vd,rs1
vs3,rs1
vd,rs1,rs2
vs3,rs1,rs2

これにより、RV8上に命令の定義とデコーダが生成される。これをSniperで読み込むことでSniperでのベクトル動作がサポートされる。

Running cycle 4567
** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
FIRST  LOAD:  (:0x112)
-------------------------------

** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
 LOAD:  (:0x112)
-------------------------------

** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
 LOAD:  (:0x112)
-------------------------------

** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
 LOAD:  (:0x112)
-------------------------------

** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
 LOAD:  (:0x112)
-------------------------------

** simulate:  LOAD   (:0x 112)  --  vle8.v      v8, a1
===============================
 LOAD:  (:0x112)
-------------------------------