aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/firrtlTests/AsyncResetSpec.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/firrtlTests/AsyncResetSpec.scala')
-rw-r--r--src/test/scala/firrtlTests/AsyncResetSpec.scala137
1 files changed, 135 insertions, 2 deletions
diff --git a/src/test/scala/firrtlTests/AsyncResetSpec.scala b/src/test/scala/firrtlTests/AsyncResetSpec.scala
index c1078a03..6fcb647a 100644
--- a/src/test/scala/firrtlTests/AsyncResetSpec.scala
+++ b/src/test/scala/firrtlTests/AsyncResetSpec.scala
@@ -3,7 +3,6 @@
package firrtlTests
import firrtl._
-import firrtl.ir._
import FirrtlCheckers._
class AsyncResetSpec extends FirrtlFlatSpec {
@@ -30,6 +29,25 @@ class AsyncResetSpec extends FirrtlFlatSpec {
result should containLine ("always @(posedge clock or posedge reset) begin")
}
+ it should "work in nested and flipped aggregates with regular and partial connect" in {
+ val result = compileBody(s"""
+ |output fizz : { flip foo : { a : AsyncReset, flip b: AsyncReset }[2], bar : { a : AsyncReset, flip b: AsyncReset }[2] }
+ |output buzz : { flip foo : { a : AsyncReset, flip b: AsyncReset }[2], bar : { a : AsyncReset, flip b: AsyncReset }[2] }
+ |fizz.bar <= fizz.foo
+ |buzz.bar <- buzz.foo
+ |""".stripMargin
+ )
+
+ result should containLine ("assign fizz_foo_0_b = fizz_bar_0_b;")
+ result should containLine ("assign fizz_foo_1_b = fizz_bar_1_b;")
+ result should containLine ("assign fizz_bar_0_a = fizz_foo_0_a;")
+ result should containLine ("assign fizz_bar_1_a = fizz_foo_1_a;")
+ result should containLine ("assign buzz_foo_0_b = buzz_bar_0_b;")
+ result should containLine ("assign buzz_foo_1_b = buzz_bar_1_b;")
+ result should containLine ("assign buzz_bar_0_a = buzz_foo_0_a;")
+ result should containLine ("assign buzz_bar_1_a = buzz_foo_1_a;")
+ }
+
it should "support casting to other types" in {
val result = compileBody(s"""
|input a : AsyncReset
@@ -77,7 +95,7 @@ class AsyncResetSpec extends FirrtlFlatSpec {
}
"Non-literals" should "NOT be allowed as reset values for AsyncReset" in {
- an [passes.CheckHighForm.NonLiteralAsyncResetValueException] shouldBe thrownBy {
+ an [checks.CheckResets.NonLiteralAsyncResetValueException] shouldBe thrownBy {
compileBody(s"""
|input clock : Clock
|input reset : AsyncReset
@@ -91,6 +109,121 @@ class AsyncResetSpec extends FirrtlFlatSpec {
}
}
+ "Late non-literals connections" should "NOT be allowed as reset values for AsyncReset" in {
+ an [checks.CheckResets.NonLiteralAsyncResetValueException] shouldBe thrownBy {
+ compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<8>
+ |input y : UInt<8>
+ |output z : UInt<8>
+ |wire a : UInt<8>
+ |reg r : UInt<8>, clock with : (reset => (reset, a))
+ |a <= y
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ }
+ }
+
+ "Hidden Non-literals" should "NOT be allowed as reset values for AsyncReset" in {
+ an [checks.CheckResets.NonLiteralAsyncResetValueException] shouldBe thrownBy {
+ compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<1>[4]
+ |input y : UInt<1>
+ |output z : UInt<1>[4]
+ |wire literal : UInt<1>[4]
+ |literal[0] <= UInt<1>("h00")
+ |literal[1] <= y
+ |literal[2] <= UInt<1>("h00")
+ |literal[3] <= UInt<1>("h00")
+ |reg r : UInt<1>[4], clock with : (reset => (reset, literal))
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ }
+ }
+ "Wire connected to non-literal" should "NOT be allowed as reset values for AsyncReset" in {
+ an [checks.CheckResets.NonLiteralAsyncResetValueException] shouldBe thrownBy {
+ compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<1>
+ |input y : UInt<1>
+ |input cond : UInt<1>
+ |output z : UInt<1>
+ |wire w : UInt<1>
+ |w <= UInt(1)
+ |when cond :
+ | w <= y
+ |reg r : UInt<1>, clock with : (reset => (reset, w))
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ }
+ }
+
+ "Complex literals" should "be allowed as reset values for AsyncReset" in {
+ val result = compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<1>[4]
+ |output z : UInt<1>[4]
+ |wire literal : UInt<1>[4]
+ |literal[0] <= UInt<1>("h00")
+ |literal[1] <= UInt<1>("h00")
+ |literal[2] <= UInt<1>("h00")
+ |literal[3] <= UInt<1>("h00")
+ |reg r : UInt<1>[4], clock with : (reset => (reset, literal))
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ result should containLine ("always @(posedge clock or posedge reset) begin")
+ }
+
+ "Complex literals of complex literals" should "be allowed as reset values for AsyncReset" in {
+ val result = compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<1>[4]
+ |output z : UInt<1>[4]
+ |wire literal : UInt<1>[2]
+ |literal[0] <= UInt<1>("h01")
+ |literal[1] <= UInt<1>("h01")
+ |wire complex_literal : UInt<1>[4]
+ |complex_literal[0] <= literal[0]
+ |complex_literal[1] <= literal[1]
+ |complex_literal[2] <= UInt<1>("h00")
+ |complex_literal[3] <= UInt<1>("h00")
+ |reg r : UInt<1>[4], clock with : (reset => (reset, complex_literal))
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ result should containLine ("always @(posedge clock or posedge reset) begin")
+ }
+ "Literals of bundle literals" should "be allowed as reset values for AsyncReset" in {
+ val result = compileBody(s"""
+ |input clock : Clock
+ |input reset : AsyncReset
+ |input x : UInt<1>[4]
+ |output z : UInt<1>[4]
+ |wire bundle : {a: UInt<1>, b: UInt<1>}
+ |bundle.a <= UInt<1>("h01")
+ |bundle.b <= UInt<1>("h01")
+ |wire complex_literal : UInt<1>[4]
+ |complex_literal[0] <= bundle.a
+ |complex_literal[1] <= bundle.b
+ |complex_literal[2] <= UInt<1>("h00")
+ |complex_literal[3] <= UInt<1>("h00")
+ |reg r : UInt<1>[4], clock with : (reset => (reset, complex_literal))
+ |r <= x
+ |z <= r""".stripMargin
+ )
+ result should containLine ("always @(posedge clock or posedge reset) begin")
+ }
+
"Every async reset reg" should "generate its own always block" in {
val result = compileBody(s"""