Synthesijer.Scalaは,Synthesijer内のHDLビルディングブロックをScalaを使って組み立てるライブラリです.ChiselやSpinalHDLほど細かくはいじれませんが,その分,気軽にステートマシンベースのハードウェアを設計できる…と思っています.VeriloggenのSeqとThread.Streamの間くらいかな?どうかな?
以前,シンプルなSynthesijer.Scalaの始め方(1)やシンプルなSynthesijer.Scalaの始め方(2)でも簡単に導入方法を書いたのですが,今回はもっと簡単に,sbtのマネージ依存性を使った開発手法を紹介します.
準備
Synthesijer.Scalaの利用には,Java 11とsbtが必要です.まずは,これらをインストールしてください.LinuxやmacOSを使っているならパッケージ管理ツールでインストールするといいでしょう.(WindowsならChocolateyとか使うのかな?).自分でダウンロードしてインストールするのであれば次のリンク先を参照してください.
- Java 11 (OpenJDKのインストール) https://openjdk.java.net/install/
- sbtのインストール https://www.scala-sbt.org/index.html
基本的に,どちらもダウンロードしてきて展開,パスを通すだけ,です.ここの例では,openjdk 11.0.10とsbt 1.4.8を利用しています.
プロジェクト用意
sbtが使えるようになったら,早速Synthesijer.Scalaを使うためのプロジェクトを作成しましょう.まずは,テンプレートを使ってsbtプロジェクトを作成します.
sbt new scala/scala-seed.g8 --name=sjr-scala-test
ここでは,sjr-scala-testという名前でプロジェクトを作成しました.sjr-scala-testというディレクトリが作られて,その下にプロジェクトを構成するファイル群が用意されています.
プロジェクトが作成できたら,build.sbtにSynthesijer.scalaを利用するためのパスを追加します.次のように lazy val root の部分を変更すればOKです.
lazy val root = (project in file("."))
.settings(
name := "sjr-scala-test",
libraryDependencies += scalaTest % Test,
resolvers += "Github Repository" at "https://synthesijer.github.io/web/pub/",
libraryDependencies += "synthesijer" % "synthesijer" % "3.1.0"
)
これで準備が完了です.
ハードウェアの設計
src/main/scala/example/Hello.scalaの中身を書き換えてしまうことにします.以下のように書き換えましょう.
import synthesijer.scala._
object led {
def generate_led(n:Int) : Module = {
val m = new Module("led")
val q = m.outP("q")
val counter = m.signal("counter", 32)
q := counter.ref(n)
// at main state, counter <= counter + 1
val seq = m.sequencer("main")
val s0 = seq.add()
seq.idle -> s0
counter <= (seq.idle, m.VECTOR_ZERO)
counter <= (s0, counter + 1)
return m
}
def generate_sim(target:Module, name:String) : SimModule = {
val sim = new SimModule(name)
val inst = sim.instance(target, "U")
val (clk, reset, counter) = sim.system(10)
inst.sysClk := clk
inst.sysReset := reset
return sim
}
def main(args:Array[String]) = {
val led = generate_led(5)
val sim = generate_sim(led, "led_sim")
led.genVHDL()
led.genVerilog()
sim.genVHDL()
led.portFor("q").setPinID("M14"); led.portFor("q").setIoAttr("LVCMOS33");
led.sysClk.setPinID("L16"); led.sysClk.setIoAttr("LVCMOS33");
led.sysReset.setPinID("G15"); led.sysReset.setIoAttr("LVCMOS33");
led.genUCF()
led.genXDC()
}
}
実行
sbtコマンドでScalaプログラムをコンパイルして実行できます.
sbt run
これで,Lチカハードウェアが生成できました.
ピンバック: 続・sbtでSynthesijer.Scala開発を始める | わさらぼ