summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chiselFrontend/src/main/scala/chisel3/RawModule.scala14
-rw-r--r--src/test/scala/chiselTests/ResetSpec.scala24
2 files changed, 36 insertions, 2 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/RawModule.scala b/chiselFrontend/src/main/scala/chisel3/RawModule.scala
index ae3b6fe7..407ed931 100644
--- a/chiselFrontend/src/main/scala/chisel3/RawModule.scala
+++ b/chiselFrontend/src/main/scala/chisel3/RawModule.scala
@@ -134,6 +134,14 @@ abstract class RawModule(implicit moduleCompileOptions: CompileOptions)
}
}
+trait RequireAsyncReset extends MultiIOModule {
+ override private[chisel3] def mkReset: AsyncReset = AsyncReset()
+}
+
+trait RequireSyncReset extends MultiIOModule {
+ override private[chisel3] def mkReset: Bool = Bool()
+}
+
/** Abstract base class for Modules, which behave much like Verilog modules.
* These may contain both logic and state which are written in the Module
* body (constructor).
@@ -145,10 +153,12 @@ abstract class MultiIOModule(implicit moduleCompileOptions: CompileOptions)
extends RawModule {
// Implicit clock and reset pins
val clock: Clock = IO(Input(Clock()))
- val reset: Reset = {
+ val reset: Reset = IO(Input(mkReset))
+
+ private[chisel3] def mkReset: Reset = {
// Top module and compatibility mode use Bool for reset
val inferReset = _parent.isDefined && moduleCompileOptions.inferModuleReset
- IO(Input(if (inferReset) Reset() else Bool()))
+ if (inferReset) Reset() else Bool()
}
// Setup ClockAndReset
diff --git a/src/test/scala/chiselTests/ResetSpec.scala b/src/test/scala/chiselTests/ResetSpec.scala
index 2a17d52f..d08be8fa 100644
--- a/src/test/scala/chiselTests/ResetSpec.scala
+++ b/src/test/scala/chiselTests/ResetSpec.scala
@@ -68,4 +68,28 @@ class ResetSpec extends ChiselFlatSpec {
})
async should include ("always @(posedge clk or posedge rst)")
}
+
+ behavior of "Users"
+
+ they should "be able to force implicit reset to be synchronous" in {
+ val fir = generateFirrtl(new MultiIOModule with RequireSyncReset {
+ reset shouldBe a [Bool]
+ })
+ fir should include ("input reset : UInt<1>")
+ }
+
+ they should "be able to force implicit reset to be asynchronous" in {
+ val fir = generateFirrtl(new MultiIOModule with RequireAsyncReset {
+ reset shouldBe an [AsyncReset]
+ })
+ fir should include ("input reset : AsyncReset")
+ }
+
+ "Chisel" should "error if sync and async modules are nested" in {
+ a [ChiselException] shouldBe thrownBy {
+ elaborate(new MultiIOModule with RequireAsyncReset {
+ val mod = Module(new MultiIOModule with RequireSyncReset)
+ })
+ }
+ }
}