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

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

riscv-sodorをintelliJ IDEAで解析する環境を整えた話

スポンサーリンク

前回のChiselネタではVCD波形の確認に使うGTKWaveのビルドについてをまとめた。

www.tech-diningyo.info

今回はChisel-bootcampの傍らで確認を始めているRISC-Vの実装の一つsodorの実行&解析環境を作る際にIntelliJ IDEAとsbtの扱いでハマった話を備忘のためにまとめてみる。

RISC-V Sodor

SodorはRISC-VのISAの教育用に作られたRISC-Vの実装の一つでChiselで記述されている。そのためChiselの公式サイトにもChiselを学ぶための一つの方法としても紹介されている。

chisel.eecs.berkeley.edu

githubで公開されておりREADMEの手順に従って環境を構築していくと、verilatorを使った実行環境が簡単に構築可能となっている。このリポジトリでは1stageのシンプルな構成から5stageのSodorコアまでが公開されておりCPUの作り方やRISC-VのISA、Chiselの勉強と色々なことが学べる作りだ。

github.com

またSodorのWikiに記載されているが、PYNQ-Z1やAtry A7-35TといったFPGAボードへの実装も行われているようだ。

FPGA開発日記でも既に取り上げてくださっているので、こちらも合わせてどうぞ.

msyksphinz.hatenablog.com

SodorのsbtプロジェクトをIntelliJ IDEAで見ようとした話

今回の本題はそんな勉強にはもってこいのSodorコアプロジェクトを解析するための環境をIntelliJ IDEAに構築して楽に解析できる環境を作ろうとしたという話である。

そんなんただ単にgit cloneしてそこにプロジェクト作れば良いんでしょ??という話ではあるのだが、いかんせんScalaやsbtがまだ馴染んでいない自分がやると思ったとおりにいかなかったのです。。。

プロジェクト作成

少し前にchisel-templateのプロジェクトを立ち上げた際には新規のプロジェクト作成を行って設定していった。今回改めて色々調べてみると、IntelliJ IDEAはsbtプロジェクトのインポートもサポートしていることがわかったので今回はその手順で紹介していく。

pleiades.io

まずは適当なディレクトリにsodorをクローンする。それからIntelliJ IDEAを起動

$ git clone https://github.com/ucb-bar/riscv-sodor.git 103_riscv-sodor
$ idea &

開いた画面で"Import Project"を選択

f:id:diningyo-kpuku-jougeki:20190114163118p:plain

ファイルの選択画面が開くので、上記でクローンしたSodorのディレクトリの直下に存在する"build.sbt"を選んでOKを選択。

f:id:diningyo-kpuku-jougeki:20190114163212p:plain

インポート時の設定画面で赤枠の部分のチェックボックスにチェックを入れてOKを選択

すると通常のプロジェクトの画面に移動すると同時に"build.sbt"の解析が行われて初期化が始まる。

と、ここまでは普通にプロジェクトを作成しただけである。

何が問題だったのか?

自分が期待していたのは、ソースコードを開いた際に全てのソースがリンクしておりマウスやキーボード操作で定義に飛べるという状態だった。これが使えるかどうかで解析の効率が大きく変わるからだ。

で環境構築が終わったので、いざ解析!!と適当なファイルを開いて見たのが以下の画面。

f:id:diningyo-kpuku-jougeki:20190114163248p:plain
修正前:なんか色味が少ない気が。。。

あれ、、なんかすごくシンプルに見える気が、、、と違和感を感じたのが、それは間違ってなかった。通常だとCtrl+マウス右クリックとかあとはキーボード操作でも定義に飛べたりするんだけど、それが一切効かない。。。

参考までに最終的にこの問題が解決した状態なのが、以下の画像

f:id:diningyo-kpuku-jougeki:20190114163314p:plain
解決後のソースコード画面

強調表示されてる部分が多くなっているのがお分かりになると思う。

解決するための手順

色々IntelliJ IDEAの設定を変えてみたり、ディレクトリ構成をいじったりしてみたのだが、最終的には以下の様にディレクトリ構成を変更してその変更に合わせて"build.sbt"を修正することでこの問題が解決することがわかった。

変更前のプロジェクト構成が以下。

f:id:diningyo-kpuku-jougeki:20190114163955p:plain
sodorのgithubそのままのディレクトリ構成

そして変更後のプロジェクト構成が以下になる。違いは赤枠で囲んだ部分を見てもらえればわかるとおりsbtの各サブプロジェクトのルートディレクトリにsrc/main/scalaというディレクトリを追加してその下にファイルを配置するように変更したことにある。

f:id:diningyo-kpuku-jougeki:20190114184201p:plain
変更後のディレクトリ構成

sbtの仕組みとしては必ずしもこのディレクトリ構成に従う必要はないみたいではあるけど、特に逆らう理由もないので自分でsbtを使ったプロジェクトを作る際には標準の構成に従っておいたほうがいい気がする。

とりあえず上記の修正を行うと、IntelliJ IDEAでもパスの探索がうまく出来るようで以下の画像のように"rv32_1stage"の"top.scala"から"common"の下にあるファイルのデータに対してもリンク機能が働くようになった。

f:id:diningyo-kpuku-jougeki:20190114190419p:plain
リンク機能が動いた!

やっぱりもう少しsbt自体も勉強しないといかんな、これは。。

おまけ

今回構築したSodor用プロジェクトでは以下のコマンドをsbt shell上で実行するとプロジェクトに応じたSodorコアのRTLが生成される。

[IJ]sbt:root-103_riscv-sodor> <common以外のサブプロジェクト名>/run

どんなRTLが生成されているのか興味があれば実行して見てみてほしい。 今回の各種調査で解析するための環境が立ち上がったので、今やってるChisel-bootcampが一通り終わったあとは、このSodorコアを通してもう少し実践的なChiselの書き方とRISC-Vを学んでいこうと思う。