@@ -22,7 +22,7 @@ class IFU extends Module with HasResetVector {
})
// pc
valpc=RegInit(resetVector.U(32.W))
valpc=RegInit(resetVector.U(64.W))
valpcUpdate=io.redirect.valid||io.imem.req.fire()
valsnpc=pc+4.U// sequential next pc
...
...
@@ -39,25 +39,38 @@ class IFU extends Module with HasResetVector {
//bp2.io.in.bits := io.out.bits
//bp2.io.in.valid := io.imem.resp.fire()
when(pcUpdate){pc:=npc}
when(pcUpdate){
pc:=npc
// printf("[IF1] pc=%x\n", pc)
}
io.flushVec:=Mux(io.redirect.valid,"b1111".U,0.U)
io.bpFlush:=false.B
io.imem:=DontCare
io.imem.req.valid:=io.out.ready
io.imem.req.bits.addr:=pc
io.imem.req.bits.size:="b10".U
io.imem.req.bits.addr:=Cat(pc(63,2),0.U(2.W))//cache will treat it as Cat(pc(63,3),0.U(3.W))
io.imem.req.bits.size:="b11".U
io.imem.req.bits.cmd:=SimpleBusCmd.read
io.imem.req.bits.user:=npc
io.imem.resp.ready:=io.out.ready||io.flushVec(0)
io.out.bits:=DontCare
io.out.bits.pc:=io.pc
io.out.bits.instr:=io.imem.resp.bits.rdata
if(p.HasIcache){
io.out.bits.instr:=Mux(io.pc(2),io.imem.resp.bits.rdata(63,32),io.imem.resp.bits.rdata(31,0))//inst path only uses 32bit inst, get the right inst according to pc(2)