FPGA開発日記

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

Gem5のインストール試行とベンチマーク実行 (RISC-V命令にベクトル新規命令を追加する)

Gem5に命令を追加する試行続き。命令の定義をいろいろと調べていて、前回なぜVLEおよびVSEがうまく動かなかったのかを調査していた。 結果としてVSETVLI命令をある程度きちんと実装しておかないとベンチマークとして正しく動作しないようだった。そりゃそうか。

  • src/arch/riscv/isa/decoder.isa
        0x15: decode FUNCT3 {
             0x7: decode IMMSIGN {
                format CSROp {
                   0x0 : vsetvli({{
                         if (Rs1 > 16) {
                           Rd = 16;
                         } else {
                           Rd = Rs1;
                         }
                         fprintf(stderr, "vsetvli set rd=%d, rs1=%d\n", Rd, Rs1);
                   }}, IsSerializeAfter, IsNonSpeculative, No_OpClass);
                }
             }
        }

まあ、とりあえずfprintf(stderr,を追加しているのだがこれで正しくレジスタを更新されているのかチェックしている。

これでテストを実行してみよう。

copy_data_vec:
    mv      a3, a0          # Copy destination
.loop:
    vsetvli t0, a2, e8, m1  # Vectors of 8b
    vle8.v  v0, (a1)        # Load bytes
    add     a1, a1, t0          # Bump pointer
    sub     a2, a2, t0          # Decrement count
    vse8.v  v0, (a3)            # Store bytes
    add     a3, a3, t0          # Bump pointer
    bnez    a2, .loop           # Any more?
    ret                         # Return

printf()が入っているので、この状態ではデバッグ情報が大量に出力される。

vsetvli set rd=16, rs1=150
vsetvli set rd=16, rs1=134
vsetvli set rd=16, rs1=118
vsetvli set rd=16, rs1=102
vsetvli set rd=16, rs1=86
vsetvli set rd=16, rs1=70
vsetvli set rd=16, rs1=54
vsetvli set rd=16, rs1=38
vsetvli set rd=16, rs1=22
vsetvli set rd=6, rs1=6