allow Comparator to disable prefetches (for testing BroadcastHub)
This commit is contained in:
parent
a43a93b55c
commit
181b11bf20
@ -11,7 +11,8 @@ case class ComparatorParameters(
|
|||||||
targets: Seq[Long],
|
targets: Seq[Long],
|
||||||
width: Int,
|
width: Int,
|
||||||
operations: Int,
|
operations: Int,
|
||||||
atomics: Boolean)
|
atomics: Boolean,
|
||||||
|
prefetches: Boolean)
|
||||||
case object ComparatorKey extends Field[ComparatorParameters]
|
case object ComparatorKey extends Field[ComparatorParameters]
|
||||||
|
|
||||||
trait HasComparatorParameters {
|
trait HasComparatorParameters {
|
||||||
@ -22,6 +23,7 @@ trait HasComparatorParameters {
|
|||||||
val targetWidth = comparatorParams.width
|
val targetWidth = comparatorParams.width
|
||||||
val nOperations = comparatorParams.operations
|
val nOperations = comparatorParams.operations
|
||||||
val atomics = comparatorParams.atomics
|
val atomics = comparatorParams.atomics
|
||||||
|
val prefetches = comparatorParams.prefetches
|
||||||
}
|
}
|
||||||
|
|
||||||
object LFSR64
|
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 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 getBlock = GetBlock(client_xact_id, addr_block)
|
||||||
val put = Put(client_xact_id, addr_block, addr_beat, data, wmask)
|
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 putBlock = PutBlock(client_xact_id, addr_block, UInt(0), data)
|
||||||
val putAtomic = PutAtomic(client_xact_id, addr_block, addr_beat, atomic_addr_byte, atomic_opcode, atomic_operand_size, data)
|
val putAtomic = if (atomics)
|
||||||
val putPrefetch = PutPrefetch(client_xact_id, addr_block)
|
PutAtomic(client_xact_id, addr_block, addr_beat,
|
||||||
val getPrefetch = GetPrefetch(client_xact_id, addr_block)
|
atomic_addr_byte, atomic_opcode, atomic_operand_size, data)
|
||||||
val optAtomic = if (atomics) putAtomic else put
|
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
|
// We must initially putBlock all of memory to have a consistent starting state
|
||||||
val final_addr_block = addr_block_mask + UInt(1)
|
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
|
// Override whatever else we were going to do if we are wiping
|
||||||
PutBlock(client_xact_id, wipe_addr_block, UInt(0), data),
|
PutBlock(client_xact_id, wipe_addr_block, UInt(0), data),
|
||||||
// Generate a random a_type
|
// Generate a random a_type
|
||||||
MuxBundle(NoiseMaker(3), get, Array(
|
MuxBundle(a_type_sel, get, Array(
|
||||||
UInt("b000") -> get,
|
UInt("b000") -> get,
|
||||||
UInt("b001") -> getBlock,
|
UInt("b001") -> getBlock,
|
||||||
UInt("b010") -> put,
|
UInt("b010") -> put,
|
||||||
UInt("b011") -> putBlock,
|
UInt("b011") -> putBlock,
|
||||||
UInt("b100") -> optAtomic,
|
UInt("b100") -> putAtomic,
|
||||||
UInt("b101") -> getPrefetch,
|
UInt("b101") -> getPrefetch,
|
||||||
UInt("b110") -> putPrefetch)))
|
UInt("b110") -> putPrefetch)))
|
||||||
|
|
||||||
when (!done_wipe && valid) {
|
when (!done_wipe && valid) {
|
||||||
wipe_addr_block := wipe_addr_block + UInt(1)
|
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
|
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(_ || _)
|
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
|
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)
|
queues.foreach(_.ready := all_valid)
|
||||||
|
|
||||||
val base = queues(0).bits
|
val base = queues(0).bits
|
||||||
|
val idx = Reg(init = UInt(0, log2Up(nOperations)))
|
||||||
|
|
||||||
def check(g: Grant) = {
|
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 (g.is_builtin_type, "grant not builtin")
|
||||||
assert (base.g_type === g.g_type, "g_type mismatch")
|
assert (base.g_type === g.g_type, "g_type mismatch")
|
||||||
assert (base.addr_beat === g.addr_beat || !g.hasData(), "addr_beat mismatch")
|
assert (base.addr_beat === g.addr_beat || !g.hasData(), "addr_beat mismatch")
|
||||||
assert (base.data === g.data || !g.hasData(), "data mismatch")
|
assert (base.data === g.data || !g.hasData(), "data mismatch")
|
||||||
}
|
}
|
||||||
when (all_valid) {
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user