Chiselの勉強を本格的にやっているのだが、教材として良いものを見つけた。Chisel-Bootcampというものだ。
Chiselの基礎から、チュートリアル風に、サンプルを交えながら、途中でExerciseも出てくるのでそれをこなしながら進めていく。
本来はJupyter Notebook上でやるものらしいが、手元にJupyterの環境を作るのが面倒だし、どうせならLinux上で実行できる環境が欲しかったのでCUI上で実行できるリポジトリを作ってそちらで試している。
一応Chapter-1とChapter-2は適当に流してみた。Exerciseもやってみたが分からないものは模範解答を調べてしまったし、最適化も不十分なのであまり優良なコードではないかもしれない。 とはいえ、Chiselをフル活用して回路をデザインするためにはどうしたらよいのかしっかり解説してあるので、おすすめだ。
結構参考になっているのは、ScalaのMap関数やReduce関数を使ってうまく回路を組み上げていくこと。 この辺はソフトウェアの力を利用することで、かなり綺麗な記述でまとめ上げることができる。
例えば、FIRフィルタを設計する場合、
out = reg[0] * c[0] + reg[1] * c[1] + reg[2] * c[2] + reg[3] * c[3] reg = {reg[2:0], in[0]}
という回路を作らなければならない。さらにFIRフィルタの長さが変わる要件も必要になる。この辺をChiselで書けば、
val taps = RegInit(Vec(Seq.fill(length)(0.U(8.W)))) for (i <- 0 until length) { if (i == 0) taps(0) := io.in else taps(i) := taps(i-1) } io.out := (taps zip io.consts).map { case (a, b) => a * b }.reduce(_ + _)
となる(tapsの部分はまだ最適化不十分でまだ簡略化できる)。これだけだとChiselの方が長いしイマイチだが、Verilogでは不可能な型に対してGenericな書き方も可能だ。 例えばInt型に対するFIRと、FixedPointに対するFIRを同じデザインで設計できる。 その辺を使いこなしてやっと、Chiselマスターと言えるだろう、という気がしてきた。
ちゃんとまとめたいな、と思ったらすでにChisel-Bootcampを進めている方がいらっしゃった。 こちらの方が私の適当な文章よりも何倍もしっかり解説してあり、ありがたい。