Scalaの埋め込みDSL(emmbeded DSL;eDSL)でHDLを設計するChisel https://chisel.eecs.berkeley.edu/ について。

VHDLは冗長だ。色々と面倒くさい決まりごとがたくさんある。 特に困惑するのは、Nビット加算器の記述のような「パラメータ化された回路」を設計する時だった。 VHDLはAdaをベースにしているだけあり、非常に豊富な機能があり、 パラメータ化された回路を記述することなどわけない。 え、Adaって何?という困惑を除けばだ。

それを解決する方法として高位合成という技術がある。 これはC言語などのふつーのプログラミング言語のコードから、回路として実装可能なHDLを生成する技術だ。 これはこれで、我々の目的であった「パラメータ化された浮動小数点演算回路」を実現するには、 ハードルが高かった。そもそも、高位合成ツールはHDLでの実装を細かい粒度でコントロールしたいという、 我々の目的にはあまり向いてないような気がする。実際には、真面目に使うことを検討したことがない。 そこで、2006年頃、パラメータ化されたVHDL生成する手法として、 埋め込みRuby(eRuby)によるメタプログラミングを採用した。 その詳細は説明を省略し、その例だけを直接に示す:http://galaxy.u-aizu.ac.jp/note/wiki/UnconventionalHDLProgramming

要は、VHDLをべたに手書きするのは大変につらい(EmacsのVHDL modeは挙動がおかしいし)。 Verilog HDLなら無駄に冗長なところは取り除かれていると思うが、 それでも「パラメータ化」をするのは大変そうである。 これも真面目に使うことを検討したことがない。 なぜなら、Chisel があるから。論文スライドを見てみると、 eRubyを使った我々の方法よりエレガントで、 なによりHDLシミュレータを使わずに回路記述のシミュレーションできるという点が素晴らしい。 テストベンチもこのeDSLで書くことができる。 eDSLで記述することの利点は、少ないハードウエア記述で回路を生成できるということである。 上の論文によると、3020行のVerilog HDLコードと同等のものを記述するのにこのeDSLでは1046行ですんだという。 そして、eDSLからはVerlog HDLが生成されるだけではなく、シミュレーションのためのC++コードが生成される。 この実行速度は商用シミュレータより7倍以上高速(約5400秒 vs. 約580秒)だという。 なお、FPGAによる同じ回路のエミュレーションは約80秒であったそうだ。 一方、コンパイル時間は、シミュレータ, Chisel, FPGAの順に、約20秒, 約120秒, 約3700秒である。 綺麗なトレードオフ関係。とはいえ、FPGAでのエミュレーションは面倒が多いので、実用的かどうかは疑問が残る。

Chiselの導入方法についてはそのWebサイトに説明があるのだが、いまいちはっきりとはしない。 チュートリアルとGetting Start Guideとマニュアルと。試行錯誤した結果をメモしておく。

Ubuntu 14.04LTSの場合

Chiselを利用するのに明示的にインストールが必要なものはJRE, JDK, sbt(Scala用のbuildシステムの一種。RubyのRakeみたいなもの)。 シミュレータを使う場合にはg++も必要。

Ubuntuの場合JREとJDKはシステムのパッケージをインストールすればよい。

1
sudo aptitude install openjdk-7-jre

sbtは、sbtのサイトからDebian用のパッケージをDLして、dpkgでインストールした

1
2
wget https://dl.bintray.com/sbt/debian/sbt-0.13.6.deb
sudo dpkg -i sbt-0.13.6.deb

これで準備が整う。ScalaやChiselは明示的にインストールする必要はなく、 chisel-tutorialをレポジトリをcloneし、その中のサンプル用ディレクトリでmakeすると、 sbtが必要なもののインストールなどは面倒見てくれる。

1
2
3
git clone https://github.com/ucb-bar/chisel-tutorial.git
cd chisel-tutiroial/hello
make

以上で、”hello”というサンプルが実行できるだろう。 ただし、Ubuntu 14.04の場合、”/bin/sh”が”/bin/dash”へシンボリックリンクになっており、 makeコマンドが失敗をする。これはMakefileがshellとしてbashを想定しているためで、 おそらく実害はないはずだが、”/bin/sh”を”/bin/bash”へのシンボリックリンクにする必要があった。 dashや古いzshが受け付けないコマンドオプションを使っているため。

MacOSの場合

JREとJDKはシステムのものでOK。g++もXcodeのコマンドラインツールをインストールすればいい。 sbtはMac用のuniversal package(zip)をDLして展開し、 “bin/sbt”, “bin/sbt-launch-bash”, “bin/sbt-launch.jar”をpathの通ったところに置けばよい。 詳しくはここを参照する:http://www.scala-sbt.org/0.13/tutorial/ja/Manual-Installation.html

あとはUbuntuと同じ。ただし、shellの調整は必要ない。

1
2
3
git clone https://github.com/ucb-bar/chisel-tutorial.git
cd chisel-tutiroial/hello
make

自分用のプロジェクトを作る

sbtを直接利用する場合にはこの限りではないが、tutorialと同じ方法でChiselを使うには、以下の2つのファイルが必要。 tutorialのファイルをベースに編集修正したもの。

build.sbt: https://gist.github.com/dadeba/97e5b03a49e0133bed59

Makefile: https://gist.github.com/dadeba/45631a382c6fb12a2a64

makeコマンドで”*.scala”に記述された回路がコンパイルされ、シミュレーションが実行される。