Skip to content

True Dual-Port RAM

import dfhdl.*

@top class TrueDPR(
    val DATA_WIDTH: Int <> CONST = 8,
    val ADDR_WIDTH: Int <> CONST = 8
) extends EDDesign:
  val ram = Bits(DATA_WIDTH) X (2 ** ADDR_WIDTH) <> VAR.SHARED

  val a, b = new RTDomain:
    val data = Bits(DATA_WIDTH) <> IN
    val addr = Bits(ADDR_WIDTH) <> IN
    val q    = Bits(DATA_WIDTH) <> OUT.REG
    val we   = Bit              <> IN

    if (we)
      ram(addr) := data
    q.din       := ram(addr)
end TrueDPR

////////////////////////////////////////////////////////////////////////////////////////////////
// DFHDL Elaboration Options:                                                                 //
////////////////////////////////////////////////////////////////////////////////////////////////
// Uncomment to set different clock and reset configurations:
// given options.ElaborationOptions.DefaultClkCfg = ClkCfg(ClkCfg.Edge.Rising)
// given options.ElaborationOptions.DefaultRstCfg = RstCfg(RstCfg.Mode.Async, RstCfg.Active.Low)
////////////////////////////////////////////////////////////////////////////////////////////////
// DFHDL Compiler Options:                                                                    //
////////////////////////////////////////////////////////////////////////////////////////////////
// Select backend compiler:
given options.CompilerOptions.Backend = backends.verilog
// Uncomment to enable printing design code after elaboration (before compilation):
// given options.ElaborationOptions.PrintDFHDLCode = true
// Uncomment to enable printing design code after compilation:
// given options.CompilerOptions.PrintDFHDLCode = true
////////////////////////////////////////////////////////////////////////////////////////////////