RISCOFを使って、Bit-manipulationのためのテストパタンを作って流してみる。
RISCOFについては、過去にブログで調査したのでこれが役に立った。
RISCOFのサポートするriscv-arch-testsにはB拡張のテストが含まれており、これをRISCOFで生成してテストを作成する。 さらに、Spikeで実行するための環境を整える。
$ riscof setup --dutname=b_ext --refname=spike
--refname=spike
により、リファレンスモデルがSpikeに変更される。
ただしこれだけではテストパタンは動いてくれないので、設定ファイルを書き換える必要がある。
今回は、例えばこうした。拡張のためのオプションを追加して、elfを指定してログを出力するようにしている。
spike/riscof_spike.py
#TODO: You will need to add any other arguments to your DUT # executable if any in the quotes below execute += self.ref_exe + " --isa=rv64gc_zba_zbb_zbc_zbs -l " + elf + " > spike.log 2>&1"
次に、コンフィグレーションを変更して、B拡張(Zba, Zbb, Zbc, Zbs)のテストパタンを生成する。
b_ext/b_ext_isa.yaml
hart_ids: [0] hart0: ISA: RV64IMCZicsr_Zifencei_Zba_Zbb_Zbc_Zbs physical_addr_sz: 32 User_Spec_Version: '2.3' supported_xlen: [64] misa: reset-val: 0x40001104 rv64: accessible: true mxl: implemented: true type: warl: dependency_fields: [] legal: - mxl[1:0] in [0x1] wr_illegal: - Unchanged extensions: implemented: true type: warl: dependency_fields: [] legal: - extensions[25:0] bitmask [0x0001104, 0x0000000] wr_illegal: - Unchanged
Spikeでテストパタンを実行する。
$ riscof testlist --config=config.ini --suite=riscv-arch-test/riscv-test-suite/ --env=riscv-arch-test/riscv-test-suite/env $ riscof run --config=config.ini --suite=riscv-arch-test/riscv-test-suite/ --env=riscv-arch-test/riscv-test-suite/env
無事にSpikeのログファイルが生成されている。
$ ls -1 riscof_work/rv64i_m/B/src/*/ref/spike.log
riscof_work/rv64i_m/B/src/add.uw-01.S/ref/spike.log riscof_work/rv64i_m/B/src/andn-01.S/ref/spike.log riscof_work/rv64i_m/B/src/bclr-01.S/ref/spike.log riscof_work/rv64i_m/B/src/bclri-01.S/ref/spike.log riscof_work/rv64i_m/B/src/bext-01.S/ref/spike.log /* ... 途中省略 ... */ riscof_work/rv64i_m/B/src/sh3add-01.S/ref/spike.log riscof_work/rv64i_m/B/src/sh3add.uw-01.S/ref/spike.log riscof_work/rv64i_m/B/src/slli.uw-01.S/ref/spike.log riscof_work/rv64i_m/B/src/xnor-01.S/ref/spike.log riscof_work/rv64i_m/B/src/zext.h_64-01.S/ref/spike.log
riscof_work/rv64i_m/B/src/add.uw-01.S/ref/spike.log
core 0: 0x00000000800003f4 (0x00000013) nop core 0: 0x00000000800003f8 (0x00000013) nop core 0: 0x00000000800003fc (0x00000013) nop core 0: 0x0000000080000400 (0xbff00f13) li t5, -1025 core 0: 0x0000000080000404 (0xff700f93) li t6, -9 core 0: 0x0000000080000408 (0x09ff0fbb) add.uw t6, t5, t6 core 0: 0x000000008000040c (0x01f0b023) sd t6, 0(ra) core 0: 0x0000000080000410 (0xbff00e93) li t4, -1025 core 0: 0x0000000080000414 (0xfff00f13) li t5, -1 core 0: 0x0000000080000418 (0x001f5f13) srli t5, t5, 1 core 0: 0x000000008000041c (0x09ee8ebb) add.uw t4, t4, t5 core 0: 0x0000000080000420 (0x01d0b423) sd t4, 8(ra) core 0: 0x0000000080000424 (0xbff00f93) li t6, -1025 core 0: 0x0000000080000428 (0x00100e93) li t4, 1 core 0: 0x000000008000042c (0x03ee9e93) slli t4, t4, 62 core 0: 0x0000000080000430 (0xfffece93) not t4, t4 core 0: 0x0000000080000434 (0x09df8f3b) add.uw t5, t6, t4 core 0: 0x0000000080000438 (0x01e0b823) sd t5, 16(ra) core 0: 0x000000008000043c (0xbff00e13) li t3, -1025 core 0: 0x0000000080000440 (0xbff00e13) li t3, -1025 core 0: 0x0000000080000444 (0x09ce0e3b) add.uw t3, t3, t3 core 0: 0x0000000080000448 (0x01c0bc23) sd t3, 24(ra) core 0: 0x000000008000044c (0xbff00d13) li s10, -1025 core 0: 0x0000000080000450 (0xbff00d13) li s10, -1025 core 0: 0x0000000080000454 (0x09ad0dbb) add.uw s11, s10, s10