2015-11-19 09:15:36 +01:00
|
|
|
package groundtest
|
|
|
|
|
|
|
|
import Chisel._
|
|
|
|
import uncore._
|
|
|
|
import cde.{Parameters, Field}
|
|
|
|
|
2015-11-19 05:53:36 +01:00
|
|
|
class CacheFillTest(implicit p: Parameters) extends GroundTest()(p)
|
2015-11-19 09:15:36 +01:00
|
|
|
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
|
|
|
|
|
2015-11-19 05:53:36 +01:00
|
|
|
disablePorts(mem = false)
|
|
|
|
|
2015-11-19 09:15:36 +01:00
|
|
|
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,
|
2016-05-03 03:25:02 +02:00
|
|
|
GetPrefetch(xact_id, UInt(memStartBlock) + req_block),
|
|
|
|
GetBlock(xact_id, UInt(memStartBlock) + req_block))
|
2016-05-03 22:35:38 +02:00
|
|
|
io.mem.grant.ready := inflight
|
2015-11-19 09:15:36 +01:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|