提交 5d3e5332 编写于 作者: L Lingrui98

icache: change handshake logic

上级 82d5679c
...@@ -116,7 +116,7 @@ trait ICacheBase extends HasICacheParameters ...@@ -116,7 +116,7 @@ trait ICacheBase extends HasICacheParameters
//---------------------------- //----------------------------
// Stage 1 // Stage 1
//---------------------------- //----------------------------
val s1_valid = WireInit(false.B) // val s1_valid = WireInit(false.B)
val s1_req_pc = Wire(UInt(VAddrBits.W)) val s1_req_pc = Wire(UInt(VAddrBits.W))
val s1_req_mask = Wire(UInt(PredictWidth.W)) val s1_req_mask = Wire(UInt(PredictWidth.W))
val s1_fire = WireInit(false.B) val s1_fire = WireInit(false.B)
...@@ -280,21 +280,21 @@ class ICache extends ICacheModule ...@@ -280,21 +280,21 @@ class ICache extends ICacheModule
//---------------------------- //----------------------------
// Stage 1 // Stage 1
//---------------------------- //----------------------------
s1_valid := io.req.fire() s1_fire := io.req.fire()
s1_req_pc := io.req.bits.addr s1_req_pc := io.req.bits.addr
s1_req_mask := io.req.bits.mask s1_req_mask := io.req.bits.mask
s2_ready := WireInit(false.B) s2_ready := WireInit(false.B)
s1_fire := s1_valid && (s2_ready || s2_flush) // s1_fire := s1_valid && (s2_ready || s2_flush)
// SRAM(Meta and Data) read request // SRAM(Meta and Data) read request
val s1_idx = get_idx(s1_req_pc) val s1_idx = get_idx(s1_req_pc)
metaArray.io.read.valid := s1_valid metaArray.io.read.valid := s1_fire
metaArray.io.read.bits :=s1_idx metaArray.io.read.bits :=s1_idx
dataArray.io.read.valid := s1_valid dataArray.io.read.valid := s1_fire
dataArray.io.read.bits :=s1_idx dataArray.io.read.bits :=s1_idx
XSDebug("[Stage 1] v : r : f (%d %d %d) request pc: 0x%x mask: %b\n",s1_valid,s2_ready,s1_fire,s1_req_pc,s1_req_mask) XSDebug("[Stage 1] r : f (%d %d) request pc: 0x%x mask: %b\n",s2_ready,s1_fire,s1_req_pc,s1_req_mask)
XSDebug("[Stage 1] index: %d\n",s1_idx) XSDebug("[Stage 1] index: %d\n",s1_idx)
...@@ -306,10 +306,11 @@ class ICache extends ICacheModule ...@@ -306,10 +306,11 @@ class ICache extends ICacheModule
val s2_tag = get_tag(s2_tlb_resp.paddr) val s2_tag = get_tag(s2_tlb_resp.paddr)
val s2_hit = WireInit(false.B) val s2_hit = WireInit(false.B)
val s2_access_fault = WireInit(false.B) val s2_access_fault = WireInit(false.B)
s2_fire := s2_valid && s3_ready && !s2_flush && io.tlb.resp.fire() val s2_allValid = s2_valid && io.tlb.resp.valid
when(s2_flush) {s2_valid := s1_fire} s2_fire := s2_allValid && s3_ready
.elsewhen(s1_fire) { s2_valid := s1_valid} when(s1_fire) { s2_valid := true.B }
.elsewhen(s2_fire) { s2_valid := false.B} .elsewhen(s2_flush) { s2_valid := false.B }
.elsewhen(s2_fire) { s2_valid := false.B }
//physical address < 0x80000000 //physical address < 0x80000000
//TODO: May have bugs //TODO: May have bugs
...@@ -331,7 +332,7 @@ class ICache extends ICacheModule ...@@ -331,7 +332,7 @@ class ICache extends ICacheModule
val waymask = Mux(s2_hit, hitVec.asUInt, Mux(hasInvalidWay, refillInvalidWaymask, victimWayMask)) val waymask = Mux(s2_hit, hitVec.asUInt, Mux(hasInvalidWay, refillInvalidWaymask, victimWayMask))
s2_hit := ParallelOR(hitVec) || s2_tlb_resp.excp.pf.instr || s2_access_fault s2_hit := ParallelOR(hitVec) || s2_tlb_resp.excp.pf.instr || s2_access_fault
s2_ready := s2_fire || !s2_valid || s2_flush s2_ready := s3_ready && io.tlb.resp.valid || !s2_valid
XSDebug("[Stage 2] v : r : f (%d %d %d) pc: 0x%x mask: %b acf:%d\n",s2_valid,s3_ready,s2_fire,s2_req_pc,s2_req_mask,s2_access_fault) XSDebug("[Stage 2] v : r : f (%d %d %d) pc: 0x%x mask: %b acf:%d\n",s2_valid,s3_ready,s2_fire,s2_req_pc,s2_req_mask,s2_access_fault)
XSDebug(p"[Stage 2] tlb req: v ${io.tlb.req.valid} r ${io.tlb.req.ready} ${io.tlb.req.bits}\n") XSDebug(p"[Stage 2] tlb req: v ${io.tlb.req.valid} r ${io.tlb.req.ready} ${io.tlb.req.bits}\n")
...@@ -351,9 +352,9 @@ class ICache extends ICacheModule ...@@ -351,9 +352,9 @@ class ICache extends ICacheModule
val s3_miss = s3_valid && !s3_hit val s3_miss = s3_valid && !s3_hit
val s3_idx = get_idx(s3_req_pc) val s3_idx = get_idx(s3_req_pc)
val s3_access_fault = RegEnable(s2_access_fault,init=false.B,enable=s2_fire) val s3_access_fault = RegEnable(s2_access_fault,init=false.B,enable=s2_fire)
when(s3_flush) { s3_valid := false.B } when(s3_flush) { s3_valid := false.B }
.elsewhen(s2_fire) { s3_valid := s2_valid } .elsewhen(s2_fire && !s2_flush) { s3_valid := true.B }
.elsewhen(io.resp.fire()) { s3_valid := false.B } .elsewhen(io.resp.fire()) { s3_valid := false.B }
val refillDataReg = Reg(Vec(refillCycles,UInt(beatBits.W))) val refillDataReg = Reg(Vec(refillCycles,UInt(beatBits.W)))
// icache hit // icache hit
...@@ -421,7 +422,7 @@ class ICache extends ICacheModule ...@@ -421,7 +422,7 @@ class ICache extends ICacheModule
val refillDataVec = icacheMissQueue.io.resp.bits.data.asTypeOf(Vec(blockWords,UInt(wordBits.W))) val refillDataVec = icacheMissQueue.io.resp.bits.data.asTypeOf(Vec(blockWords,UInt(wordBits.W)))
val refillDataOut = cutHelper(refillDataVec, s3_req_pc(5,1),s3_req_mask ) val refillDataOut = cutHelper(refillDataVec, s3_req_pc(5,1),s3_req_mask )
s3_ready := ((io.resp.fire() || !s3_valid) && !blocking) || (blocking && icacheMissQueue.io.resp.fire()) s3_ready := ((io.resp.ready && s3_hit || !s3_valid) && !blocking) || (blocking && icacheMissQueue.io.resp.valid && io.resp.ready)
//TODO: coherence //TODO: coherence
XSDebug("[Stage 3] valid:%d pc: 0x%x mask: %b ipf:%d acf:%d \n",s3_valid,s3_req_pc,s3_req_mask,s3_tlb_resp.excp.pf.instr,s3_access_fault) XSDebug("[Stage 3] valid:%d pc: 0x%x mask: %b ipf:%d acf:%d \n",s3_valid,s3_req_pc,s3_req_mask,s3_tlb_resp.excp.pf.instr,s3_access_fault)
...@@ -441,7 +442,7 @@ class ICache extends ICacheModule ...@@ -441,7 +442,7 @@ class ICache extends ICacheModule
// Out Put // Out Put
//---------------------------- //----------------------------
//icache request //icache request
io.req.ready := metaArray.io.read.ready && dataArray.io.read.ready && s2_ready io.req.ready := s2_ready
//icache response: to pre-decoder //icache response: to pre-decoder
io.resp.valid := s3_valid && (s3_hit || icacheMissQueue.io.resp.valid) io.resp.valid := s3_valid && (s3_hit || icacheMissQueue.io.resp.valid)
...@@ -452,7 +453,7 @@ class ICache extends ICacheModule ...@@ -452,7 +453,7 @@ class ICache extends ICacheModule
io.resp.bits.acf := s3_access_fault io.resp.bits.acf := s3_access_fault
//to itlb //to itlb
io.tlb.resp.ready := s3_ready io.tlb.resp.ready := true.B // DontCare
io.tlb.req.valid := s2_valid io.tlb.req.valid := s2_valid
io.tlb.req.bits.vaddr := s2_req_pc io.tlb.req.bits.vaddr := s2_req_pc
io.tlb.req.bits.cmd := TlbCmd.exec io.tlb.req.bits.cmd := TlbCmd.exec
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册