Synthesijer.Scalaを使ってみる(Eclipse編)

Pocket

Synthesijer.ScalaはScalaでRTL設計をするためのDSLです.Scalaの言語機能を使った柔軟なRTL設計を目指しています.

このエントリでは,Eclipse+Scala IDEを使ったSynthesijer.Scalaの利用方法として,環境設定からLチカまでを紹介します.

準備の準備

まずは,EclipseでScala開発ができる準備を整えましょう.SynthesijerにはJava8が必要なのでJava8の環境も必要です.

  1. Java8をインストールする
  2. Eclipseをインストール.Eclipse IDE for Java Developersでよいです.
  3. Scala IDEをインストール.サイトのupdate sitesにあるURLをEclipseの[Help]->[New Software…]に追加してScala関係一式をインストール

準備

SynthesijerおよびSynthesijer.Scala関連のプロジェクトをEclipseにインポートします.手順は次の通りです.

  1. Synthesijerをcloneします
    1. Project Explorerで右クリックし[Import…]を選択.Importダイアログで[Git]の[Project from Git]を選択し,[Next]をクリック.
    2. Import Projects from Gitダイアログで[Clone URI]を選択し,[Next]をクリック
    3. URIに”https://github.com/synthesijer/synthesijer.git”を入力し,[Next]をクリック.branchはでmasterにチェックがあることを確認し,[Next]をクリック.
    4. gitの先のディレクトリを訪ねられますので,任意のフォルダを指定して[Next]を.私はEclipseのワーキングディレクトリの下のsynthesijerディレクトリを指定しました.
    5. Import existing Eclipse projectsにチェックがあるのを確認して[Next]
    6. [Finish]をクリックして完了
  2. 同様にSynthesijer.scalaをcloneします.URIはhttps://github.com/synthesijer/synthesijer.scala.git です.

Lチカ

まずはLチカ相当のコードを書いてみることにしましょう.

開発用のプロジェクトを作る

  1. Package Explorerで右クリックして[New]->[Project…]を選択します.New Projectウィザードで[Scala Wizards]の下の[Scala Project]をクリックします.
  2. 適当な名前,たとえば,synthesijer.scala_testのプロジェクトを作成します.使用するJREのバージョンがJavaSE-1.8になっていることを確認して[Finish]をクリックします.
  3. 作成したプロジェクトのビルドパスにsynthesijerとsynthesijer.scalaを追加します.
    1. プロジェクトにマウスカーソルをあわせて右クリックし,[Build Path]->[Configure Build Path…]を選択します.
    2. ProjectsタブでAddボタンをクリックし,synthesijerとsynthesijer.scalaにチェックをいれて[OK]をクリック.ダイアログも[OK]で閉じれば完了です.

Scalaファイルを作る

  1. 作成したsrcフォルダにマウスカーソルをあわせて右クリック,[New]->[Scala Class]を選択します
  2. 適当な名前,たとえば,testと入力して[Finish]をクリックします.test.scalaがプロジェクトに追加されました.

Lチカコードを書いてみる

たとえばLチカのモジュールは次のように設計できます.

import synthesijer.scala._
class test {
  val m = new Module("test", "clk", "reset")
  val q = m.outP("q")
  val counter = m.signal(32)
  counter $ m.sysClk := counter + 1
  q := counter.ref(20)
}

これはLチカに相当するtestというモジュールを定義しただけなので,HDL生成する必要があります.HDLの生成にはModuleに備わっているgenVHDLというメソッドを呼びます.

上のコードに続けて,実行用のmainメソッドの記述を追加します.

object test{
  def main(args:Array[String]) = {
    val obj = new test()
    obj.m.genVHDL()
  }
}

コードの記述はこれでおしまいです.

Lチカコードを生成する

書いたScalaスクリプトを実行することでHDLコードが得られます.Eclipseでは実行したいScalaスクリプトのファイルの上で右クリックし[Run As]->[Scala Application]をクリックすることで,そのスクリプトを実行できます.

実行すると,実行したディレクトリ,すなわちプロジェクトのディレクトリ直下にtest.vhdが作成されていることが確認できます.

Eclipseではプロジェクトでコンテクストメニューから[Refresh]を選択すると,生成したファイルが確認できます.

シミュレーションコードも書いてみる

SimModuleというシミュレーション用のモジュールを利用できます.今度は継承して作ってみました.独立したファイルでもいいですが,今回はtestと同じくtest.scalaファイルの中に追加します.

class test_sim extends SimModule("test_sim"){
  val (clk, reset, counter) = system(10)
  val test = new test()
  val i = instance(test.m, "U", clk, reset)
  i.signalFor(test.q) $ clk := ?(counter < 10, HIGH, LOW)
}

生成は,先のmainメソッドの中に生成用の記述を追加します.

object test{
  def main(args:Array[String]) = {
    val obj = new test()
    obj.m.genVHDL()
    val sim = new test_sim()
    sim.genVHDL()
  }
}

実行すると,test.vhdとtest_sim.vhdができあがります.

次は?

紹介したLチカコードではModuleクラスのインスタンスを生成し,そのインスタンスに対して明示的にポートや信号,動作を追加していきました.大規模なモジュールを生成する場合には,シミュレーションコードの例のように,Moduleクラスを継承したクラスを作ることで,より自然な(と思うのですが…)記述ができるでしょう.

ライブラリや記号についてはSynthesijer.scalaのコードやsamplesを参考にしてください.また,若干,情報が古いですが,どのようなツールかについては,下記のスライドが参考になるかもしれません.代入文に関してのアップデートはこのブログのここここに関連した情報があります.

Sequencerクラスを使った状態遷移機械の設計を,後日紹介の予定です.