FPGA開発日記

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

RISC-Vの命令セットテストベンチはどのようになっているのか

RISC-Vには、命令セットをテストするためのテストベンチが付いている。

github.com

これを使うと、自前のシミュレータを使ってシミュレータの機能をテストできる。 どのような構造になっているのか調べてみる。

rv32ui-p-add をダンプしてみたときの命令列を見てみよう。

rv32ui-p-add:     file format elf32-littleriscv


Disassembly of section .text:

00002000 <_start>:
    2000:       50b02573                csrr    a0,hartid
    2004:       00051063                bnez    a0,2004 <_start+0x4>
    2008:       04000513                li      a0,64
    200c:       50a53073                csrc    status,a0

00002010 <test_2>:
    2010:       00000093                li      ra,0
    2014:       00000113                li      sp,0
    2018:       002081b3                add     gp,ra,sp
    201c:       00000e93                li      t4,0
    2020:       00200e13                li      t3,2
    2024:       4dd19663                bne     gp,t4,24f0 <fail>

00002028 <test_3>:
    2028:       00100093                li      ra,1
    202c:       00100113                li      sp,1
    2030:       002081b3                add     gp,ra,sp
    2034:       00200e93                li      t4,2
    2038:       00300e13                li      t3,3
    203c:       4bd19a63                bne     gp,t4,24f0 <fail>

00002040 <test_4>:
    2040:       00300093                li      ra,3
    2044:       00700113                li      sp,7
    2048:       002081b3                add     gp,ra,sp
    204c:       00a00e93                li      t4,10
    2050:       00400e13                li      t3,4
    2054:       49d19e63                bne     gp,t4,24f0 <fail>

00002058 <test_5>:
    2058:       00000093                li      ra,0
    205c:       ffff8137                lui     sp,0xffff8
    2060:       002081b3                add     gp,ra,sp
    2064:       ffff8eb7                lui     t4,0xffff8
    2068:       00500e13                li      t3,5
    206c:       49d19263                bne     gp,t4,24f0 <fail>

先頭のhartidは、スレッドを識別するためのCSRシステムレジスタだ。これはスレッド毎に個別の値が付かなければならない。 ここでは、スレッド番号が0のパタンだけテストを行い、そうでないスレッドはその場で無限ループするようだ。

test_2から先がテストだ。 まずはraとspに値を設定し、それからadd命令を実行する。次にt4に想定する期待値(=0)を格納し、その結果をbne命令で比較して、不一致ならばfailとしてパタンを終了させる。 一致ならば次に進むという要領だ。

最終的に、この命令セットパタンは37本(2-38)までのテストを行い、最後まで成功すればtohostシステムレジスタに1を格納して終了する。

000024d4 <test_38>:
    24d4:       01000093                li      ra,16
    24d8:       01e00113                li      sp,30
    24dc:       00208033                add     zero,ra,sp
    24e0:       00000e93                li      t4,0
    24e4:       02600e13                li      t3,38
    24e8:       01d01463                bne     zero,t4,24f0 <fail>
    24ec:       01c01e63                bne     zero,t3,2508 <pass>

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>

これは、シミュレータなどとRTLを比較しながら進むテストパタンではなく、テストパタン自身がパタンの成功/不成功を判定するため、セルフチェックパタンということか。