提交 65b6fa35 编写于 作者: J JinYue

IFU/ICache: fix invalid instructions bug

上级 7fe1cc1d
......@@ -944,7 +944,7 @@ class FakeL1plusCache()(implicit p: Parameters) extends XSModule with HasL1plusC
val fakeRAM = Seq.fill(8)(Module(new RAMHelper(64L * 1024 * 1024 * 1024)))
val req_valid = RegNext(io.req.valid)
val req_addr = RegNext((io.req.bits.addr - "h80000000".U) >> 3)
assert(!req_valid || req_addr(2, 0) === 0.U)
//assert(!req_valid || req_addr(2, 0) === 0.U)
for ((ram, i) <- fakeRAM.zipWithIndex) {
ram.io.clk := clock
ram.io.en := req_valid
......
......@@ -121,11 +121,11 @@ class ICacheMetaWriteBundle(implicit p: Parameters) extends ICacheBundle
class ICacheDataWriteBundle(implicit p: Parameters) extends ICacheBundle
{
val virIdx = UInt(idxBits.W)
val data = Vec(blockRows,UInt(blockBits.W))
val data = UInt(blockBits.W)
val waymask = UInt(nWays.W)
val bankIdx = Bool()
def apply(data:Vec[UInt], idx:UInt, waymask:UInt, bankIdx: Bool){
def apply(data:UInt, idx:UInt, waymask:UInt, bankIdx: Bool){
this.virIdx := idx
this.data := data
this.waymask := waymask
......@@ -220,7 +220,7 @@ class ICacheDataArray(implicit p: Parameters) extends ICacheArray
if(i == 0) way.io.w.req.valid := io.write.valid && !io.write.bits.bankIdx
else way.io.w.req.valid := io.write.valid && io.write.bits.bankIdx
way.io.w.req.bits.apply(data=io.write.bits.data.asUInt(), setIdx=io.write.bits.virIdx, waymask=io.write.bits.waymask)
way.io.w.req.bits.apply(data=io.write.bits.data, setIdx=io.write.bits.virIdx, waymask=io.write.bits.waymask)
}
dataArray
......@@ -335,9 +335,9 @@ class ICacheMissEntry(implicit p: Parameters) extends ICacheMissQueueModule
//TODO: Maybe this sate is noe necessary so we don't need respDataReg
is(s_write_back){
when((io.data_write.fire() && io.meta_write.fire()) || needFlush){
//when((io.data_write.fire() && io.meta_write.fire()) || needFlush){
state := s_wait_resp
}
//}
}
is(s_wait_resp){
......@@ -354,7 +354,7 @@ class ICacheMissEntry(implicit p: Parameters) extends ICacheMissQueueModule
io.meta_write.bits.apply(tag=req_tag, idx=req_idx, waymask=req_waymask, bankIdx=req_idx(0))
io.data_write.valid := (state === s_write_back) && !needFlush
io.data_write.bits.apply(data=respDataReg.asTypeOf(Vec(blockRows, UInt(rowBits.W))), idx=req_idx, waymask=req_waymask, bankIdx=req_idx(0))
io.data_write.bits.apply(data=respDataReg, idx=req_idx, waymask=req_waymask, bankIdx=req_idx(0))
//mem request
io.mem_acquire.bits.cmd := MemoryOpConstants.M_XRD
......
......@@ -207,6 +207,11 @@ class NewIFU(implicit p: Parameters) extends XSModule with Temperary with HasICa
)
toMissQueue <> DontCare
val f2_mq_datas = Reg(Vec(2, UInt(blockBits.W)))
when(fromMissQueue(0).fire) {f2_mq_datas(0) := fromMissQueue(0).bits.data}
when(fromMissQueue(1).fire) {f2_mq_datas(1) := fromMissQueue(1).bits.data}
switch(wait_state){
is(wait_idle){
when(f2_valid && !f2_hit){
......@@ -286,7 +291,6 @@ class NewIFU(implicit p: Parameters) extends XSModule with Temperary with HasICa
}
val f2_hit_datas = RegEnable(next = f1_hit_data, enable = f1_fire)
val f2_mq_datas = RegInit(VecInit(fromMissQueue.map(p => p.bits.data))) //TODO: Implement miss queue response
val f2_datas = Mux(f2_hit, f2_hit_datas, f2_mq_datas) // TODO: f1_hit_datas is error
def cut(cacheline: UInt, start: UInt) : Vec[UInt] ={
......@@ -299,7 +303,7 @@ class NewIFU(implicit p: Parameters) extends XSModule with Temperary with HasICa
result
}
preDecoderIn.data := cut(Cat(f2_datas.map(cacheline => cacheline.asUInt )).asUInt, f2_ftq_req.startAddr)
preDecoderIn.data := cut(Cat(f2_datas.map(cacheline => cacheline.asUInt ).reverse).asUInt, f2_ftq_req.startAddr)
preDecoderIn.startAddr := f2_ftq_req.startAddr
preDecoderIn.ftqOffset := f2_ftq_req.ftqOffset
preDecoderIn.target := f2_ftq_req.target
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册