diff --git a/groundtest/src/main/scala/cachetest.scala b/groundtest/src/main/scala/cachetest.scala new file mode 100644 index 00000000..f943a94b --- /dev/null +++ b/groundtest/src/main/scala/cachetest.scala @@ -0,0 +1,43 @@ +package groundtest + +import Chisel._ +import uncore._ +import cde.{Parameters, Field} + +class CacheFillTest(implicit val p: Parameters) extends GroundTest()(p) + with HasTileLinkParameters { + val capacityKb: Int = p("L2_CAPACITY_IN_KB") + val nblocks = capacityKb * 1024 / p(CacheBlockBytes) + val s_start :: s_prefetch :: s_retrieve :: s_finished :: Nil = Enum(Bits(), 4) + val state = Reg(init = s_start) + + val inflight = Reg(init = Bool(false)) + val active = state === s_prefetch || state === s_retrieve + + val (xact_id, xact_flip) = Counter(io.mem.acquire.fire(), tlMaxClientXacts) + val (req_block, round_done) = Counter(io.mem.acquire.fire(), nblocks) + + io.mem.acquire.valid := active && !inflight + io.mem.acquire.bits := Mux(state === s_prefetch, + GetPrefetch(xact_id, req_block), + GetBlock(xact_id, req_block)) + io.mem.grant.ready := active + + when (io.mem.acquire.fire()) { + inflight := Bool(true) + } + + val last_grant = !io.mem.grant.bits.hasMultibeatData() || + io.mem.grant.bits.addr_beat === UInt(tlDataBeats - 1) + + when (io.mem.grant.fire() && last_grant) { + inflight := Bool(false) + } + + when (state === s_start) { state := s_prefetch } + when (state === s_prefetch && round_done) { state := s_retrieve } + when (state === s_retrieve && round_done) { state := s_finished } + + io.finished := (state === s_finished) + io.cache.req.valid := Bool(false) +}