Add access counter to smem banks

This commit is contained in:
Hansung Kim
2024-06-26 14:27:49 -07:00
parent a66a8c1732
commit 018167480d

View File

@@ -192,6 +192,7 @@ class RadianceCluster (
word_fanout_nodes.transpose word_fanout_nodes.transpose
} }
// (banks, subbanks, gemminis)
val spad_read_nodes = Seq.fill(smem_banks)(dist_and_duplicate(gemminis.map(_.spad_read_nodes), "r")) val spad_read_nodes = Seq.fill(smem_banks)(dist_and_duplicate(gemminis.map(_.spad_read_nodes), "r"))
val spad_write_nodes = Seq.fill(smem_banks)(dist_and_duplicate(gemminis.map(_.spad_write_nodes), "w")) val spad_write_nodes = Seq.fill(smem_banks)(dist_and_duplicate(gemminis.map(_.spad_write_nodes), "w"))
val spad_sp_write_nodes_single_bank = dist_and_duplicate(gemminis.map(_.spad.spad_writer.node), "ws") val spad_sp_write_nodes_single_bank = dist_and_duplicate(gemminis.map(_.spad.spad_writer.node), "ws")
@@ -409,7 +410,6 @@ class RadianceClusterModuleImp(outer: RadianceCluster) extends ClusterModuleImp(
} }
} }
// TODO: remove Pipeline dependency of gemmini // TODO: remove Pipeline dependency of gemmini
def makeSmemBanks(): Unit = { def makeSmemBanks(): Unit = {
def make_buffer[T <: Data](mem: TwoPortSyncMem[T], r_node: TLBundle, r_edge: TLEdgeIn, def make_buffer[T <: Data](mem: TwoPortSyncMem[T], r_node: TLBundle, r_edge: TLEdgeIn,
@@ -479,9 +479,20 @@ class RadianceClusterModuleImp(outer: RadianceCluster) extends ClusterModuleImp(
w_node.d <> Queue(write_resp, 2) w_node.d <> Queue(write_resp, 2)
} }
// read OR write access counter for smem banks
val smem_bank_mgrs_grouped = outer.smem_bank_mgrs.grouped(outer.smem_subbanks)
val numBanks = smem_bank_mgrs_grouped.length
val smemCounterPerBankPerCycle = Seq.fill(numBanks)(Seq.fill(outer.smem_subbanks)
(Wire(UInt(32.W))))
val smemCounterPerCycle = smemCounterPerBankPerCycle.map(_.reduce(_ + _)).reduce(_ + _)
val smemCounter = RegInit(UInt(32.W), 0.U)
smemCounter := smemCounter + smemCounterPerCycle
smemCounterPerBankPerCycle.foreach(_.foreach(dontTouch(_)))
dontTouch(smemCounter)
if (outer.stride_by_word) { if (outer.stride_by_word) {
outer.smem_bank_mgrs.grouped(outer.smem_subbanks).zipWithIndex.foreach { case (bank_mgrs, bid) => outer.smem_bank_mgrs.grouped(outer.smem_subbanks).zipWithIndex.foreach { case (bank_mgrs, bid) =>
assert(bank_mgrs.flatten.size == 2 * outer.smem_subbanks) assert(bank_mgrs.flatten.size == 2/* read and write */ * outer.smem_subbanks)
bank_mgrs.zipWithIndex.foreach { case (Seq(r, w), wid) => bank_mgrs.zipWithIndex.foreach { case (Seq(r, w), wid) =>
assert(!r.portParams.map(_.anySupportPutFull).reduce(_ || _)) assert(!r.portParams.map(_.anySupportPutFull).reduce(_ || _))
assert(!w.portParams.map(_.anySupportGet).reduce(_ || _)) assert(!w.portParams.map(_.anySupportGet).reduce(_ || _))
@@ -512,6 +523,9 @@ class RadianceClusterModuleImp(outer: RadianceCluster) extends ClusterModuleImp(
log2Ceil(word_width).U).asUInt) || !r_node.a.valid, "word id mismatch with request") log2Ceil(word_width).U).asUInt) || !r_node.a.valid, "word id mismatch with request")
make_buffer(mem, r_node, r_edge, w_node, w_edge) make_buffer(mem, r_node, r_edge, w_node, w_edge)
// add access counters to banks
smemCounterPerBankPerCycle(bid)(wid) := (r_node.a.fire === true.B) +& (w_node.a.fire === true.B)
} }
} }
} else { } else {