Synthesijer@高位合成友の会

たばたさんと共同で主催させてもらった,高位合成友の会でSynthesijerについて発表させていただきました.

たばたさんのneon light compiler,高前田先生@NAISTのPyCoRAMの話も大変面白く開発意欲がかき立てられた一日になりました.

さて,スライドでも紹介した演算のチェイニングを早くリリースできるよう実装すすめないと.

Synthesijer.Scalaの代入・状態遷移について

Synthesijer.Scalaでは,特定の状態でのレジスタへの代入は

sig0 <= (state, sig1)

と,条件付きの状態遷移は

state0 -> (flag, state1)

と記述するようにしていたのですが,美しくないというコメントをいただき,また同時に”*”ではどうか,というご提案をいただいたので対応してみました.

つまり,

sig0 <= state * sig1

あるいは,

state0 * flag -> state1

というように書けるようになります.

いわゆるベンディングマシンの例題であれば,次のような記述になります.

package synthesijer.scala

class VendingMachine(n:String, c:String, r:String) extends Module(n, c, r){
  
  def this() = this("vendingmachine", "clk", "reset")
  
  val nickel = inP("nickel")
  val dime = inP("dime")
  val rdy = outP("rdy")
  val seq = sequencer("main")
  
  val s5,s10,s15,s_ok = seq.add()
  rdy <= seq.idle * LOW
  
  rdy <= s_ok * HIGH
  seq.idle * nickel -> s5
  seq.idle * dime -> s10

  s5 * nickel -> s10
  s5 * dime -> s15

  s10 * nickel -> s15
  s10 * dime -> s_ok

  s15 * nickel -> s_ok
  s15 * dime -> s_ok

  s_ok -> seq.idle

}

ガードライクに書ける方がいいのでは?というコメントももらったので,後で試してみよう.

ユーザーズマニュアル(暫定版)

あけましておめでとうございます.
本年もSynthesijerおよびわさらぼをよろしくお願いいたします.

さて,タイトルの通りですが,
Synthesijerのユーザーズマニュアル相当のドキュメントを書き始めました.

まだまだ書かなければならなそうな項目を挙げつらったというレベルですが,
随時アップデートしていくつもりです.

こちらからどうぞ.

WindowsでSynthesijerのsample/benchを試す

Synthesijerのサンプルに含まれているsample/bench以下には、素数を並べるサンプル(Prime.java)、ソートのサンプル(BubbleSort, MergeSort)が入っています。

このサンプルをWindows(Cygwin環境)で試してみました。

前提

  • CygwinでJava 7が動く環境が用意できているとします。
  • Synthesijerのダウンロードページからsynthesijer-20141211.jarをダウンロード、cygwin上で環境変数SYNTHESIJERがそのjarファイルのパスにセットされているとします。
  • Synthesijerのダウンロードページからsynthesijer_lib_20141124.zipをダウンロード、展開しているとします。

注意 SYNTHESIJERのパスはcygwinでなく、Windowsでたどれる必要があります。相対パスで指定するのが問題に遭遇しにくいです。

準備

Windows版のGHDLバイナリをインストールする

https://www.youtube.com/watch?v=8YOWdvW_IAc を参考に、Downloading GHDLをダウンロードしてインストール。
Cygwinから呼び出せるように下記のようにして実行パスに追加。

export PATH=/cygdrive/c/Program\ Files\ \(x86\)/Ghdl/bin:$PATH

Windows版のGtkWaveバイナリをインストールする

GtkWaveからgtkwave-3.3.64-bin-win32.zipをダウンロード。こちらは展開するだけ。私の場合は展開したファイル一式を~/Applications/に移動して、

export PATH=~/Applications/gtkwave-3.3.64-bin-win32/gtkwave/bin:$PATH

とパスを通しました。

HDLライブラリの追加

これらのサンプルではコード内部で配列を使っています。Makefileでは、相対パス

../../lib/vhdl/dualportram.vhd

なパスに配列に相当するメモリのHDLコードを必要とします。これは、Synthesijerのダウンロードページのsynthesijer_lib_20141124.zipに含まれています。ダウンロードして展開、synthesijer_lib_20141124ディレクトリをlibという名前で、synthesijer_samples_20141124と同じ階層に移動してください。

実行

準備が終わったら、makeしてシミュレーション、結果を確認すればOKです。
まずは一式をコンパイル

cd synthesijer_samples_20141124/bench
make
make ghdl32

-eオプションで実行バイナリができるはずだけど、作成されなかったので-rオプションでシミュレーションする。たとえば、次のように。結構時間がかかります。

ghdl -r primesim_top --wave=primesim_top.ghw

次のようなメッセージでシミュレーションが終われば、正常終了です。

primesim_top.vhd:109:8:@48823280ns:(assertion failure): Simulation End!
C:\Program Files (x86)\Ghdl\bin\ghdl.exe:error: assertion failed
C:\Program Files (x86)\Ghdl\bin\ghdl.exe:error: simulation failed

gtkwaveで結果を確認してみましょう。

gtkwave primesim_top.ghw

primesim

実際に計算しているtestの内部変数をみてみると65521が求められていることがわかります。

makeについて補足

ちなみに、この例では問題なくmakeできますが、java -cp に続くクラスパスの区切り文字がUnix系では:、Windowsでは;という違いがあり、Synthesijerでコンパイルするときに複数のクラスパスの指定が必要な場合には注意する必要があります。次のリリースバージョンではMakefile.cygwinを用意する予定です。

注意

リンク先のバイナリが不安という方はご自身でコンパイルするなどの対策をしてください。責任は取れませんので…