From fb6e4b0faf270037914b1f8b19223fdf255f16a5 Mon Sep 17 00:00:00 2001 From: Deborah Soung Date: Tue, 20 Feb 2024 08:34:36 -0800 Subject: [PATCH] Remove extra bit from `SRAMInterface` address width (#3830) (cherry picked from commit 4f1f4a7744f2b9ea217e8c2972c312642755be1b) # Conflicts: # src/test/scala/chiselTests/util/SRAMSpec.scala --- src/main/scala/chisel3/util/SRAM.scala | 2 +- src/test/scala/chiselTests/Mem.scala | 10 ++--- .../scala/chiselTests/util/SRAMSpec.scala | 45 +++++++++++++++++++ 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 src/test/scala/chiselTests/util/SRAMSpec.scala diff --git a/src/main/scala/chisel3/util/SRAM.scala b/src/main/scala/chisel3/util/SRAM.scala index e8e4a291350..4da35e0fb5e 100644 --- a/src/main/scala/chisel3/util/SRAM.scala +++ b/src/main/scala/chisel3/util/SRAM.scala @@ -103,7 +103,7 @@ class SRAMInterface[T <: Data]( s"SRAMInterface_${SRAM.portedness(numReadPorts, numWritePorts, numReadwritePorts)}${if (masked) "_masked" else ""}}_${tpe.typeName}" - val addrWidth = log2Up(memSize + 1) + val addrWidth = log2Up(memSize) val readPorts: Vec[MemoryReadPort[T]] = Vec(numReadPorts, new MemoryReadPort(tpe, addrWidth)) val writePorts: Vec[MemoryWritePort[T]] = Vec(numWritePorts, new MemoryWritePort(tpe, addrWidth, masked)) diff --git a/src/test/scala/chiselTests/Mem.scala b/src/test/scala/chiselTests/Mem.scala index 92014cef621..760d036533e 100644 --- a/src/test/scala/chiselTests/Mem.scala +++ b/src/test/scala/chiselTests/Mem.scala @@ -529,10 +529,10 @@ class SRAMSpec extends ChiselFunSpec { val chirrtl = ChiselStage.emitCHIRRTL(new TestModule(1, 1), args = Array("--full-stacktrace")) chirrtl should include( - "writePorts : { flip address : UInt<6>, flip enable : UInt<1>, flip data : UInt<8>[3], flip mask : UInt<1>[3]}[1]" + "writePorts : { flip address : UInt<5>, flip enable : UInt<1>, flip data : UInt<8>[3], flip mask : UInt<1>[3]}[1]" ) chirrtl should include( - "readwritePorts : { flip address : UInt<6>, flip enable : UInt<1>, flip isWrite : UInt<1>, readData : UInt<8>[3], flip writeData : UInt<8>[3], flip mask : UInt<1>[3]}[1]" + "readwritePorts : { flip address : UInt<5>, flip enable : UInt<1>, flip isWrite : UInt<1>, readData : UInt<8>[3], flip writeData : UInt<8>[3], flip mask : UInt<1>[3]}[1]" ) for (i <- 0 until 3) { @@ -576,13 +576,13 @@ class SRAMSpec extends ChiselFunSpec { val wrIndexSuffix = if (i == 0) "" else s"_$i" chirrtl should include( - s"read mport mem_out_readPorts_${i}_data_MPORT = mem_mem[_mem_out_readPorts_${i}_data_T], readClocks[${i}]" + s"read mport mem_out_readPorts_${i}_data_MPORT = mem_mem[_mem_out_readPorts_${i}_data_WIRE], readClocks[${i}]" ) chirrtl should include( - s"write mport mem_MPORT${wrIndexSuffix} = mem_mem[_mem_T${wrIndexSuffix}], writeClocks[${i}]" + s"write mport mem_MPORT${wrIndexSuffix} = mem_mem[mem.writePorts[${i}].address], writeClocks[${i}]" ) chirrtl should include( - s"rdwr mport mem_out_readwritePorts_${i}_readData_MPORT = mem_mem[_mem_out_readwritePorts_${i}_readData_T], readwriteClocks[${i}]" + s"rdwr mport mem_out_readwritePorts_${i}_readData_MPORT = mem_mem[_mem_out_readwritePorts_${i}_readData_WIRE], readwriteClocks[${i}]" ) } } diff --git a/src/test/scala/chiselTests/util/SRAMSpec.scala b/src/test/scala/chiselTests/util/SRAMSpec.scala new file mode 100644 index 00000000000..79974e1d1ea --- /dev/null +++ b/src/test/scala/chiselTests/util/SRAMSpec.scala @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: Apache-2.0 + +package chiselTests.util + +import chisel3._ +import chisel3.util.SRAM +import chisel3.experimental.{annotate, ChiselAnnotation} +import chiselTests.ChiselFlatSpec +import _root_.circt.stage.ChiselStage.emitCHIRRTL +import firrtl.annotations.{Annotation, ReferenceTarget, SingleTargetAnnotation} + +class SRAMSpec extends ChiselFlatSpec { + case class DummyAnno(target: ReferenceTarget) extends SingleTargetAnnotation[ReferenceTarget] { + override def duplicate(n: ReferenceTarget) = this.copy(target = n) + } + behavior.of("SRAMInterface") + + it should "Provide target information about its instantiating SRAM" in { + + class Top extends Module { + val sram = SRAM( + size = 32, + tpe = UInt(8.W), + numReadPorts = 0, + numWritePorts = 0, + numReadwritePorts = 1 + ) + require(sram.underlying.nonEmpty) + annotate(new ChiselAnnotation { + override def toFirrtl: Annotation = DummyAnno(sram.underlying.get.toTarget) + }) + } + val (chirrtlCircuit, annos) = getFirrtlAndAnnos(new Top) + val chirrtl = chirrtlCircuit.serialize + chirrtl should include("module Top :") + chirrtl should include("smem sram_mem : UInt<8> [32]") + chirrtl should include( + "wire sram : { readPorts : { flip address : UInt<5>, flip enable : UInt<1>, data : UInt<8>}[0], writePorts : { flip address : UInt<5>, flip enable : UInt<1>, flip data : UInt<8>}[0], readwritePorts : { flip address : UInt<5>, flip enable : UInt<1>, flip isWrite : UInt<1>, readData : UInt<8>, flip writeData : UInt<8>}[1]}" + ) + + val dummyAnno = annos.collectFirst { case DummyAnno(t) => (t.toString) } + dummyAnno should be(Some("~Top|Top>sram_mem")) + } + +}