前回のChiselネタではVCD波形の確認に使うGTKWaveのビルドについてをまとめた。
今回はChisel-bootcampの傍らで確認を始めているRISC-Vの実装の一つsodorの実行&解析環境を作る際にIntelliJ IDEAとsbtの扱いでハマった話を備忘のためにまとめてみる。
RISC-V Sodor
SodorはRISC-VのISAの教育用に作られたRISC-Vの実装の一つでChiselで記述されている。そのためChiselの公式サイトにもChiselを学ぶための一つの方法としても紹介されている。
githubで公開されておりREADMEの手順に従って環境を構築していくと、verilatorを使った実行環境が簡単に構築可能となっている。このリポジトリでは1stageのシンプルな構成から5stageのSodorコアまでが公開されておりCPUの作り方やRISC-VのISA、Chiselの勉強と色々なことが学べる作りだ。
またSodorのWikiに記載されているが、PYNQ-Z1やAtry A7-35TといったFPGAボードへの実装も行われているようだ。
FPGA開発日記でも既に取り上げてくださっているので、こちらも合わせてどうぞ.
SodorのsbtプロジェクトをIntelliJ IDEAで見ようとした話
今回の本題はそんな勉強にはもってこいのSodorコアプロジェクトを解析するための環境をIntelliJ IDEAに構築して楽に解析できる環境を作ろうとしたという話である。
そんなんただ単にgit clone
してそこにプロジェクト作れば良いんでしょ??という話ではあるのだが、いかんせんScalaやsbtがまだ馴染んでいない自分がやると思ったとおりにいかなかったのです。。。
プロジェクト作成
少し前にchisel-templateのプロジェクトを立ち上げた際には新規のプロジェクト作成を行って設定していった。今回改めて色々調べてみると、IntelliJ IDEAはsbtプロジェクトのインポートもサポートしていることがわかったので今回はその手順で紹介していく。
まずは適当なディレクトリにsodorをクローンする。それからIntelliJ IDEAを起動
$ git clone https://github.com/ucb-bar/riscv-sodor.git 103_riscv-sodor $ idea &
開いた画面で"Import Project"を選択
ファイルの選択画面が開くので、上記でクローンしたSodorのディレクトリの直下に存在する"build.sbt"を選んでOKを選択。
インポート時の設定画面で赤枠の部分のチェックボックスにチェックを入れてOKを選択
すると通常のプロジェクトの画面に移動すると同時に"build.sbt"の解析が行われて初期化が始まる。
と、ここまでは普通にプロジェクトを作成しただけである。
何が問題だったのか?
自分が期待していたのは、ソースコードを開いた際に全てのソースがリンクしておりマウスやキーボード操作で定義に飛べるという状態だった。これが使えるかどうかで解析の効率が大きく変わるからだ。
で環境構築が終わったので、いざ解析!!と適当なファイルを開いて見たのが以下の画面。
あれ、、なんかすごくシンプルに見える気が、、、と違和感を感じたのが、それは間違ってなかった。通常だとCtrl+マウス右クリック
とかあとはキーボード操作でも定義に飛べたりするんだけど、それが一切効かない。。。
参考までに最終的にこの問題が解決した状態なのが、以下の画像
強調表示されてる部分が多くなっているのがお分かりになると思う。
解決するための手順
色々IntelliJ IDEAの設定を変えてみたり、ディレクトリ構成をいじったりしてみたのだが、最終的には以下の様にディレクトリ構成を変更してその変更に合わせて"build.sbt"を修正することでこの問題が解決することがわかった。
変更前のプロジェクト構成が以下。
そして変更後のプロジェクト構成が以下になる。違いは赤枠で囲んだ部分を見てもらえればわかるとおりsbtの各サブプロジェクトのルートディレクトリにsrc/main/scala
というディレクトリを追加してその下にファイルを配置するように変更したことにある。
sbtの仕組みとしては必ずしもこのディレクトリ構成に従う必要はないみたいではあるけど、特に逆らう理由もないので自分でsbtを使ったプロジェクトを作る際には標準の構成に従っておいたほうがいい気がする。
とりあえず上記の修正を行うと、IntelliJ IDEAでもパスの探索がうまく出来るようで以下の画像のように"rv32_1stage"の"top.scala"から"common"の下にあるファイルのデータに対してもリンク機能が働くようになった。
やっぱりもう少しsbt自体も勉強しないといかんな、これは。。
おまけ
今回構築したSodor用プロジェクトでは以下のコマンドをsbt shell上で実行するとプロジェクトに応じたSodorコアのRTLが生成される。
[IJ]sbt:root-103_riscv-sodor> <common以外のサブプロジェクト名>/run
どんなRTLが生成されているのか興味があれば実行して見てみてほしい。 今回の各種調査で解析するための環境が立ち上がったので、今やってるChisel-bootcampが一通り終わったあとは、このSodorコアを通してもう少し実践的なChiselの書き方とRISC-Vを学んでいこうと思う。