aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Mao2016-08-25 20:06:43 -0700
committerHoward Mao2016-08-25 20:06:48 -0700
commita2af16c1fb1f5166eab34188df9944012da3cbc3 (patch)
treef92b7d24794c56be31bf5d9ab3859537e3debd4a
parente69d44fc944b5d93c852d54911ce7cf61abb6dd1 (diff)
emit wires instead of registers for invalid randomization
Before, the verilog emitter would connect registers to the invalid ports and use random initialization on the generated registers. It is better to generate wires instead and use random assignment on the wires.
-rw-r--r--src/main/scala/firrtl/Emitter.scala16
-rw-r--r--src/test/scala/firrtlTests/CompilerTests.scala5
2 files changed, 16 insertions, 5 deletions
diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/Emitter.scala
index 30c764d8..46e1716c 100644
--- a/src/main/scala/firrtl/Emitter.scala
+++ b/src/main/scala/firrtl/Emitter.scala
@@ -316,12 +316,17 @@ class VerilogEmitter extends Emitter {
assigns += Seq("assign ",e," = ",value,";")
// In simulation, assign garbage under a predicate
def garbageAssign(e: Expression, syn: Expression, garbageCond: Expression) = {
- assigns += Seq("`ifndef RANDOMIZE_ASSIGN")
+ assigns += Seq("`ifndef RANDOMIZE_GARBAGE_ASSIGN")
assigns += Seq("assign ", e, " = ", syn, ";")
assigns += Seq("`else")
assigns += Seq("assign ", e, " = ", garbageCond, " ? ", rand_string(tpe(syn)), " : ", syn, ";")
assigns += Seq("`endif")
}
+ def invalidAssign(e: Expression) = {
+ assigns += Seq("`ifdef RANDOMIZE_INVALID_ASSIGN")
+ assigns += Seq("assign ", e, " = ", rand_string(tpe(e)), ";")
+ assigns += Seq("`endif")
+ }
def update_and_reset(r: Expression, clk: Expression, reset: Expression, init: Expression) = {
// We want to flatten Mux trees for reg updates into if-trees for
// improved QoR for conditional updates. However, unbounded recursion
@@ -474,8 +479,8 @@ class VerilogEmitter extends Emitter {
}
case (s:IsInvalid) => {
val wref = netlist(s.expr).as[WRef].get
- declare("reg",wref.name,tpe(s.expr))
- initialize(wref)
+ declare("wire",wref.name,tpe(s.expr))
+ invalidAssign(wref)
}
case (s:DefNode) => {
declare("wire",s.name,tpe(s.value))
@@ -683,7 +688,10 @@ class VerilogEmitter extends Emitter {
def emit_preamble() {
emit(Seq(
- "`ifdef RANDOMIZE_ASSIGN\n",
+ "`ifdef RANDOMIZE_GARBAGE_ASSIGN\n",
+ "`define RANDOMIZE\n",
+ "`endif\n",
+ "`ifdef RANDOMIZE_INVALID_ASSIGN\n",
"`define RANDOMIZE\n",
"`endif\n",
"`ifdef RANDOMIZE_REG_INIT\n",
diff --git a/src/test/scala/firrtlTests/CompilerTests.scala b/src/test/scala/firrtlTests/CompilerTests.scala
index 5b154327..2eab6e0f 100644
--- a/src/test/scala/firrtlTests/CompilerTests.scala
+++ b/src/test/scala/firrtlTests/CompilerTests.scala
@@ -106,7 +106,10 @@ circuit Top :
b <= a
"""
val check = Seq(
- "`ifdef RANDOMIZE_ASSIGN",
+ "`ifdef RANDOMIZE_GARBAGE_ASSIGN",
+ "`define RANDOMIZE",
+ "`endif",
+ "`ifdef RANDOMIZE_INVALID_ASSIGN",
"`define RANDOMIZE",
"`endif",
"`ifdef RANDOMIZE_REG_INIT",