Chisel3を使っていて、どうもメインディレクトリの外部にあるソースコードを参照したい、Mavenに登録してあるわけではないのだけれども、ローカルに作ってあるクラスを参照して作りたいなと思ったとき。
例えば、以下のようなモジュールを開発しており、これを別のプロジェクトから参照したい。
other_resource.scala
package other_resource import chisel3._ import chisel3.util._ import chisel3.Bool class other_resource extends Module { val io = IO(new Bundle { val in1 = Input(UInt(32.W)) val in2 = Input(UInt(32.W)) val out = Output(UInt(32.W)) }) io.out := io.in1 + io.in2 }
ref_other_resource.scala
package ref_other_resource import chisel3._ import chisel3.util._ import chisel3.Bool import other_resource._ class ref_other_resource extends Module { val io = IO(new Bundle { val in1 = Input(UInt(32.W)) val in2 = Input(UInt(32.W)) val out = Output(UInt(32.W)) }) val i_ref = Module(new other_resource()) i_ref.io.in1 := io.in1 i_ref.io.in2 := io.in2 io.out := i_ref.io.out } object main extends App { chisel3.Driver.emitVerilog(new ref_other_resource()) }
それぞれ、ディレクトリの位置関係は以下のようになる。
. ├── build.sbt ├── other_resource │ ├── build.sbt │ └── src │ └── main │ └── scala │ └── other_resource │ └── other_resource.scala └── src └── main └── scala └── ref_other_resource └── ref_other_resource.scala
bulid.sbtに特に何も細工をしないと、ref_other_resource.scala
からはother_resource
のモジュールは参照できない。
そこで、build.sbt
に依存関係を加える。
lazy val other_resource = project lazy val root = (project in file(".")) .dependsOn(other_resource) .aggregate(other_resource)
詳細な解説は以下のsbt公式マニュアルを参照してほしいが、まずはother_resource
のプロジェクトを登録する(val other_resource = project
というのは簡易的な書き方で、実際にはlazy val other_resource = (project in file("other_resource"))
と書かなければならないらしい。変数名とプロジェクトのディレクトリが同一の場合は上記の省略記法が有効となる。
root
はルートディレクトリのプロジェクト。つまり、ref_other_resource
を参照している。ここで、ref_other_resource
プロジェクトに対してother_resource
プロジェクトの依存関係を加えている。DependsOn
がそれだ。
この記述により、ref_other_resource
はother_resource
を参照することができ、回路を生成することができる。
sbt 'runMain ref_other_resource.main`
[info] Loading settings for project root from build.sbt ... [info] Loading settings for project other_resource from build.sbt ... ... [info] Running ref_other_resource.main [info] [0.004] Elaborating design... [info] [2.709] Done elaborating. ... Total FIRRTL Compile Time: 636.1 ms [success] Total time: 16 s, completed 2019/08/27 3:10:41