sbtでSynthesijer.Scala開発を始める

Pocket

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とか使うのかな?).自分でダウンロードしてインストールするのであれば次のリンク先を参照してください.

基本的に,どちらもダウンロードしてきて展開,パスを通すだけ,です.

プロジェクト用意

sbtが使えるようになったら,早速Synthesijer.Scalaを使うためのプロジェクトを作成しましょう.まずは,テンプレートを使ってsbtプロジェクトを作成します.

sbt new sbt/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.0.1"
  )

これで準備が完了です.

ハードウェアの設計

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");

    println(led.genUCF())
    println(led.genXDC())
  }
}

実行

sbtコマンドでScalaプログラムをコンパイルして実行できます.

sbt run

これで,Lチカハードウェアが生成できました.

1 thought on “sbtでSynthesijer.Scala開発を始める

  1. ピンバック: 続・sbtでSynthesijer.Scala開発を始める | わさらぼ

コメントは停止中です。