feat(mem): 增加acc例外
This commit is contained in:
parent
b170d374ee
commit
1b3ce1e739
|
@ -119,13 +119,14 @@ class Core(implicit val config: CpuConfig) extends Module {
|
||||||
csr.ctrl.mem_stall := !ctrl.memoryUnit.allow_to_go
|
csr.ctrl.mem_stall := !ctrl.memoryUnit.allow_to_go
|
||||||
csr.ext_int := io.ext_int
|
csr.ext_int := io.ext_int
|
||||||
|
|
||||||
memoryUnit.dataMemory.in.rdata := io.data.rdata
|
memoryUnit.dataMemory.in.rdata := io.data.rdata
|
||||||
io.data.en := memoryUnit.dataMemory.out.en
|
memoryUnit.dataMemory.in.acc_err := io.data.acc_err
|
||||||
io.data.size := memoryUnit.dataMemory.out.rlen
|
io.data.en := memoryUnit.dataMemory.out.en
|
||||||
io.data.wen := memoryUnit.dataMemory.out.wen
|
io.data.size := memoryUnit.dataMemory.out.rlen
|
||||||
io.data.wdata := memoryUnit.dataMemory.out.wdata
|
io.data.wen := memoryUnit.dataMemory.out.wen
|
||||||
io.data.addr := memoryUnit.dataMemory.out.addr
|
io.data.wdata := memoryUnit.dataMemory.out.wdata
|
||||||
io.data.wstrb := memoryUnit.dataMemory.out.wstrb
|
io.data.addr := memoryUnit.dataMemory.out.addr
|
||||||
|
io.data.wstrb := memoryUnit.dataMemory.out.wstrb
|
||||||
|
|
||||||
writeBackStage.memoryUnit <> memoryUnit.writeBackStage
|
writeBackStage.memoryUnit <> memoryUnit.writeBackStage
|
||||||
writeBackStage.ctrl.allow_to_go := ctrl.writeBackUnit.allow_to_go
|
writeBackStage.ctrl.allow_to_go := ctrl.writeBackUnit.allow_to_go
|
||||||
|
|
|
@ -6,6 +6,21 @@ import cpu.defines._
|
||||||
import cpu.defines.Const._
|
import cpu.defines.Const._
|
||||||
import cpu.CpuConfig
|
import cpu.CpuConfig
|
||||||
|
|
||||||
|
class DataMemoryAccess_DataMemory extends Bundle {
|
||||||
|
val in = Input(new Bundle {
|
||||||
|
val acc_err = Bool()
|
||||||
|
val rdata = UInt(DATA_WID.W)
|
||||||
|
})
|
||||||
|
val out = Output(new Bundle {
|
||||||
|
val en = Bool()
|
||||||
|
val rlen = UInt(AXI_LEN_WID.W)
|
||||||
|
val wen = Bool()
|
||||||
|
val wstrb = UInt(AXI_STRB_WID.W)
|
||||||
|
val addr = UInt(AXI_ADDR_WID.W)
|
||||||
|
val wdata = UInt(AXI_DATA_WID.W)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
class DataMemoryAccess(implicit val config: CpuConfig) extends Module {
|
class DataMemoryAccess(implicit val config: CpuConfig) extends Module {
|
||||||
val io = IO(new Bundle {
|
val io = IO(new Bundle {
|
||||||
val memoryUnit = new Bundle {
|
val memoryUnit = new Bundle {
|
||||||
|
@ -18,23 +33,12 @@ class DataMemoryAccess(implicit val config: CpuConfig) extends Module {
|
||||||
val ex = Vec(config.fuNum, new ExceptionInfo())
|
val ex = Vec(config.fuNum, new ExceptionInfo())
|
||||||
})
|
})
|
||||||
val out = Output(new Bundle {
|
val out = Output(new Bundle {
|
||||||
val rdata = Output(UInt(DATA_WID.W))
|
val acc_err = Bool()
|
||||||
|
val rdata = Output(UInt(DATA_WID.W))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
val dataMemory = new Bundle {
|
val dataMemory = new DataMemoryAccess_DataMemory()
|
||||||
val in = Input(new Bundle {
|
|
||||||
val rdata = UInt(DATA_WID.W)
|
|
||||||
})
|
|
||||||
val out = Output(new Bundle {
|
|
||||||
val en = Bool()
|
|
||||||
val rlen = UInt(AXI_LEN_WID.W)
|
|
||||||
val wen = Bool()
|
|
||||||
val wstrb = UInt(AXI_STRB_WID.W)
|
|
||||||
val addr = UInt(AXI_ADDR_WID.W)
|
|
||||||
val wdata = UInt(AXI_DATA_WID.W)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
val mem_addr = io.memoryUnit.in.mem_addr
|
val mem_addr = io.memoryUnit.in.mem_addr
|
||||||
val mem_addr2 = mem_addr(1, 0)
|
val mem_addr2 = mem_addr(1, 0)
|
||||||
|
@ -61,6 +65,7 @@ class DataMemoryAccess(implicit val config: CpuConfig) extends Module {
|
||||||
"b111".U -> mem_rdata(63, 56)
|
"b111".U -> mem_rdata(63, 56)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
io.memoryUnit.out.acc_err := io.dataMemory.in.acc_err
|
||||||
io.memoryUnit.out.rdata := MuxLookup(op, rdata(XLEN - 1, 0))(
|
io.memoryUnit.out.rdata := MuxLookup(op, rdata(XLEN - 1, 0))(
|
||||||
List(
|
List(
|
||||||
LSUOpType.lb -> SignedExtend(rdata(7, 0), XLEN),
|
LSUOpType.lb -> SignedExtend(rdata(7, 0), XLEN),
|
||||||
|
|
|
@ -20,19 +20,7 @@ class MemoryUnit(implicit val config: CpuConfig) extends Module {
|
||||||
val decoderUnit = Output(Vec(config.fuNum, new RegWrite()))
|
val decoderUnit = Output(Vec(config.fuNum, new RegWrite()))
|
||||||
val csr = Flipped(new CsrMemoryUnit())
|
val csr = Flipped(new CsrMemoryUnit())
|
||||||
val writeBackStage = Output(new MemoryUnitWriteBackUnit())
|
val writeBackStage = Output(new MemoryUnitWriteBackUnit())
|
||||||
val dataMemory = new Bundle {
|
val dataMemory = new DataMemoryAccess_DataMemory()
|
||||||
val in = Input(new Bundle {
|
|
||||||
val rdata = UInt(DATA_WID.W)
|
|
||||||
})
|
|
||||||
val out = Output(new Bundle {
|
|
||||||
val en = Bool()
|
|
||||||
val rlen = UInt(AXI_LEN_WID.W)
|
|
||||||
val wen = Bool()
|
|
||||||
val addr = UInt(AXI_ADDR_WID.W)
|
|
||||||
val wdata = UInt(AXI_DATA_WID.W)
|
|
||||||
val wstrb = UInt(AXI_STRB_WID.W)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
val dataMemoryAccess = Module(new DataMemoryAccess()).io
|
val dataMemoryAccess = Module(new DataMemoryAccess()).io
|
||||||
|
@ -43,6 +31,7 @@ class MemoryUnit(implicit val config: CpuConfig) extends Module {
|
||||||
dataMemoryAccess.memoryUnit.in.mem_sel := io.memoryStage.inst0.mem.sel
|
dataMemoryAccess.memoryUnit.in.mem_sel := io.memoryStage.inst0.mem.sel
|
||||||
dataMemoryAccess.memoryUnit.in.ex(0) := io.memoryStage.inst0.ex
|
dataMemoryAccess.memoryUnit.in.ex(0) := io.memoryStage.inst0.ex
|
||||||
dataMemoryAccess.memoryUnit.in.ex(1) := io.memoryStage.inst1.ex
|
dataMemoryAccess.memoryUnit.in.ex(1) := io.memoryStage.inst1.ex
|
||||||
|
dataMemoryAccess.dataMemory.in.acc_err := io.dataMemory.in.acc_err
|
||||||
dataMemoryAccess.dataMemory.in.rdata := io.dataMemory.in.rdata
|
dataMemoryAccess.dataMemory.in.rdata := io.dataMemory.in.rdata
|
||||||
io.dataMemory.out := dataMemoryAccess.dataMemory.out
|
io.dataMemory.out := dataMemoryAccess.dataMemory.out
|
||||||
|
|
||||||
|
@ -58,15 +47,21 @@ class MemoryUnit(implicit val config: CpuConfig) extends Module {
|
||||||
io.writeBackStage.inst0.rd_info.wdata := io.memoryStage.inst0.rd_info.wdata
|
io.writeBackStage.inst0.rd_info.wdata := io.memoryStage.inst0.rd_info.wdata
|
||||||
io.writeBackStage.inst0.rd_info.wdata(FuType.lsu) := dataMemoryAccess.memoryUnit.out.rdata
|
io.writeBackStage.inst0.rd_info.wdata(FuType.lsu) := dataMemoryAccess.memoryUnit.out.rdata
|
||||||
io.writeBackStage.inst0.ex := io.memoryStage.inst0.ex
|
io.writeBackStage.inst0.ex := io.memoryStage.inst0.ex
|
||||||
io.writeBackStage.inst0.ex.exception := io.memoryStage.inst0.ex.exception
|
io.writeBackStage.inst0.ex.exception(loadAccessFault) := io.memoryStage.inst0.mem.sel(0) &&
|
||||||
io.writeBackStage.inst0.commit := io.memoryStage.inst0.inst_info.valid
|
LSUOpType.isLoad(io.memoryStage.inst0.inst_info.op) && dataMemoryAccess.memoryUnit.out.acc_err
|
||||||
|
io.writeBackStage.inst0.ex.exception(storeAccessFault) := io.memoryStage.inst0.mem.sel(0) &&
|
||||||
|
LSUOpType.isStore(io.memoryStage.inst0.inst_info.op) && dataMemoryAccess.memoryUnit.out.acc_err
|
||||||
|
io.writeBackStage.inst0.commit := io.memoryStage.inst0.inst_info.valid
|
||||||
|
|
||||||
io.writeBackStage.inst1.pc := io.memoryStage.inst1.pc
|
io.writeBackStage.inst1.pc := io.memoryStage.inst1.pc
|
||||||
io.writeBackStage.inst1.inst_info := io.memoryStage.inst1.inst_info
|
io.writeBackStage.inst1.inst_info := io.memoryStage.inst1.inst_info
|
||||||
io.writeBackStage.inst1.rd_info.wdata := io.memoryStage.inst1.rd_info.wdata
|
io.writeBackStage.inst1.rd_info.wdata := io.memoryStage.inst1.rd_info.wdata
|
||||||
io.writeBackStage.inst1.rd_info.wdata(FuType.lsu) := dataMemoryAccess.memoryUnit.out.rdata
|
io.writeBackStage.inst1.rd_info.wdata(FuType.lsu) := dataMemoryAccess.memoryUnit.out.rdata
|
||||||
io.writeBackStage.inst1.ex := io.memoryStage.inst1.ex
|
io.writeBackStage.inst1.ex := io.memoryStage.inst1.ex
|
||||||
io.writeBackStage.inst1.ex.exception := io.memoryStage.inst1.ex.exception
|
io.writeBackStage.inst1.ex.exception(loadAccessFault) := io.memoryStage.inst0.mem.sel(1) &&
|
||||||
|
LSUOpType.isLoad(io.memoryStage.inst1.inst_info.op) && dataMemoryAccess.memoryUnit.out.acc_err
|
||||||
|
io.writeBackStage.inst1.ex.exception(storeAccessFault) := io.memoryStage.inst0.mem.sel(1) &&
|
||||||
|
LSUOpType.isStore(io.memoryStage.inst1.inst_info.op) && dataMemoryAccess.memoryUnit.out.acc_err
|
||||||
io.writeBackStage.inst1.commit := io.memoryStage.inst1.inst_info.valid &&
|
io.writeBackStage.inst1.commit := io.memoryStage.inst1.inst_info.valid &&
|
||||||
!(io.writeBackStage.inst0.ex.exception.asUInt.orR || io.writeBackStage.inst0.ex.interrupt.asUInt.orR)
|
!(io.writeBackStage.inst0.ex.exception.asUInt.orR || io.writeBackStage.inst0.ex.interrupt.asUInt.orR)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue