fix(lsu): lr、sc、amo指令异常类型修正
This commit is contained in:
parent
ee3b3bddcd
commit
efb713dce3
|
@ -181,12 +181,9 @@ class Lsu(implicit val cpuConfig: CpuConfig) extends Module {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
when(
|
when(
|
||||||
lsExe.out.loadAddrMisaligned ||
|
lsExe.out.addr_misaligned ||
|
||||||
lsExe.out.storeAddrMisaligned ||
|
lsExe.out.access_fault ||
|
||||||
lsExe.out.loadAccessFault ||
|
lsExe.out.page_fault
|
||||||
lsExe.out.storeAccessFault ||
|
|
||||||
lsExe.out.loadPageFault ||
|
|
||||||
lsExe.out.storePageFault
|
|
||||||
) {
|
) {
|
||||||
state := s_idle
|
state := s_idle
|
||||||
io.memoryUnit.out.ready := true.B
|
io.memoryUnit.out.ready := true.B
|
||||||
|
@ -200,12 +197,12 @@ class Lsu(implicit val cpuConfig: CpuConfig) extends Module {
|
||||||
io.dataMemory <> lsExe.dataMemory
|
io.dataMemory <> lsExe.dataMemory
|
||||||
|
|
||||||
io.memoryUnit.out.ex := io.memoryUnit.in.ex
|
io.memoryUnit.out.ex := io.memoryUnit.in.ex
|
||||||
io.memoryUnit.out.ex.exception(loadAddrMisaligned) := lsExe.out.loadAddrMisaligned
|
io.memoryUnit.out.ex.exception(loadAddrMisaligned) := (loadReq || lrReq) && lsExe.out.addr_misaligned
|
||||||
io.memoryUnit.out.ex.exception(storeAddrMisaligned) := lsExe.out.storeAddrMisaligned
|
io.memoryUnit.out.ex.exception(loadAccessFault) := (loadReq || lrReq) && lsExe.out.access_fault
|
||||||
io.memoryUnit.out.ex.exception(loadAccessFault) := lsExe.out.loadAccessFault
|
io.memoryUnit.out.ex.exception(loadPageFault) := (loadReq || lrReq) && lsExe.out.page_fault
|
||||||
io.memoryUnit.out.ex.exception(storeAccessFault) := lsExe.out.storeAccessFault
|
io.memoryUnit.out.ex.exception(storeAddrMisaligned) := (storeReq || scReq || amoReq) && lsExe.out.addr_misaligned
|
||||||
io.memoryUnit.out.ex.exception(loadPageFault) := lsExe.out.loadPageFault
|
io.memoryUnit.out.ex.exception(storeAccessFault) := (storeReq || scReq || amoReq) && lsExe.out.addr_misaligned
|
||||||
io.memoryUnit.out.ex.exception(storePageFault) := lsExe.out.storePageFault
|
io.memoryUnit.out.ex.exception(storePageFault) := (storeReq || scReq || amoReq) && lsExe.out.page_fault
|
||||||
|
|
||||||
io.memoryUnit.out.ex.tval := io.dataMemory.out.addr
|
io.memoryUnit.out.ex.tval := io.dataMemory.out.addr
|
||||||
io.memoryUnit.out.rdata := MuxCase(
|
io.memoryUnit.out.rdata := MuxCase(
|
||||||
|
|
|
@ -16,12 +16,9 @@ class LsExecute extends Module {
|
||||||
val info = new InstInfo()
|
val info = new InstInfo()
|
||||||
})
|
})
|
||||||
val out = Output(new Bundle {
|
val out = Output(new Bundle {
|
||||||
val loadAddrMisaligned = Bool()
|
val addr_misaligned = Bool()
|
||||||
val storeAddrMisaligned = Bool()
|
val access_fault = Bool()
|
||||||
val loadAccessFault = Bool()
|
val page_fault = Bool()
|
||||||
val storeAccessFault = Bool()
|
|
||||||
val loadPageFault = Bool()
|
|
||||||
val storePageFault = Bool()
|
|
||||||
val rdata = UInt(XLEN.W)
|
val rdata = UInt(XLEN.W)
|
||||||
val ready = Bool()
|
val ready = Bool()
|
||||||
})
|
})
|
||||||
|
@ -131,20 +128,16 @@ class LsExecute extends Module {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
io.dataMemory.out.en := valid && !io.out.storeAddrMisaligned && !io.out.loadAddrMisaligned
|
io.dataMemory.out.en := valid && !io.out.addr_misaligned
|
||||||
io.dataMemory.out.rlen := size
|
io.dataMemory.out.rlen := size
|
||||||
io.dataMemory.out.wen := isStore
|
io.dataMemory.out.wen := isStore
|
||||||
io.dataMemory.out.wstrb := reqWmask
|
io.dataMemory.out.wstrb := reqWmask
|
||||||
io.dataMemory.out.addr := reqAddr
|
io.dataMemory.out.addr := reqAddr
|
||||||
io.dataMemory.out.wdata := reqWdata
|
io.dataMemory.out.wdata := reqWdata
|
||||||
|
|
||||||
val is_amo = valid && LSUOpType.isAMO(op)
|
|
||||||
io.out.ready := io.dataMemory.in.ready && io.dataMemory.out.en
|
io.out.ready := io.dataMemory.in.ready && io.dataMemory.out.en
|
||||||
io.out.rdata := Mux(partialLoad, rdataPartialLoad, rdataSel)
|
io.out.rdata := Mux(partialLoad, rdataPartialLoad, rdataSel)
|
||||||
io.out.loadAddrMisaligned := valid && !isStore && !is_amo && !addrAligned
|
io.out.addr_misaligned := valid && !addrAligned
|
||||||
io.out.loadAccessFault := valid && !isStore && !is_amo && access_fault
|
io.out.access_fault := valid && access_fault
|
||||||
io.out.loadPageFault := valid && !isStore && !is_amo && page_fault
|
io.out.page_fault := valid && page_fault
|
||||||
io.out.storeAddrMisaligned := valid && (isStore || is_amo) && !addrAligned
|
|
||||||
io.out.storeAccessFault := valid && (isStore || is_amo) && access_fault
|
|
||||||
io.out.storePageFault := valid && (isStore || is_amo) && page_fault
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue