FPGA開発日記

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

RustでRISC-V命令セットシミュレータを作ろう (2. rv32ui-pのすべてのテストパタンをPassさせる)

f:id:msyksphinz:20190224185310p:plain

Rustで作るRISC-Vシミュレータ。基本的な形が出来上がったので、次に命令を追加してテストパタンをパスさせていく。 必要なのは命令を追加するだけなので、どんどん追加していく。 今回は特にハマるところはなく命令を追加していくことができたのだが、やはりオーバフローを検出してしまうので対応するのが面倒だ。 ひたすらWrappingを追加していった。

github.com

という訳で、rv32ui-p-xxxのテストパタンはすべてPASSできるようになった。これで基本的な形は完成なので、MMUとか、浮動小数点などの命令の対応を追加していこうと思う。

ついでに、リグレッションテストも追加していった。 リグレッションテストの環境は、各テストに対してcargo runを実行していくだけなので、単純に以下のようにしている。

TEST_PATTERNS = $(wildcard ./riscv-tests/isa/rv32ui-p-*.bin)
RUN_PATTERNS = $(addsuffix _run,$(notdir $(basename $(TEST_PATTERNS))))

.PHONY : all

all: $(RUN_PATTERNS)

%_run:
        @cargo run -q ./riscv-tests/isa/$(subst _run,.bin,$@) > /dev/null

これでテストを実行する。無事にPASSさせることができた。

$ make -j4
PASS : ./riscv-tests/isa/rv32ui-p-jal.bin
PASS : ./riscv-tests/isa/rv32ui-p-lhu.bin
PASS : ./riscv-tests/isa/rv32ui-p-slti.bin
PASS : ./riscv-tests/isa/rv32ui-p-sll.bin
PASS : ./riscv-tests/isa/rv32ui-p-sra.bin
PASS : ./riscv-tests/isa/rv32ui-p-sh.bin
PASS : ./riscv-tests/isa/rv32ui-p-blt.bin
PASS : ./riscv-tests/isa/rv32ui-p-and.bin
PASS : ./riscv-tests/isa/rv32ui-p-andi.bin
PASS : ./riscv-tests/isa/rv32ui-p-xor.bin
PASS : ./riscv-tests/isa/rv32ui-p-sltu.bin
PASS : ./riscv-tests/isa/rv32ui-p-bge.bin
PASS : ./riscv-tests/isa/rv32ui-p-jalr.bin
PASS : ./riscv-tests/isa/rv32ui-p-bne.bin
PASS : ./riscv-tests/isa/rv32ui-p-srai.bin
PASS : ./riscv-tests/isa/rv32ui-p-lw.bin
PASS : ./riscv-tests/isa/rv32ui-p-bltu.bin
PASS : ./riscv-tests/isa/rv32ui-p-lbu.bin
PASS : ./riscv-tests/isa/rv32ui-p-beq.bin
PASS : ./riscv-tests/isa/rv32ui-p-ori.bin
PASS : ./riscv-tests/isa/rv32ui-p-lui.bin
PASS : ./riscv-tests/isa/rv32ui-p-sltiu.bin
PASS : ./riscv-tests/isa/rv32ui-p-srli.bin
PASS : ./riscv-tests/isa/rv32ui-p-add.bin
PASS : ./riscv-tests/isa/rv32ui-p-slt.bin
PASS : ./riscv-tests/isa/rv32ui-p-lh.bin
PASS : ./riscv-tests/isa/rv32ui-p-fence_i.bin
PASS : ./riscv-tests/isa/rv32ui-p-slli.bin
PASS : ./riscv-tests/isa/rv32ui-p-xori.bin
PASS : ./riscv-tests/isa/rv32ui-p-addi.bin
PASS : ./riscv-tests/isa/rv32ui-p-bgeu.bin
PASS : ./riscv-tests/isa/rv32ui-p-srl.bin
PASS : ./riscv-tests/isa/rv32ui-p-sw.bin
PASS : ./riscv-tests/isa/rv32ui-p-simple.bin
PASS : ./riscv-tests/isa/rv32ui-p-auipc.bin
PASS : ./riscv-tests/isa/rv32ui-p-sb.bin
PASS : ./riscv-tests/isa/rv32ui-p-or.bin
PASS : ./riscv-tests/isa/rv32ui-p-lb.bin
PASS : ./riscv-tests/isa/rv32ui-p-sub.bin