ひまわり

はやく人間になりたい

ChiselでQuartusのRAM推論に引っかかる方法

自分の手元にあるDE0-Nano-SoCなどに乗っているCyclon V FPGAなどには
Logic Elementsとは別にメモリ用のブロックが内蔵されていて、Logic Elementの一部をメモリとして使うよりは
効率が良いのでできるだけ使っていきたい。

そしてQuartusはverilogのコードからメモリっぽいところを見つけ出して勝手に割り当ててくれる(手動で割り当てる方法もある)。

しかし、Chiselに組み込まれているMemをそのまま使いVerilogを生成すると
認識してくれないのでひと手間が必要になる。 そのひと手間が以下のコード。

gist06d941328baad1c607a87b46b03f4029

なにをしているのかというと、Memからの読み込みの際にRegisterを経由するのと、

when(Bool(true) {
...
}

ところで、なにも考えないとこれは意味ないのではとなるが。
この行により、同期回路として扱うことができ、そしてそうすることでRamやRomであろうと認識されて、割当がされる。

summaryは以下の通り

gist11d71c8654562e3ec3be044b93b85e97
Total Memory bitsが512となっている。

やったぜ。