FPGA開発日記

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

RISC-Vの命令セットテストベンチはどのようになっているのか (最後のPass/Fail判定)

RISC-Vのriscv-testsの最後のテスト判定は、

000024f0 <fail>:
    24f0:       0ff0000f                fence
    24f4:       000e0863                beqz    t3,2504 <fail+0x14>
    24f8:       001e1e13                slli    t3,t3,0x1
    24fc:       001e6e13                ori     t3,t3,1
    2500:       51ee1073                csrw    tohost,t3
    2504:       0000006f                j       2504 <fail+0x14>

00002508 <pass>:
    2508:       0ff0000f                fence
    250c:       51e0d073                csrwi   tohost,1
    2510:       0000006f                j       2510 <pass+0x8>

failラベルに到着すると、t3が0ならば無限ループ (そもそもt3は問題番号が入っているので、通常系ではt3は0にならない) 問題番号を左1ビットシフトし、最下位ビットに1を挿入する(これは何故だろう?)。 その後に、tohost (これはシステム命令仕様書によるとホストに転送するためのレジスタらしい) にその値をセットする。

それ以外(つまり、全てのテストがパスした)場合は、tohost=1として1をホストに返す。

tohostの仕様が良く分からないのだが、これは最下位ビットを常に1にしなければならないのかな?

githubのソースを探検したのだが、良く分かなかった...

benchmarks/common/syscalls.c に以下の記述があった。

static void tohost_exit(int code)
{
  write_csr(tohost, (code << 1) | 1);
  while (1);
}

github.com

なんでだろうね?