temp; converted voluntary wb tracker
This commit is contained in:
parent
dc1a61264d
commit
394eb38a96
@ -122,7 +122,7 @@ object L2Metadata {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
class L2Metadata extends Metadata with L2HellaCacheParameters {
|
class L2Metadata extends Metadata with L2HellaCacheParameters {
|
||||||
val coh = co.masterMetadataOnFlush.clone
|
val coh = new MasterMetadata()(co) //co.masterMetadataOnFlush.clone
|
||||||
}
|
}
|
||||||
|
|
||||||
class L2MetaReadReq extends MetaReadReq with HasL2Id {
|
class L2MetaReadReq extends MetaReadReq with HasL2Id {
|
||||||
@ -306,11 +306,14 @@ class TSHRFile(bankId: Int, innerId: String, outerId: String) extends L2HellaCac
|
|||||||
// Reply to initial requestor
|
// Reply to initial requestor
|
||||||
doOutputArbitration(io.inner.grant, trackerList.map(_.io.inner.grant))
|
doOutputArbitration(io.inner.grant, trackerList.map(_.io.inner.grant))
|
||||||
|
|
||||||
// Free finished transactions
|
// Free finished transactions on ack
|
||||||
val ack = io.inner.finish
|
val finish = io.inner.finish
|
||||||
trackerList.map(_.io.inner.finish.valid := ack.valid)
|
val finish_idx = finish.bits.payload.master_xact_id
|
||||||
trackerList.map(_.io.inner.finish.bits := ack.bits)
|
trackerList.zipWithIndex.map { case (t, i) =>
|
||||||
ack.ready := Bool(true)
|
t.io.inner.finish.valid := finish.valid && finish_idx === UInt(i)
|
||||||
|
}
|
||||||
|
trackerList.map(_.io.inner.finish.bits := finish.bits)
|
||||||
|
finish.ready := Vec(trackerList.map(_.io.inner.finish.ready)).read(finish_idx)
|
||||||
|
|
||||||
// Arbitrate for the outer memory port
|
// Arbitrate for the outer memory port
|
||||||
val outer_arb = Module(new UncachedTileLinkIOArbiterThatPassesId(trackerList.size),
|
val outer_arb = Module(new UncachedTileLinkIOArbiterThatPassesId(trackerList.size),
|
||||||
@ -353,7 +356,7 @@ abstract class L2XactTracker(innerId: String, outerId: String) extends L2HellaCa
|
|||||||
}
|
}
|
||||||
|
|
||||||
class L2VoluntaryReleaseTracker(trackerId: Int, bankId: Int, innerId: String, outerId: String) extends L2XactTracker(innerId, outerId) {
|
class L2VoluntaryReleaseTracker(trackerId: Int, bankId: Int, innerId: String, outerId: String) extends L2XactTracker(innerId, outerId) {
|
||||||
val s_idle :: s_mem :: s_ack :: s_busy :: Nil = Enum(UInt(), 4)
|
val s_idle :: s_meta_read :: s_meta_resp :: s_meta_write :: s_data_write :: s_ack :: s_busy :: Nil = Enum(UInt(), 6)
|
||||||
val state = Reg(init=s_idle)
|
val state = Reg(init=s_idle)
|
||||||
val xact = Reg{ new Release }
|
val xact = Reg{ new Release }
|
||||||
val xact_internal = Reg{ new L2MetaResp }
|
val xact_internal = Reg{ new L2MetaResp }
|
||||||
@ -365,19 +368,14 @@ class L2VoluntaryReleaseTracker(trackerId: Int, bankId: Int, innerId: String, ou
|
|||||||
|
|
||||||
io.outer.grant.ready := Bool(false)
|
io.outer.grant.ready := Bool(false)
|
||||||
io.outer.acquire.valid := Bool(false)
|
io.outer.acquire.valid := Bool(false)
|
||||||
io.outer.acquire.bits.header.src := UInt(bankId)
|
|
||||||
io.outer.acquire.bits.payload := Bundle(Acquire(co.getUncachedWriteAcquireType,
|
|
||||||
xact.addr,
|
|
||||||
UInt(trackerId),
|
|
||||||
xact.data),
|
|
||||||
{ case TLId => outerId })
|
|
||||||
io.inner.acquire.ready := Bool(false)
|
io.inner.acquire.ready := Bool(false)
|
||||||
io.inner.probe.valid := Bool(false)
|
io.inner.probe.valid := Bool(false)
|
||||||
io.inner.release.ready := Bool(false)
|
io.inner.release.ready := Bool(false)
|
||||||
io.inner.grant.valid := Bool(false)
|
io.inner.grant.valid := Bool(false)
|
||||||
io.inner.grant.bits.header.src := UInt(bankId)
|
io.inner.grant.bits.header.src := UInt(bankId)
|
||||||
io.inner.grant.bits.header.dst := init_client_id
|
io.inner.grant.bits.header.dst := init_client_id
|
||||||
io.inner.grant.bits.payload := Grant(co.getGrantType(xact, co.masterMetadataOnFlush),// TODO xact_internal.meta)
|
io.inner.grant.bits.payload := Grant(co.getGrantType(xact, xact_internal.meta.coh),
|
||||||
xact.client_xact_id,
|
xact.client_xact_id,
|
||||||
UInt(trackerId))
|
UInt(trackerId))
|
||||||
|
|
||||||
@ -397,8 +395,7 @@ class L2VoluntaryReleaseTracker(trackerId: Int, bankId: Int, innerId: String, ou
|
|||||||
io.meta_write.bits.idx := xact.addr(untagBits-1,blockOffBits)
|
io.meta_write.bits.idx := xact.addr(untagBits-1,blockOffBits)
|
||||||
io.meta_write.bits.way_en := xact_internal.way_en
|
io.meta_write.bits.way_en := xact_internal.way_en
|
||||||
io.meta_write.bits.data := xact_internal.meta
|
io.meta_write.bits.data := xact_internal.meta
|
||||||
|
io.meta_resp.valid := Bool(true)
|
||||||
when(io.meta_resp.valid) { xact_internal := io.meta_resp.bits }
|
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
is(s_idle) {
|
is(s_idle) {
|
||||||
@ -406,25 +403,32 @@ class L2VoluntaryReleaseTracker(trackerId: Int, bankId: Int, innerId: String, ou
|
|||||||
when( io.inner.release.valid ) {
|
when( io.inner.release.valid ) {
|
||||||
xact := c_rel.payload
|
xact := c_rel.payload
|
||||||
init_client_id := c_rel.header.src
|
init_client_id := c_rel.header.src
|
||||||
state := s_mem
|
state := s_meta_read
|
||||||
}
|
}
|
||||||
}/*
|
}
|
||||||
is(s_meta_read) {
|
is(s_meta_read) {
|
||||||
when(io.meta_read.ready) state := s_meta_resp
|
io.meta_read.valid := Bool(true)
|
||||||
|
when(io.meta_read.ready) { state := s_meta_resp }
|
||||||
}
|
}
|
||||||
is(s_meta_resp) {
|
is(s_meta_resp) {
|
||||||
when(io.meta_resp.valid) {
|
when(io.meta_resp.valid) {
|
||||||
xact_internal.meta := tl.co.masterMetadataOnRelease(xact, xact_internal.meta, init_client_id))
|
xact_internal := io.meta_resp.bits
|
||||||
state := Mux(s_meta_write
|
state := s_meta_write
|
||||||
Mux(co.messageHasData(xact), s_mem, s_ack)
|
}
|
||||||
}*/
|
}
|
||||||
is(s_mem) {
|
is(s_meta_write) {
|
||||||
io.outer.acquire.valid := Bool(true)
|
io.meta_write.valid := Bool(true)
|
||||||
when(io.outer.acquire.ready) { state := s_ack }
|
when(io.outer.acquire.ready) { state := s_ack }
|
||||||
}
|
}
|
||||||
is(s_ack) {
|
is(s_ack) {
|
||||||
io.inner.grant.valid := Bool(true)
|
io.inner.grant.valid := Bool(true)
|
||||||
when(io.inner.grant.ready) { state := s_idle }
|
when(io.inner.grant.ready) {
|
||||||
|
state := Mux(co.requiresAckForGrant(io.inner.grant.bits.payload.g_type),
|
||||||
|
s_busy, s_idle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is(s_busy) {
|
||||||
|
when(io.inner.finish.valid) { state := s_idle }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,10 +62,10 @@ abstract class DirectoryRepresentation extends Bundle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class NullRepresentation extends DirectoryRepresentation {
|
class NullRepresentation extends DirectoryRepresentation {
|
||||||
val internal = UInt(0)
|
val internal = UInt()
|
||||||
def pop(id: UInt) = this
|
def pop(id: UInt) = this
|
||||||
def push(id: UInt) = this
|
def push(id: UInt) = this
|
||||||
def flush(dummy: Int = 0) = this
|
def flush(dummy: Int = 0) = { internal := UInt(0); this }
|
||||||
def none(dummy: Int = 0) = Bool(false)
|
def none(dummy: Int = 0) = Bool(false)
|
||||||
def one(dummy: Int = 0) = Bool(false)
|
def one(dummy: Int = 0) = Bool(false)
|
||||||
def count(dummy: Int = 0) = UInt(0)
|
def count(dummy: Int = 0) = UInt(0)
|
||||||
|
Loading…
Reference in New Issue
Block a user