summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlbert Magyar2020-02-03 13:42:39 -0700
committerGitHub2020-02-03 13:42:39 -0700
commit509895c428f73b1c47e018df33e6cb64834e6e94 (patch)
treee2912c1c7528df820fe9163272397edd7efa1259 /src
parent4f1f638663a7176ac28d95d71c14a37021314c3b (diff)
Add read-under-write parameter to SyncReadMem (#1183)
* Add support for readUnderWrite to SyncReadMem * Add write collision behavior test to MemorySpec * Update constant names
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/chisel3/internal/firrtl/Emitter.scala2
-rw-r--r--src/test/scala/chiselTests/Mem.scala28
2 files changed, 29 insertions, 1 deletions
diff --git a/src/main/scala/chisel3/internal/firrtl/Emitter.scala b/src/main/scala/chisel3/internal/firrtl/Emitter.scala
index 3409ce94..1341b5f6 100644
--- a/src/main/scala/chisel3/internal/firrtl/Emitter.scala
+++ b/src/main/scala/chisel3/internal/firrtl/Emitter.scala
@@ -69,7 +69,7 @@ private class Emitter(circuit: Circuit) {
case e: DefReg => s"reg ${e.name} : ${emitType(e.id)}, ${e.clock.fullName(ctx)}"
case e: DefRegInit => s"reg ${e.name} : ${emitType(e.id)}, ${e.clock.fullName(ctx)} with : (reset => (${e.reset.fullName(ctx)}, ${e.init.fullName(ctx)}))" // scalastyle:ignore line.size.limit
case e: DefMemory => s"cmem ${e.name} : ${emitType(e.t)}[${e.size}]"
- case e: DefSeqMemory => s"smem ${e.name} : ${emitType(e.t)}[${e.size}]"
+ case e: DefSeqMemory => s"smem ${e.name} : ${emitType(e.t)}[${e.size}], ${e.readUnderWrite}"
case e: DefMemPort[_] => s"${e.dir} mport ${e.name} = ${e.source.fullName(ctx)}[${e.index.fullName(ctx)}], ${e.clock.fullName(ctx)}" // scalastyle:ignore line.size.limit
case e: Connect => s"${e.loc.fullName(ctx)} <= ${e.exp.fullName(ctx)}"
case e: BulkConnect => s"${e.loc1.fullName(ctx)} <- ${e.loc2.fullName(ctx)}"
diff --git a/src/test/scala/chiselTests/Mem.scala b/src/test/scala/chiselTests/Mem.scala
index ebdb1483..49085f9b 100644
--- a/src/test/scala/chiselTests/Mem.scala
+++ b/src/test/scala/chiselTests/Mem.scala
@@ -33,6 +33,30 @@ class SyncReadMemTester extends BasicTester {
}
}
+class SyncReadMemWriteCollisionTester extends BasicTester {
+ val (cnt, _) = Counter(true.B, 5)
+
+ // Write-first
+ val m0 = SyncReadMem(2, UInt(2.W), SyncReadMem.WriteFirst)
+ val rd0 = m0.read(cnt)
+ m0.write(cnt, cnt)
+
+ // Read-first
+ val m1 = SyncReadMem(2, UInt(2.W), SyncReadMem.ReadFirst)
+ val rd1 = m1.read(cnt)
+ m1.write(cnt, cnt)
+
+ // Read data from address 0
+ when (cnt === 3.U) {
+ assert(rd0 === 2.U)
+ assert(rd1 === 0.U)
+ }
+
+ when (cnt === 4.U) {
+ stop()
+ }
+}
+
class SyncReadMemWithZeroWidthTester extends BasicTester {
val (cnt, _) = Counter(true.B, 3)
val mem = SyncReadMem(2, UInt(0.W))
@@ -81,6 +105,10 @@ class MemorySpec extends ChiselPropSpec {
assertTesterPasses { new SyncReadMemTester }
}
+ property("SyncReadMem write collision behaviors should work") {
+ assertTesterPasses { new SyncReadMemWriteCollisionTester }
+ }
+
property("SyncReadMem should work with zero width entry") {
assertTesterPasses { new SyncReadMemWithZeroWidthTester }
}