FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Chisel3で外部モジュールをロードする場合に必要なbuild.sbtの変更点

https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20181105/20181105012126.png

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_resourceother_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