RISC-Vには、命令セットをテストするためのテストベンチが付いている。
これを使うと、自前のシミュレータを使ってシミュレータの機能をテストできる。 どのような構造になっているのか調べてみる。
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を比較しながら進むテストパタンではなく、テストパタン自身がパタンの成功/不成功を判定するため、セルフチェックパタンということか。