最近Chiselもそれなりに扱えるようになってきたので、もう少し深く突っ込むべくRocket Chipの解析を進めています。
なので、これからしばらくはRocket Chipのコード読み進めた際のメモを垂れ流しにしていくつもりです。
今回はその前段階の準備としてRocket Chipの環境構築をまとめておきます。
Rocket Chipの環境構築
とは言いながらも、基本的にはgithubのリポジトリの手順に従えばOK。
ところでRocket Chipのgithubリポジトリがchipsallianceになったんですね。古いアドレスでも勝手にリダイレクト入るんで支障はありませんが。
- 旧)https://github.com/freechipsproject/rocket-chip.git
- 新)https://github.com/chipsalliance/rocket-chip
というか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)
- 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の環境構築についてまとめました。