chiselで色々なデータを扱ってみた話

chiselというscala baseのalt HDLがあります。それなりに速く動く回路を書けるらしいのでそれなりにいいみたいです。テストもscalaで書けて、C++のテストコードを生成したり、verilogの回路をchiselはscalaのSDLですが、scalaとは別にchiselのレイヤーで型推論器を持っていたりなかなかしっかりしているみたいです。scalaのインスタンスがchiselの型に対応して、chiselのデータもscalaのインスタンスの内部に格納されているっぽいですがその辺は正直良く理解していないので迂闊なことは書かないでおきます。

ラッチ

chiselにはRegというclassというか型があります。Regはハードウェアで言うところのラッチに相当するものを生成するらしく、クロックのライジングエッヂのタイミングで入力データが書き込まれるっぽいです。テストを含めて書いてみたものはこれです。

メモリ

chiselにはメモリを表わすMemという型があります。シーケンシャルかどうかはパラメタで決められてまあメモリっていう感じです。少なくともテストの上ではラッチと同様にライジングエッヂのタイミングで動作するみたいです。テストを含めて書いてみたものはこれです。

Vec型

ところでchiselにはVec型という配列のようなデータ構造があります。ハードウェア的にはROMなんでしょうか。良くわかりません。実はVecのラッチのReg (Vec)型を作ることもできます。これがなんとMemと大体同じような動作をします。コードはこれです。ちなみにverilogを生成すると結構違う感じになります。verilogは良くわからないのでどっちが速いかは何とも言えないですが、Memの方が綺麗なコードが吐かれました。

二次元配列のようなもの

じゃあMemとVecを組み合わせたりすると二次元配列 (rowとcolを指定するメモリ)の様なものを扱えるかという気がしますが、なぜかこれは上手くいきませんでした。 (これがコード)じゃあReg (Vec (Vec))は動くのかというとこっちは動きました(これがコード)。世の中よくわからないものですが、コードの感じから言ってMemを使って線形なメモリとして扱うのが良さそうです。