Skip to content

Commit

Permalink
Guard register randomization with RANDOMIZE, rather than SYNTHESIS
Browse files Browse the repository at this point in the history
Randomization should be controllable separately.  Verilator, for
example, already does this if it is passed --x-assign unique; doing
it redundantly reduces simulation performance.
  • Loading branch information
Andrew Waterman committed Jul 8, 2016
1 parent c014c30 commit b7de40e
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions src/main/scala/firrtl/Emitter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ 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("`ifdef SYNTHESIS")
assigns += Seq("`ifndef RANDOMIZE")
assigns += Seq("assign ", e, " = ", syn, ";")
assigns += Seq("`else")
assigns += Seq("assign ", e, " = ", garbageCond, " ? ", rand_string(tpe(syn)), " : ", syn, ";")
Expand Down Expand Up @@ -380,12 +380,18 @@ class VerilogEmitter extends Emitter {
initials += Seq(wref(nx,tx)," = ",VRandom(long_BANG(t)),";")
Seq(nx,"[",long_BANG(t) - 1,":0]")
}
def initialize (e:Expression) = initials += Seq(e," = ",rand_string(tpe(e)),";")
def initialize(e: Expression) = {
initials += Seq("`ifdef RANDOMIZE")
initials += Seq(e, " = ", rand_string(tpe(e)), ";")
initials += Seq("`endif")
}
def initialize_mem(s: DefMemory) = {
val index = WRef("initvar", s.dataType, ExpKind(), UNKNOWNGENDER)
val rstring = rand_string(s.dataType)
initials += Seq("`ifdef RANDOMIZE")
initials += Seq("for (initvar = 0; initvar < ", s.depth, "; initvar = initvar+1)")
initials += Seq(tab, WSubAccess(wref(s.name, s.dataType), index, s.dataType, FEMALE), " = ", rstring,";")
initials += Seq("`endif")
}
def instantiate (n:String,m:String,es:Seq[Expression]) = {
instdeclares += Seq(m," ",n," (")
Expand Down Expand Up @@ -622,7 +628,7 @@ class VerilogEmitter extends Emitter {
for (x <- assigns) emit(Seq(tab,x))
}
if (not_empty(initials)) {
emit(Seq("`ifndef SYNTHESIS"))
emit(Seq("`ifdef RANDOMIZE"))
emit(Seq(" integer initvar;"))
emit(Seq(" initial begin"))
// This enables test benches to set the random values at time 0.001,
Expand Down

0 comments on commit b7de40e

Please sign in to comment.