give LCG an inc signal and add object constructors
This commit is contained in:
parent
b013925ab0
commit
959630630a
@ -208,7 +208,7 @@ class TraceGenerator(id: Int)
|
||||
|
||||
// A random index into the address bag.
|
||||
|
||||
val randAddrBagIndex = Module(new LCG(logAddressBagLen)).io.out
|
||||
val randAddrBagIndex = LCG(logAddressBagLen)
|
||||
|
||||
// A random address from the address bag.
|
||||
|
||||
@ -227,7 +227,7 @@ class TraceGenerator(id: Int)
|
||||
else {
|
||||
// A random index into the extra addresses.
|
||||
|
||||
val randExtraAddrIndex = Module(new LCG(logNumExtraAddrs)).io.out
|
||||
val randExtraAddrIndex = LCG(logNumExtraAddrs)
|
||||
|
||||
// A random address from the extra addresses.
|
||||
|
||||
@ -299,7 +299,7 @@ class TraceGenerator(id: Int)
|
||||
val delayTimer = Module(new DynamicTimer(16))
|
||||
|
||||
// Used to generate a random delay period
|
||||
val randDelayBase = Module(new LCG16()).io.out
|
||||
val randDelayBase = LCG16()
|
||||
|
||||
// Random delay period: usually small, occasionally big
|
||||
val randDelay = Frequency(List(
|
||||
|
@ -71,11 +71,9 @@ class DynamicTimer(w: Int) extends Module {
|
||||
when (io.start) {
|
||||
countdown := io.period
|
||||
active := Bool(true)
|
||||
}
|
||||
.elsewhen (io.stop) {
|
||||
} .elsewhen (io.stop || countdown === UInt(0)) {
|
||||
active := Bool(false)
|
||||
}
|
||||
.elsewhen (active) {
|
||||
} .elsewhen (active) {
|
||||
countdown := countdown - UInt(1)
|
||||
}
|
||||
|
||||
@ -95,9 +93,12 @@ class DynamicTimer(w: Int) extends Module {
|
||||
class LCG16 extends Module {
|
||||
val io = new Bundle {
|
||||
val out = UInt(OUTPUT, 16)
|
||||
val inc = Bool(INPUT)
|
||||
}
|
||||
val state = Reg(UInt(width = 32))
|
||||
when (io.inc) {
|
||||
state := state * UInt(1103515245, 32) + UInt(12345, 32)
|
||||
}
|
||||
io.out := state(30, 15)
|
||||
}
|
||||
|
||||
@ -108,15 +109,31 @@ class LCG16 extends Module {
|
||||
// An n-bit psuedo-random generator made from many instances of a
|
||||
// 16-bit LCG. Parameter 'width' must be larger than 0.
|
||||
|
||||
class LCG(val w : Int) extends Module {
|
||||
class LCG(val w: Int) extends Module {
|
||||
val io = new Bundle {
|
||||
val out = UInt(OUTPUT, w)
|
||||
val inc = Bool(INPUT)
|
||||
}
|
||||
require(w > 0)
|
||||
val numLCG16s : Int = (w+15)/16
|
||||
val outs = List.fill(numLCG16s)(Module(new LCG16()).io.out)
|
||||
io.out := Cat( outs(0)((w%16)-1, 0)
|
||||
, outs.drop(1) : _*)
|
||||
val outs = Seq.fill(numLCG16s) { LCG16(io.inc) }
|
||||
io.out := Cat(outs)
|
||||
}
|
||||
|
||||
object LCG16 {
|
||||
def apply(inc: Bool = Bool(true)): UInt = {
|
||||
val lcg = Module(new LCG16)
|
||||
lcg.io.inc := inc
|
||||
lcg.io.out
|
||||
}
|
||||
}
|
||||
|
||||
object LCG {
|
||||
def apply(w: Int, inc: Bool = Bool(true)): UInt = {
|
||||
val lcg = Module(new LCG(w))
|
||||
lcg.io.inc := inc
|
||||
lcg.io.out
|
||||
}
|
||||
}
|
||||
|
||||
// ======================
|
||||
@ -145,7 +162,7 @@ object Frequency {
|
||||
result := UInt(0)
|
||||
|
||||
// Random value
|
||||
val randVal = Module(new LCG(log2Up(total))).io.out
|
||||
val randVal = LCG(log2Up(total))
|
||||
|
||||
// Pick return value
|
||||
var count = firstFreq
|
||||
|
Loading…
Reference in New Issue
Block a user