Chiselで2 portメモリの作り方

先日、Chiselで2 portメモリを作ることが必要になりました。 しかし、どうやって作れば良いかわからなかったので、調べてみると以下公式サイトに記載ありました。 備忘のために記載します。

単純に二つのポートを書けばよかったんですね。

val aMemory = Mem(128, UInt(32.W)) 
val raddr1 = io.raddr
val raddr2 = io.raddr + 4.U
val re = io.readEnable
val read_port1 = UInt(32.W)
val read_port2 = UInt(32.W)
when (re) {
  read_port1 := aMemory(raddr1)
  read_port2 := aMemory(raddr2)
}

さらに、↑のサイトを調べていくと個人的にびっくりすることがわかりました。 なんと、MemはFFに変換されるようです笑 例えば32bit 64K深さの2port メモリは以下のような感じでした。

  reg [31:0] my_mem [0:65535];
  assign my_mem__T_2_data = my_mem[my_mem__T_2_addr]; // @[Memory.scala 74:19]
  assign my_mem__T_3_addr = io_addr2;
  assign my_mem__T_3_data = my_mem[my_mem__T_3_addr]; // @[Memory.scala 74:19]

FPGAの実装がそのまま出てくるわけもないので、当たり前ではある気もし、 むしろ、合成可能なものに変えてくれ感謝すべきではあります。 2port非同期ReadなのでむしろFFでないと達成できない気もします。

ただ、FPGAに載せる時に、それなりに実装面積食いそうだなと思ったという話です。 対策としては、Wrapperと考えて、丸ごと置き換えをするのがベターなのかなと思いました。