sbtでSynthesijer.Scala開発を始めるのテンプレートを作りました.
sbt new synthesijer/sjr-scala.g8 --name=sjr-scala-test
cd sjr-scala-test
sbt run
で,Synthesijer.Scalaのプロジェクトを作成,サンプルからVHDL/Verilog HDLを生成できるようになりました.
sbtでSynthesijer.Scala開発を始めるのテンプレートを作りました.
sbt new synthesijer/sjr-scala.g8 --name=sjr-scala-test
cd sjr-scala-test
sbt run
で,Synthesijer.Scalaのプロジェクトを作成,サンプルからVHDL/Verilog HDLを生成できるようになりました.
Synthesijer.Scalaは,Synthesijer内のHDLビルディングブロックをScalaを使って組み立てるライブラリです.ChiselやSpinalHDLほど細かくはいじれませんが,その分,気軽にステートマシンベースのハードウェアを設計できる…と思っています.VeriloggenのSeqとThread.Streamの間くらいかな?どうかな?
以前,シンプルなSynthesijer.Scalaの始め方(1)やシンプルなSynthesijer.Scalaの始め方(2)でも簡単に導入方法を書いたのですが,今回はもっと簡単に,sbtのマネージ依存性を使った開発手法を紹介します.
続きを読むGoogleのTPU論文で界隈が賑わっていますが,いくつか目をひくポイントの一つが256×256のシストリックアレイな行列演算器ではないでしょうか.
というわけで(?)シストリックアレイな行列演算器をSynthesijer.Scalaで書いてみました.
ソースコードは mkSystolicMatrixMultiplicationUnit.scala です.
続きを読むジグソーモデルは中野先生が提案された,ジグソーパズルを利用したメタモルフィズムの計算機構,です.
計算の途中の状態をジグソーパズルのピースに見立て,入力と時々の状態に対してうまく当てはまるようにピースを並べていけば計算が終わるという楽しい計算機構です.データの与えられ方によっては並列に計算できたり,入力が中途半端に与えられた状態でもできる部分から計算できたり,という特徴があります.
2013年のプログラミングシンポジウムで話を聞いたときに,HDLで書いてハードウェア化してみるのもいいかなーと思いながらも,なんとなく2016年の今日までそのままに…
とりあえずは最初の例題くらいは実装しておこうと,ふと試してみました.
続きを読むactivator(sbt)を使ったシンプルなSynthesijer.Scalaの始め方について紹介します.EclipseでScalaプラグインを使って開発する場合には,Synthesijer.Scalaを使ってみる(Eclipse編)も参照してください.
SynthesijerはJavaプログラム”を”同様な振る舞いをするVHDL/Verilog HDLに変換しますが,Synthesijer.ScalaはScala”で”RTLモジュール(最終的にはVHDLあるいはVerilog HDLで出力)を組み立てるツールです.クロックレベルでの制御,同時並行処理を記述できます.
※ 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はScalaでRTL設計をするためのDSLです.Scalaの言語機能を使った柔軟なRTL設計を目指しています.
このエントリでは,Eclipse+Scala IDEを使ったSynthesijer.Scalaの利用方法として,環境設定からLチカまでを紹介します.
続きを読む開発プロジェクトをGitHubに移行しました.
ガードっぽい形式でも記述できるようにしてみました.
s5 | nickel -> s10 | dime -> s15
(s10 | nickel -> s15
| dime -> s_ok)
こんな感じ.複数行にまたがるときに()をつけなければいけないのが格好悪いなあ.