ハードウェアの気になるあれこれ

技術的に興味のあることを調べて書いてくブログ。主にハードウェアがネタ。

Rocket Chipの環境構築

スポンサーリンク

最近Chiselもそれなりに扱えるようになってきたので、もう少し深く突っ込むべくRocket Chipの解析を進めています。
なので、これからしばらくはRocket Chipのコード読み進めた際のメモを垂れ流しにしていくつもりです。
今回はその前段階の準備としてRocket Chipの環境構築をまとめておきます。

Rocket Chipの環境構築

とは言いながらも、基本的にはgithubリポジトリの手順に従えばOK。
ところでRocket Chipのgithubリポジトリがchipsallianceになったんですね。古いアドレスでも勝手にリダイレクト入るんで支障はありませんが。

というかinstructionもそのままだし(笑)

とりあえず手順に従って構築していきます。

コードのチェックアウト

とりあえず今回は"rocket"というディレクトリの下に各種環境を構築していきます。
影響は無いけど、とりあえずgithubのアドレスは今のURLに変更。

$ mkdir prj
$ cd prj
$ git clone https://github.com/chipsalliance/rocket-chip
$ cd rocket-chip

とりあえずバージョンを把握しておきたいのでtagのデータを使用することにしておきます。
今回は直近の一番新しいスナップショットである"v1.2-050719-SNAPSHOT"を使うことに。

$ git tag
v1.2-032519-SNAPSHOT
v1.2-050719-SNAPSHOT
$ git checkout -b v1.2-050719-SNAPSHOT refs/tags/v1.2-050719-SNAPSHOT
$ git submodule update --init --recursive

riscv-toolchainの準備

すでにビルドして持ってるよーという人は飛ばしてOK。
これも手順に従ってビルドを進める。とりあえずsubmoduleのアップデートがやたら長いので、気長に待つべし。
今回は64bit版にするのでsubmoduleのアップデートが終わったらbuild.shを実行するだけ

$ mkdir tools/rv64gc
$ cd tools/rv64gc
$ export RISCV=$PWD
$ mkdir src
$ cd src
$ git clone https://github.com/freechipsproject/rocket-tools
$ cd rocket-tools
$ git submodule update --init --recursive
$ export MAKEFLAGS="$MAKEFLAGS -jN" # Assuming you have N cores on your host system
$ ./build.sh

なお上記の手順にはmake時のコア数を指定するためMAKEFLAGSの指定が入っているが、手元で-j8を指定して実行したらエラーになった。
そのため1coreで回してみたところ正常にビルドが完了した。

direnvを使ったtoolchainパスの切り替え

毎回ツールパス設定をするのは面倒なのでdirenv使ってrocket用のディレクトリに入った時に環境変数が設定されるようにしておく。

direnvのインストールについては以下の記事をご覧ください。

"rocket"に設定用のファイルを作って以下のようなパス設定を行っておく。

  • rocket/.envrc
export RISCV=/home/diningyo/prj/risc-v/rocket/tools/rv64gc
export PATH=$RISCV/bin:$PATH

上記の設定を作ったら以下のコマンドを実行して、設定は完了。

direnv allow ./rocket

エミュレータのビルド

次はビルド、、なんだけどREADMEには書いていない(自分が見落としてるだけかも)外部ツールが必要なので、一応書いておく。
たぶん、これ(Rocket Chip)触る人なら入ってないわけ無いでしょー的な感じで省かれてるやつ。

  • dtc (device tree compiler)
    • Chiselのソースのビルド時に内部でメモリマップを生成しており、それをdtcで処理しているため
    • 筆者の使ってるUbuntuではインストール直後には入ってない。(あとWindowsのWSL環境も)
  • python
    • Rocket Chip内部で使用しているROM/RAMはpythonで書かれたコードジェネレータが使用されてるようで、これを実行するために必要
    • WindowsのWSL環境にはpythonが入ってないので別途インストールが必要(これでエラーが出てpythonがはいってないことに気づいた)

上記の依存ツールもインストールされているなら、後はただ単にディレクトリに移動してmakeを実行すればOK。なお、以下のemulatorディレクトリで生成されるのはそのディレクトリの名前が示す通りエミュレータになる。
実行にはverilatorが必要になるが、verilator自体のビルド&インストールがmakeのプロセスに含まれているので特に準備は不要。
#というか場合によっては自前のverilatorが原因でエラーになることも(後述)

$ cd emulator
$ make

ビルドが終わるとmakeを実行したディレクトリ直下に

  • emulator-freechips.rocketchip.system-DefaultConfig

というエミュレータが生成されているはずだ。

verilatorのバージョン

前述したとおりRocket Chipはverilatorのバージョン縛りがあるようだ。
筆者はverilatorをソースからビルドしたものを使っていて、そのバージョンは

  • Verilator 4.012 2019-03-23 rev UNKNOWN_REV

だった。
最初特に気にせずに実行したところ、以下のようなエラーが出てエミュレータのビルドに失敗してしまった。

make VM_PARALLEL_BUILDS=1 -C /home/diningyo/prj/risc-v/rocket/prj/rocket-chip/emulator/generated-src/freechips.rocketchip.system.DefaultConfig -f VTestHarness.mk
make[1]: ディレクトリ '/home/diningyo/prj/risc-v/rocket/prj/rocket-chip/emulator/generated-src/freechips.rocketchip.system.DefaultConfig' に入ります
make[1]: VTestHarness.mk: そのようなファイルやディレクトリはありません
make[1]: *** ターゲット 'VTestHarness.mk' を make するルールがありません.  中止.
make[1]: ディレクトリ '/home/diningyo/prj/risc-v/rocket/prj/rocket-chip/emulator/generated-src/freechips.rocketchip.system.DefaultConfig' から出ます
Makefrag-verilator:73: ターゲット 'emulator-freechips.rocketchip.system-DefaultConfig' のレシピで失敗しました

エミュレータを使ったriscv-tests/ベンチマークの実行

エミュレータが生成できたら、次のコマンドで各種プログラムを実行することが可能だ。

$ make -jN run-asm-tests
$ make -jN run-bmark-tests

デバッグ用のエミュレータ

波形を生成したい場合は、波形取得用のエミュレータを別途生成して実行する必要がある。

$ cd emulator
$ make debug
  • プログラムの実行
$ make -jN run-asm-tests-debug
$ make -jN run-bmark-tests-debug

合成可能なVerilog HDLファイルの生成

以下を実行することで生成が可能。

$ cd vsim
$ make verilog

ということでRocket Chipの環境構築についてまとめました。