diff options
| author | Albert Magyar | 2019-08-07 16:33:45 -0700 |
|---|---|---|
| committer | mergify[bot] | 2019-08-07 23:33:45 +0000 |
| commit | c6c509d623e5e64e021fa311018b8ace2f3f8969 (patch) | |
| tree | e1f81ce7cfaf6842f3edbb4778839cc2da3d8fc1 /src | |
| parent | 23a104d3409385718a960427f1576f508e3f473b (diff) | |
Check mems for legal latencies; ban zero write latency. (#1147)
* Check mems for legal latencies; ban zero write latency.
* Trigger
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/passes/Checks.scala | 4 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/CheckSpec.scala | 19 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/passes/Checks.scala b/src/main/scala/firrtl/passes/Checks.scala index 471fe216..4bcfad9c 100644 --- a/src/main/scala/firrtl/passes/Checks.scala +++ b/src/main/scala/firrtl/passes/Checks.scala @@ -27,6 +27,8 @@ trait CheckHighFormLike { s"$info: [module $mname] Memory $name has not been properly lowered from Chirrtl IR.") class MemWithFlipException(info: Info, mname: String, name: String) extends PassException( s"$info: [module $mname] Memory $name cannot be a bundle type with flips.") + class IllegalMemLatencyException(info: Info, mname: String, name: String) extends PassException( + s"$info: [module $mname] Memory $name must have non-negative read latency and positive write latency.") class RegWithFlipException(info: Info, mname: String, name: String) extends PassException( s"$info: [module $mname] Register $name cannot be a bundle type with flips.") class InvalidAccessException(info: Info, mname: String) extends PassException( @@ -191,6 +193,8 @@ trait CheckHighFormLike { if (reset.tpe == AsyncResetType && !init.isInstanceOf[Literal]) errors.append(new NonLiteralAsyncResetValueException(info, mname, name, init.serialize)) case sx: DefMemory => + if (sx.readLatency < 0 || sx.writeLatency <= 0) + errors.append(new IllegalMemLatencyException(info, mname, sx.name)) if (hasFlip(sx.dataType)) errors.append(new MemWithFlipException(info, mname, sx.name)) if (sx.depth <= 0) diff --git a/src/test/scala/firrtlTests/CheckSpec.scala b/src/test/scala/firrtlTests/CheckSpec.scala index 93bc2cab..54dc60ab 100644 --- a/src/test/scala/firrtlTests/CheckSpec.scala +++ b/src/test/scala/firrtlTests/CheckSpec.scala @@ -41,6 +41,25 @@ class CheckSpec extends FlatSpec with Matchers { } } + "Memories with zero write latency" should "throw an exception" in { + val passes = Seq( + ToWorkingIR, + CheckHighForm) + val input = + """circuit Unit : + | module Unit : + | mem m : + | data-type => UInt<32> + | depth => 32 + | read-latency => 0 + | write-latency => 0""".stripMargin + intercept[CheckHighForm.IllegalMemLatencyException] { + passes.foldLeft(Parser.parse(input.split("\n").toIterator)) { + (c: Circuit, p: Pass) => p.run(c) + } + } + } + "Registers with flip in the type" should "throw an exception" in { val input = """circuit Unit : |
