開発日記

Erlangをダラダラ書きます。

Chisel FPGA メモリ

Memクラス

val mem = Mem(2048, UInt(8.W))
  • 同期書き込み,非同期読み出しを持つメモリ生成

  • FPGAでは直接利用できない

  • フリップフロップから構築される(分散RAM??)

SyncReadMemクラス

val mem = SyncReadMem(2048, UInt(8.W))
  • 同期書き込み,同期読み出しを持つメモリ生成

  • おそらくBRAMを使用する

  • FPGAは通常同期メモリをサポートしている.同期メモリはアドレスを入力してから,1クロック後に読み出しデータを利用できる.

  • 同じクロックサイクルで新しい値が読み出されたのと同じアドレスに書き込まれた場合,Chiselは読み出しデータは未定義(FPGAに依存)

  • 新しく書き込んだ値を読み出したい場合は,アドレスが等しいことを条件に書き込みデータを送信する「フォワード回路(転送回路)」を構築すれば良い.

val forwardReg = RegNext(wrAddr === rdAddr && wen) // true or false

rdData := Mux(forwardReg, ..., ...)

Regクラス

  • メモリをレジスタの集まりとして構築

  • ハードウェア資源をたくさん使うので非推奨 -> SRAMで構築したい