FPGA開発日記

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

RISCOFを使ったB拡張のテストパタン生成方法

RISCOFを使って、Bit-manipulationのためのテストパタンを作って流してみる。

RISCOFについては、過去にブログで調査したのでこれが役に立った。

msyksphinz.hatenablog.com

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