summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormergify[bot]2022-06-08 20:09:45 +0000
committerGitHub2022-06-08 20:09:45 +0000
commita689c7c0dd336fe0b9db6171786993b190a700f8 (patch)
treeb914bcb25c7d1809a79aad804386cb10b2b1fa23
parent9c79051866743ba5b8f922fc309abc1302ba5547 (diff)
Added migration for inferModuleReset (#2571) (#2573)
Co-authored-by: Jack Koenig <koenig@sifive.com> (cherry picked from commit 3c6c044b6bdee850ad9ba375324abaf3813c557d) Co-authored-by: Adam Izraelevitz <adam.izraelevitz@sifive.com>
-rw-r--r--core/src/main/scala/chisel3/CompileOptions.scala3
-rw-r--r--core/src/main/scala/chisel3/Module.scala9
-rw-r--r--src/test/scala/chiselTests/MigrateCompileOptionsSpec.scala43
3 files changed, 55 insertions, 0 deletions
diff --git a/core/src/main/scala/chisel3/CompileOptions.scala b/core/src/main/scala/chisel3/CompileOptions.scala
index db773d6e..2764b652 100644
--- a/core/src/main/scala/chisel3/CompileOptions.scala
+++ b/core/src/main/scala/chisel3/CompileOptions.scala
@@ -22,6 +22,9 @@ trait CompileOptions {
val explicitInvalidate: Boolean
// Should the reset type of Module be a Bool or a Reset
val inferModuleReset: Boolean
+
+ /** If marked true, then any Module which consumes `inferModuleReset=false` must also mix in [[RequireSyncReset]] */
+ def migrateInferModuleReset: Boolean = false
}
object CompileOptions {
diff --git a/core/src/main/scala/chisel3/Module.scala b/core/src/main/scala/chisel3/Module.scala
index 3382cd1b..08286ed5 100644
--- a/core/src/main/scala/chisel3/Module.scala
+++ b/core/src/main/scala/chisel3/Module.scala
@@ -141,6 +141,15 @@ abstract class Module(implicit moduleCompileOptions: CompileOptions) extends Raw
// Top module and compatibility mode use Bool for reset
// Note that a Definition elaboration will lack a parent, but still not be a Top module
val inferReset = (_parent.isDefined || Builder.inDefinition) && moduleCompileOptions.inferModuleReset
+ if (moduleCompileOptions.migrateInferModuleReset && !moduleCompileOptions.inferModuleReset) {
+ this match {
+ case _: RequireSyncReset => // Good! It's been migrated.
+ case _ => // Bad! It hasn't been migrated.
+ Builder.error(
+ s"$desiredName is not inferring its module reset, but has not been marked `RequireSyncReset`. Please extend this trait."
+ )
+ }
+ }
if (inferReset) Reset() else Bool()
}
diff --git a/src/test/scala/chiselTests/MigrateCompileOptionsSpec.scala b/src/test/scala/chiselTests/MigrateCompileOptionsSpec.scala
new file mode 100644
index 00000000..3757c360
--- /dev/null
+++ b/src/test/scala/chiselTests/MigrateCompileOptionsSpec.scala
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package chiselTests
+
+import chisel3.stage.ChiselStage
+
+import org.scalatestplus.scalacheck.ScalaCheckDrivenPropertyChecks
+
+class MigrateCompileOptionsSpec extends ChiselFlatSpec with ScalaCheckDrivenPropertyChecks with Utils {
+ import Chisel.{defaultCompileOptions => _, _}
+ import chisel3.RequireSyncReset
+
+ behavior.of("Migrating infer resets")
+
+ val migrateIR = new chisel3.CompileOptions {
+ val connectFieldsMustMatch = false
+ val declaredTypeMustBeUnbound = false
+ val dontTryConnectionsSwapped = false
+ val dontAssumeDirectionality = false
+ val checkSynthesizable = false
+ val explicitInvalidate = false
+ val inferModuleReset = false
+
+ override val migrateInferModuleReset = true
+ }
+
+ it should "error if migrating, but not extended RequireSyncReset" in {
+ implicit val options = migrateIR
+ class Foo extends Module {
+ val io = new Bundle {}
+ }
+ intercept[Exception] {
+ ChiselStage.elaborate(new Foo)
+ }
+ }
+ it should "not error if migrating, and you mix with RequireSyncReset" in {
+ implicit val options = migrateIR
+ class Foo extends Module with RequireSyncReset {
+ val io = new Bundle {}
+ }
+ ChiselStage.elaborate(new Foo)
+ }
+}