カテゴリー別アーカイブ: Synthesijer.Scala

シンプルなSynthesijer.Scalaの始め方(1)

activator(sbt)を使ったシンプルなSynthesijer.Scalaの始め方について紹介します.EclipseでScalaプラグインを使って開発する場合には,Synthesijer.Scalaを使ってみる(Eclipse編)も参照してください.

その前に

SynthesijerはJavaプログラム”を”同様な振る舞いをするVHDL/Verilog HDLに変換しますが,Synthesijer.ScalaはScala”で”RTLモジュール(最終的にはVHDLあるいはVerilog HDLで出力)を組み立てるツールです.クロックレベルでの制御,同時並行処理を記述できます.

準備

続きを読む

Synthesijer.Scalaでソーティングネットワークを書いてみる

※ kick,busyのクロック遅延が気に入らなかったので若干回路を変更しました(8/19)

ネットワークの構成は,もっともシンプルな構成のひとつである,最大の要素を一番下に落としていくというタイプの実装です. ソーティングネットワーク(Wikipedia)で”バブルソートにあたる”と紹介されているもの,です.

構成要素の実装からはじめて,ネットワークの組み立て部分を紹介していきます.最後にコードの全容を掲載しています.

プリミティブ

ネットワークを構成するプリミティブは,2つの入力を受け取り,小さいほうを上に,大きいほうを下に出力する,というコンポーネントです.

Synthesijer.Scalaで書くとこんな感じです.

// プリミティブを生成するメソッド
// a, bはハードウェア世界の演算要素のインスタンス
def prim_net(a:ExprItem, b:ExprItem):(ExprItem, ExprItem) = {
  val s0, s1 = signal(32) // 新しいsignal(ハードウェア世界の変数)を生成する
  s0 := ?(a > b, b, a) // S0には小さい方を接続
  s1 := ?(a > b, a, b) // S1には大きい方を接続
  return (s0, s1)
}

signal(32)で32bitの信号(VHDLでいうsignal,Verilog HDLでいうwireかreg)をつくり,それぞれに比較器の出力を接続しています.メソッド自体の返り値は,ソート結果が格納された信号インスタンスのペアです.

続きを読む

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.scala の大きな変更

Synthesijer.scalaの演算系を大幅に変更しました.従来は,たとえば,カウンタのインクリメントを

counter <= expr(Op.+, counter, 1)

などと不細工に記述する必要があったのですが,

counter <= counter + 1

と,すっきり記述できるようになりました.

今後は,ユーザとして記述するSynthesijer.scalaコードでは,exprメソッドの呼び出しは禁止されるようになります.

また,都合上,定数を利用したい場合に,これまでは,

 new Value(10, 32)

と作成していたのですが,これからはModule.scalaで定義されているvalueメソッドを使って

 value(10, 32)

とするように変更されました.

この変更は,今までのバージョンとの互換性がありません.従来通りexprを自分で呼び出して式を組み立てたい場合には引き続き0.1を利用してください.

新しく始める方は最新版のバイナリパッケージ0.2.1または,Gitからソースコードをcloneしてご利用ください.

リコンフィギャラブル研究会で発表させていただきました

“企業における”という発表をさせていただくのは大変おこがましいのですが,
せっかく機会をいただけましたので,
イーツリーズ・ジャパンでのアプリケーション開発の事例紹介と
開発に際して開発コストを削減する取り組みについて紹介させていただきました.
後半1/3〜1/4くらいがSynthesijerとSynthesijer.scalaの話です.