allow Comparator to disable prefetches (for testing BroadcastHub)
This commit is contained in:
		| @@ -11,7 +11,8 @@ case class ComparatorParameters( | ||||
|   targets:    Seq[Long],  | ||||
|   width:      Int, | ||||
|   operations: Int, | ||||
|   atomics:    Boolean) | ||||
|   atomics:    Boolean, | ||||
|   prefetches: Boolean) | ||||
| case object ComparatorKey extends Field[ComparatorParameters] | ||||
|  | ||||
| trait HasComparatorParameters { | ||||
| @@ -22,6 +23,7 @@ trait HasComparatorParameters { | ||||
|   val targetWidth = comparatorParams.width | ||||
|   val nOperations = comparatorParams.operations | ||||
|   val atomics     = comparatorParams.atomics | ||||
|   val prefetches  = comparatorParams.prefetches | ||||
| } | ||||
|  | ||||
| object LFSR64 | ||||
| @@ -113,11 +115,18 @@ class ComparatorSource(implicit val p: Parameters) extends Module | ||||
|   val get         = Get(client_xact_id, addr_block, addr_beat, get_addr_byte, get_operand_size, Bool(false)) | ||||
|   val getBlock    = GetBlock(client_xact_id, addr_block) | ||||
|   val put         = Put(client_xact_id, addr_block, addr_beat, data, wmask) | ||||
|   val putBlock    = PutBlock(client_xact_id, addr_block, UInt(0), data, SInt(-1, tlDataBytes).asUInt) | ||||
|   val putAtomic   = PutAtomic(client_xact_id, addr_block, addr_beat, atomic_addr_byte, atomic_opcode, atomic_operand_size, data) | ||||
|   val putPrefetch = PutPrefetch(client_xact_id, addr_block) | ||||
|   val getPrefetch = GetPrefetch(client_xact_id, addr_block) | ||||
|   val optAtomic = if (atomics) putAtomic else put | ||||
|   val putBlock    = PutBlock(client_xact_id, addr_block, UInt(0), data) | ||||
|   val putAtomic   = if (atomics) | ||||
|     PutAtomic(client_xact_id, addr_block, addr_beat, | ||||
|       atomic_addr_byte, atomic_opcode, atomic_operand_size, data) | ||||
|     else put | ||||
|   val putPrefetch = if (prefetches) | ||||
|     PutPrefetch(client_xact_id, addr_block) | ||||
|     else put | ||||
|   val getPrefetch = if (prefetches) | ||||
|     GetPrefetch(client_xact_id, addr_block) | ||||
|     else get | ||||
|   val a_type_sel  = NoiseMaker(3) | ||||
|  | ||||
|   // We must initially putBlock all of memory to have a consistent starting state | ||||
|   val final_addr_block = addr_block_mask + UInt(1) | ||||
| @@ -128,18 +137,61 @@ class ComparatorSource(implicit val p: Parameters) extends Module | ||||
|     // Override whatever else we were going to do if we are wiping | ||||
|     PutBlock(client_xact_id, wipe_addr_block, UInt(0), data), | ||||
|     // Generate a random a_type | ||||
|     MuxBundle(NoiseMaker(3), get, Array( | ||||
|     MuxBundle(a_type_sel, get, Array( | ||||
|       UInt("b000") -> get, | ||||
|       UInt("b001") -> getBlock, | ||||
|       UInt("b010") -> put, | ||||
|       UInt("b011") -> putBlock, | ||||
|       UInt("b100") -> optAtomic, | ||||
|       UInt("b100") -> putAtomic, | ||||
|       UInt("b101") -> getPrefetch, | ||||
|       UInt("b110") -> putPrefetch))) | ||||
|    | ||||
|   when (!done_wipe && valid) { | ||||
|     wipe_addr_block := wipe_addr_block + UInt(1) | ||||
|   } | ||||
|  | ||||
|   val idx = Reg(init = UInt(0, log2Up(nOperations))) | ||||
|   when (valid && !finished) { | ||||
|     when (!done_wipe) { | ||||
|       printf("[acq %d]: PutBlock(addr_block = %x, data = %x)\n", | ||||
|         idx, wipe_addr_block, data) | ||||
|     } .otherwise { | ||||
|       switch (a_type_sel) { | ||||
|         is (UInt("b000")) { | ||||
|           printf("[acq %d]: Get(addr_block = %x, addr_beat = %x, addr_byte = %x, op_size = %x)\n", | ||||
|             idx, addr_block, addr_beat, get_addr_byte, get_operand_size) | ||||
|         } | ||||
|         is (UInt("b001")) { | ||||
|           printf("[acq %d]: GetBlock(addr_block = %x)\n", idx, addr_block) | ||||
|         } | ||||
|         is (UInt("b010")) { | ||||
|           printf("[acq %d]: Put(addr_block = %x, addr_beat = %x, data = %x, wmask = %x)\n", | ||||
|             idx, addr_block, addr_beat, data, wmask) | ||||
|         } | ||||
|         is (UInt("b011")) { | ||||
|           printf("[acq %d]: PutBlock(addr_block = %x, data = %x)\n", idx, addr_block, data) | ||||
|         } | ||||
|         is (UInt("b100")) { | ||||
|           if (atomics) { | ||||
|             printf("[acq %d]: PutAtomic(addr_block = %x, addr_beat = %x, addr_byte = %x, " + | ||||
|                    "opcode = %x, op_size = %x, data = %x)\n", | ||||
|                    idx, addr_block, addr_beat, atomic_addr_byte, | ||||
|                    atomic_opcode, atomic_operand_size, data) | ||||
|           } else { | ||||
|             printf("[acq %d]: Put(addr_block = %x, addr_beat = %x, data = %x, wmask = %x)\n", | ||||
|               idx, addr_block, addr_beat, data, wmask) | ||||
|           } | ||||
|         } | ||||
|         is (UInt("b101")) { | ||||
|           printf("[acq %d]: GetPrefetch(addr_block = %x)\n", idx, addr_block) | ||||
|         } | ||||
|         is (UInt("b110")) { | ||||
|           printf("[acq %d]: PutPrefetch(addr_block = %x)\n", idx, addr_block) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     idx := idx + UInt(1) | ||||
|   } | ||||
| } | ||||
|  | ||||
| class ComparatorClient(val target: Long)(implicit val p: Parameters) extends Module | ||||
| @@ -226,6 +278,10 @@ class ComparatorClient(val target: Long)(implicit val p: Parameters) extends Mod | ||||
|   } | ||||
|    | ||||
|   io.finished := !buffer.valid && !issued.reduce(_ || _) | ||||
|  | ||||
|   val (idx, acq_done) = Counter( | ||||
|     io.tl.acquire.fire() && io.tl.acquire.bits.first(), nOperations) | ||||
|   debug(idx) | ||||
| } | ||||
|  | ||||
| class ComparatorSink(implicit val p: Parameters) extends Module | ||||
| @@ -245,14 +301,28 @@ class ComparatorSink(implicit val p: Parameters) extends Module | ||||
|   queues.foreach(_.ready := all_valid) | ||||
|    | ||||
|   val base = queues(0).bits | ||||
|   val idx = Reg(init = UInt(0, log2Up(nOperations))) | ||||
|  | ||||
|   def check(g: Grant) = { | ||||
|     when (g.hasData() && base.data =/= g.data) { | ||||
|       printf("%d: %x =/= %x, g_type = %x\n", idx, base.data, g.data, g.g_type) | ||||
|     } | ||||
|  | ||||
|     assert (g.is_builtin_type, "grant not builtin") | ||||
|     assert (base.g_type === g.g_type, "g_type mismatch") | ||||
|     assert (base.addr_beat === g.addr_beat || !g.hasData(), "addr_beat mismatch") | ||||
|     assert (base.data === g.data || !g.hasData(), "data mismatch") | ||||
|   } | ||||
|   when (all_valid) { | ||||
|     queues.map(_.bits).foreach(check) | ||||
|     // Skip the results generated by the block wiping | ||||
|     when (base.hasData()) { | ||||
|       printf("[gnt %d]: g_type = %x, addr_beat = %x, data = %x\n", | ||||
|         idx, base.g_type, base.addr_beat, base.data) | ||||
|     } .otherwise { | ||||
|       printf("[gnt %d]: g_type = %x\n", idx, base.g_type) | ||||
|     } | ||||
|     queues.drop(1).map(_.bits).foreach(check) | ||||
|     idx := idx + UInt(1) | ||||
|   } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user