give LCG an inc signal and add object constructors
This commit is contained in:
		| @@ -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)) | ||||
|   state := state * UInt(1103515245, 32) + UInt(12345, 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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user