Synthesijer.ScalaはScalaでRTL設計をするためのDSLです.Scalaの言語機能を使った柔軟なRTL設計を目指しています.
このエントリでは,Eclipse+Scala IDEを使ったSynthesijer.Scalaの利用方法として,環境設定からLチカまでを紹介します.
準備の準備
まずは,EclipseでScala開発ができる準備を整えましょう.SynthesijerにはJava8が必要なのでJava8の環境も必要です.
- Java8をインストールする
- Eclipseをインストール.Eclipse IDE for Java Developersでよいです.
- Scala IDEをインストール.サイトのupdate sitesにあるURLをEclipseの[Help]->[New Software…]に追加してScala関係一式をインストール
準備
SynthesijerおよびSynthesijer.Scala関連のプロジェクトをEclipseにインポートします.手順は次の通りです.
- Synthesijerをcloneします
- Project Explorerで右クリックし[Import…]を選択.Importダイアログで[Git]の[Project from Git]を選択し,[Next]をクリック.
- Import Projects from Gitダイアログで[Clone URI]を選択し,[Next]をクリック
- URIに”https://github.com/synthesijer/synthesijer.git”を入力し,[Next]をクリック.branchはでmasterにチェックがあることを確認し,[Next]をクリック.
- gitの先のディレクトリを訪ねられますので,任意のフォルダを指定して[Next]を.私はEclipseのワーキングディレクトリの下のsynthesijerディレクトリを指定しました.
- Import existing Eclipse projectsにチェックがあるのを確認して[Next]
- [Finish]をクリックして完了
- 同様にSynthesijer.scalaをcloneします.URIはhttps://github.com/synthesijer/synthesijer.scala.git です.
Lチカ
まずはLチカ相当のコードを書いてみることにしましょう.
開発用のプロジェクトを作る
- Package Explorerで右クリックして[New]->[Project…]を選択します.New Projectウィザードで[Scala Wizards]の下の[Scala Project]をクリックします.
- 適当な名前,たとえば,synthesijer.scala_testのプロジェクトを作成します.使用するJREのバージョンがJavaSE-1.8になっていることを確認して[Finish]をクリックします.
- 作成したプロジェクトのビルドパスにsynthesijerとsynthesijer.scalaを追加します.
- プロジェクトにマウスカーソルをあわせて右クリックし,[Build Path]->[Configure Build Path…]を選択します.
- ProjectsタブでAddボタンをクリックし,synthesijerとsynthesijer.scalaにチェックをいれて[OK]をクリック.ダイアログも[OK]で閉じれば完了です.
Scalaファイルを作る
- 作成したsrcフォルダにマウスカーソルをあわせて右クリック,[New]->[Scala Class]を選択します
- 適当な名前,たとえば,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クラスを使った状態遷移機械の設計を,後日紹介の予定です.