parameterize metadataarray
This commit is contained in:
parent
519b2ea2b6
commit
7f690dd9c8
@ -34,9 +34,7 @@ case class DCacheConfig(val sets: Int, val ways: Int,
|
|||||||
def refillcycles = tl.dataBits/(rowbits)
|
def refillcycles = tl.dataBits/(rowbits)
|
||||||
def isNarrowRead = narrowRead && databits*ways % rowbits == 0
|
def isNarrowRead = narrowRead && databits*ways % rowbits == 0
|
||||||
val statebits = log2Up(states)
|
val statebits = log2Up(states)
|
||||||
val metabits = statebits + tagbits
|
|
||||||
val encdatabits = code.width(databits)
|
val encdatabits = code.width(databits)
|
||||||
val encmetabits = code.width(metabits)
|
|
||||||
val encrowbits = rowwords*encdatabits
|
val encrowbits = rowwords*encdatabits
|
||||||
val lrsc_cycles = 32 // ISA requires 16-insn LRSC sequences to succeed
|
val lrsc_cycles = 32 // ISA requires 16-insn LRSC sequences to succeed
|
||||||
|
|
||||||
@ -85,8 +83,11 @@ class LoadGen(typ: Bits, addr: Bits, dat: Bits, zero: Bool)
|
|||||||
val byte = Cat(Mux(zero || t.byte, Fill(56, sign && byteShift(7)), half(63,8)), byteShift)
|
val byte = Cat(Mux(zero || t.byte, Fill(56, sign && byteShift(7)), half(63,8)), byteShift)
|
||||||
}
|
}
|
||||||
|
|
||||||
class MSHRReq(implicit val cacheconf: DCacheConfig) extends HellaCacheReq
|
class MSHRReq(implicit val cacheconf: DCacheConfig) extends HellaCacheReq {
|
||||||
with InternalRequestState
|
val tag_match = Bool()
|
||||||
|
val old_meta = new L1MetaData
|
||||||
|
val way_en = Bits(width = cacheconf.ways)
|
||||||
|
}
|
||||||
|
|
||||||
class Replay(implicit conf: DCacheConfig) extends HellaCacheReq {
|
class Replay(implicit conf: DCacheConfig) extends HellaCacheReq {
|
||||||
val sdq_id = UInt(width = log2Up(conf.nsdq))
|
val sdq_id = UInt(width = log2Up(conf.nsdq))
|
||||||
@ -97,27 +98,37 @@ class DataReadReq(implicit val conf: DCacheConfig) extends DCacheBundle {
|
|||||||
val addr = Bits(width = conf.untagbits)
|
val addr = Bits(width = conf.untagbits)
|
||||||
}
|
}
|
||||||
|
|
||||||
class DataWriteReq(implicit conf: DCacheConfig) extends DataReadReq()(conf) {
|
class DataWriteReq(implicit conf: DCacheConfig) extends DataReadReq {
|
||||||
val wmask = Bits(width = conf.rowwords)
|
val wmask = Bits(width = conf.rowwords)
|
||||||
val data = Bits(width = conf.encrowbits)
|
val data = Bits(width = conf.encrowbits)
|
||||||
}
|
}
|
||||||
|
|
||||||
class L1MetaReadReq(implicit conf: DCacheConfig) extends MetaReadReq()(conf) {
|
object L1MetaData {
|
||||||
|
def apply(tag: Bits, state: UInt)(implicit conf: DCacheConfig) = {
|
||||||
|
val meta = new L1MetaData
|
||||||
|
meta.state := state
|
||||||
|
meta.tag := tag
|
||||||
|
meta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class L1MetaData(implicit val conf: DCacheConfig) extends MetaData {
|
||||||
|
val state = UInt(width = conf.statebits)
|
||||||
|
}
|
||||||
|
|
||||||
|
class L1MetaReadReq(implicit conf: DCacheConfig) extends MetaReadReq {
|
||||||
val tag = Bits(width = conf.tagbits)
|
val tag = Bits(width = conf.tagbits)
|
||||||
}
|
}
|
||||||
|
|
||||||
class InternalProbe(implicit conf: TileLinkConfiguration) extends Probe()(conf)
|
class InternalProbe(implicit conf: TileLinkConfiguration) extends Probe()(conf)
|
||||||
with HasClientTransactionId
|
with HasClientTransactionId
|
||||||
|
|
||||||
class WritebackReq(implicit conf: DCacheConfig) extends Bundle {
|
class WritebackReq(implicit val conf: DCacheConfig) extends DCacheBundle {
|
||||||
val tag = Bits(width = conf.tagbits)
|
val tag = Bits(width = conf.tagbits)
|
||||||
val idx = Bits(width = conf.idxbits)
|
val idx = Bits(width = conf.idxbits)
|
||||||
val way_en = Bits(width = conf.ways)
|
val way_en = Bits(width = conf.ways)
|
||||||
val client_xact_id = Bits(width = conf.tl.clientXactIdBits)
|
val client_xact_id = Bits(width = conf.tl.clientXactIdBits)
|
||||||
val master_xact_id = Bits(width = conf.tl.masterXactIdBits)
|
val master_xact_id = Bits(width = conf.tl.masterXactIdBits)
|
||||||
val r_type = UInt(width = conf.tl.co.releaseTypeWidth)
|
val r_type = UInt(width = conf.tl.co.releaseTypeWidth)
|
||||||
|
|
||||||
override def clone = new WritebackReq().asInstanceOf[this.type]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MSHR(id: Int)(implicit conf: DCacheConfig) extends Module {
|
class MSHR(id: Int)(implicit conf: DCacheConfig) extends Module {
|
||||||
@ -136,7 +147,7 @@ class MSHR(id: Int)(implicit conf: DCacheConfig) extends Module {
|
|||||||
val mem_req = Decoupled(new Acquire)
|
val mem_req = Decoupled(new Acquire)
|
||||||
val mem_resp = new DataWriteReq().asOutput
|
val mem_resp = new DataWriteReq().asOutput
|
||||||
val meta_read = Decoupled(new L1MetaReadReq)
|
val meta_read = Decoupled(new L1MetaReadReq)
|
||||||
val meta_write = Decoupled(new MetaWriteReq)
|
val meta_write = Decoupled(new MetaWriteReq(new L1MetaData))
|
||||||
val replay = Decoupled(new Replay)
|
val replay = Decoupled(new Replay)
|
||||||
val mem_grant = Valid(new LogicalNetworkIO(new Grant)).flip
|
val mem_grant = Valid(new LogicalNetworkIO(new Grant)).flip
|
||||||
val mem_finish = Decoupled(new LogicalNetworkIO(new Finish))
|
val mem_finish = Decoupled(new LogicalNetworkIO(new Finish))
|
||||||
@ -286,7 +297,7 @@ class MSHRFile(implicit conf: DCacheConfig) extends Module {
|
|||||||
val mem_req = Decoupled(new Acquire)
|
val mem_req = Decoupled(new Acquire)
|
||||||
val mem_resp = new DataWriteReq().asOutput
|
val mem_resp = new DataWriteReq().asOutput
|
||||||
val meta_read = Decoupled(new L1MetaReadReq)
|
val meta_read = Decoupled(new L1MetaReadReq)
|
||||||
val meta_write = Decoupled(new MetaWriteReq)
|
val meta_write = Decoupled(new MetaWriteReq(new L1MetaData))
|
||||||
val replay = Decoupled(new Replay)
|
val replay = Decoupled(new Replay)
|
||||||
val mem_grant = Valid(new LogicalNetworkIO(new Grant)).flip
|
val mem_grant = Valid(new LogicalNetworkIO(new Grant)).flip
|
||||||
val mem_finish = Decoupled(new LogicalNetworkIO(new Finish))
|
val mem_finish = Decoupled(new LogicalNetworkIO(new Finish))
|
||||||
@ -310,7 +321,7 @@ class MSHRFile(implicit conf: DCacheConfig) extends Module {
|
|||||||
val wbTagList = Vec.fill(conf.nmshr){Bits()}
|
val wbTagList = Vec.fill(conf.nmshr){Bits()}
|
||||||
val memRespMux = Vec.fill(conf.nmshr){new DataWriteReq}
|
val memRespMux = Vec.fill(conf.nmshr){new DataWriteReq}
|
||||||
val meta_read_arb = Module(new Arbiter(new L1MetaReadReq, conf.nmshr))
|
val meta_read_arb = Module(new Arbiter(new L1MetaReadReq, conf.nmshr))
|
||||||
val meta_write_arb = Module(new Arbiter(new MetaWriteReq, conf.nmshr))
|
val meta_write_arb = Module(new Arbiter(new MetaWriteReq(new L1MetaData), conf.nmshr))
|
||||||
val mem_req_arb = Module(new Arbiter(new Acquire, conf.nmshr))
|
val mem_req_arb = Module(new Arbiter(new Acquire, conf.nmshr))
|
||||||
val mem_finish_arb = Module(new Arbiter(new LogicalNetworkIO(new Finish), conf.nmshr))
|
val mem_finish_arb = Module(new Arbiter(new LogicalNetworkIO(new Finish), conf.nmshr))
|
||||||
val wb_req_arb = Module(new Arbiter(new WritebackReq, conf.nmshr))
|
val wb_req_arb = Module(new Arbiter(new WritebackReq, conf.nmshr))
|
||||||
@ -465,7 +476,7 @@ class ProbeUnit(implicit conf: DCacheConfig) extends Module {
|
|||||||
val req = Decoupled(new InternalProbe).flip
|
val req = Decoupled(new InternalProbe).flip
|
||||||
val rep = Decoupled(new Release)
|
val rep = Decoupled(new Release)
|
||||||
val meta_read = Decoupled(new L1MetaReadReq)
|
val meta_read = Decoupled(new L1MetaReadReq)
|
||||||
val meta_write = Decoupled(new MetaWriteReq)
|
val meta_write = Decoupled(new MetaWriteReq(new L1MetaData))
|
||||||
val wb_req = Decoupled(new WritebackReq)
|
val wb_req = Decoupled(new WritebackReq)
|
||||||
val way_en = Bits(INPUT, conf.ways)
|
val way_en = Bits(INPUT, conf.ways)
|
||||||
val mshr_rdy = Bool(INPUT)
|
val mshr_rdy = Bool(INPUT)
|
||||||
@ -760,16 +771,15 @@ class HellaCache(implicit conf: DCacheConfig) extends Module {
|
|||||||
io.cpu.xcpt.pf.st := s1_write && dtlb.io.resp.xcpt_st
|
io.cpu.xcpt.pf.st := s1_write && dtlb.io.resp.xcpt_st
|
||||||
|
|
||||||
// tags
|
// tags
|
||||||
val meta = Module(new MetaDataArray)
|
val meta = Module(new MetaDataArray(L1MetaData(tl.co.newStateOnFlush,UInt(0))))
|
||||||
val metaReadArb = Module(new Arbiter(new MetaReadReq, 5))
|
val metaReadArb = Module(new Arbiter(new MetaReadReq, 5))
|
||||||
val metaWriteArb = Module(new Arbiter(new MetaWriteReq, 2))
|
val metaWriteArb = Module(new Arbiter(new MetaWriteReq(new L1MetaData), 2))
|
||||||
metaReadArb.io.out <> meta.io.read
|
metaReadArb.io.out <> meta.io.read
|
||||||
metaWriteArb.io.out <> meta.io.write
|
metaWriteArb.io.out <> meta.io.write
|
||||||
|
|
||||||
// data
|
// data
|
||||||
val data = Module(new DataArray)
|
val data = Module(new DataArray)
|
||||||
val readArb = Module(new Arbiter(new DataReadReq, 4))
|
val readArb = Module(new Arbiter(new DataReadReq, 4))
|
||||||
|
|
||||||
val writeArb = Module(new Arbiter(new DataWriteReq, 2))
|
val writeArb = Module(new Arbiter(new DataWriteReq, 2))
|
||||||
data.io.write.valid := writeArb.io.out.valid
|
data.io.write.valid := writeArb.io.out.valid
|
||||||
writeArb.io.out.ready := data.io.write.ready
|
writeArb.io.out.ready := data.io.write.ready
|
||||||
@ -869,7 +879,7 @@ class HellaCache(implicit conf: DCacheConfig) extends Module {
|
|||||||
mshrs.io.req.valid := s2_valid_masked && !s2_hit && (isPrefetch(s2_req.cmd) || isRead(s2_req.cmd) || isWrite(s2_req.cmd))
|
mshrs.io.req.valid := s2_valid_masked && !s2_hit && (isPrefetch(s2_req.cmd) || isRead(s2_req.cmd) || isWrite(s2_req.cmd))
|
||||||
mshrs.io.req.bits := s2_req
|
mshrs.io.req.bits := s2_req
|
||||||
mshrs.io.req.bits.tag_match := s2_tag_match
|
mshrs.io.req.bits.tag_match := s2_tag_match
|
||||||
mshrs.io.req.bits.old_meta := Mux(s2_tag_match, MetaData(s2_repl_meta.tag, s2_hit_state), s2_repl_meta)
|
mshrs.io.req.bits.old_meta := Mux(s2_tag_match, L1MetaData(s2_repl_meta.tag, s2_hit_state), s2_repl_meta)
|
||||||
mshrs.io.req.bits.way_en := Mux(s2_tag_match, s2_tag_match_way, s2_replaced_way_en)
|
mshrs.io.req.bits.way_en := Mux(s2_tag_match, s2_tag_match_way, s2_replaced_way_en)
|
||||||
mshrs.io.req.bits.data := s2_req.data
|
mshrs.io.req.bits.data := s2_req.data
|
||||||
when (mshrs.io.req.fire()) { replacer.miss }
|
when (mshrs.io.req.fire()) { replacer.miss }
|
||||||
|
Loading…
Reference in New Issue
Block a user