どうも、たくチャレ(@takuchalle)です。

どうやら最近RISC-VのエミュレータをRustで書くのが流行っているようなので、僕も流行りに乗ってみることにします。

RISC-V とは

このブログを見てるくらいの人はRISC-Vの説明は不要かと思いますが、RISC-VはオープンソースでライセンスフリーなISAを定義しています。 通常x86ARMなどのアーキテクチャはライセンス料を払ってCPUを作ります。このライセンス料がバカにならないので、ライセンスフリーなRISC-Vに注目が集まっています。1

RISC-V の仕様書

オープンソースなアーキテクチャであるため公式サイトのSpecificationsに仕様書が公開されています。

RISC-Vの命令セットには下記の基本命令があります。

  • RV32I(32bitアドレッシング・整数命令)
  • RV32E(32bitアドレッシング・組み込み向け命令)
  • RV64I(64bitアドレッシング・整数命令)
  • RV128I(128bitアドレッシング・整数命令)

さらにM、A/F/D/Q/L/C/B/J/T/P/V/Nといった拡張命令がありますが、これらは追々見ていこうと思います。

まずは一番基本になりそうなRV32Iの命令を見ていこうと思います。

RV32I

RV32Iには以下のようなR/I/S/Uという4つの命令フォーマットがあります。

RISC-V base instruction formats from spcification

次に、最初に出てくる命令セットのADDIを見てみます。ADDIは指定したレジスタと即値を足して指定したレジスタに書き込む命令です。

Integer Resiger-Immediate Instructions from spcification

これを見ると下位7bitopcodefunct3を見ることで一意の命令を特定できそうです。

リポジトリ

ひとまずADDIをデコードして実行するとこまで実装しました。次はriscv-testsを通すために必要な命令や機能を実装していこうと思います。

リポジトリはこちら。

RISC-V emulator written in Rust. Contribute to takuchalle/rriscv development by creating an account

  1. x86 や ARM と置き換わるというとそれは私は懐疑的です ↩︎