修改访存
This commit is contained in:
parent
d9b66b2468
commit
eecedc6659
|
@ -1,168 +1,96 @@
|
||||||
// package cpu.pipeline.memory
|
package cpu.pipeline.memory
|
||||||
|
|
||||||
// import chisel3._
|
import chisel3._
|
||||||
// import chisel3.util._
|
import chisel3.util._
|
||||||
// import cpu.defines._
|
import cpu.defines._
|
||||||
// import cpu.defines.Const._
|
import cpu.defines.Const._
|
||||||
// import cpu.CpuConfig
|
import cpu.CpuConfig
|
||||||
|
|
||||||
// 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 {
|
||||||
// val in = Input(new Bundle {
|
val in = Input(new Bundle {
|
||||||
// val mem_en = Bool()
|
val mem_en = Bool()
|
||||||
// val inst_info = new InstInfo()
|
val inst_info = new InstInfo()
|
||||||
// val mem_wdata = UInt(DATA_WID.W)
|
val mem_wdata = UInt(DATA_WID.W)
|
||||||
// val mem_addr = UInt(DATA_ADDR_WID.W)
|
val mem_addr = UInt(DATA_ADDR_WID.W)
|
||||||
// val mem_sel = Vec(config.fuNum, Bool())
|
val mem_sel = Vec(config.fuNum, Bool())
|
||||||
// val ex = Vec(config.fuNum, new ExceptionInfo())
|
val ex = Vec(config.fuNum, new ExceptionInfo())
|
||||||
// val llbit = Bool()
|
})
|
||||||
// })
|
val out = Output(new Bundle {
|
||||||
// val out = Output(new Bundle {
|
val rdata = Output(UInt(DATA_WID.W))
|
||||||
// val rdata = Output(UInt(DATA_WID.W))
|
})
|
||||||
// })
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
// val dataMemory = new Bundle {
|
val dataMemory = new Bundle {
|
||||||
// val in = Input(new Bundle {
|
val in = Input(new Bundle {
|
||||||
// val rdata = UInt(DATA_WID.W)
|
val rdata = UInt(DATA_WID.W)
|
||||||
// })
|
})
|
||||||
// val out = Output(new Bundle {
|
val out = Output(new Bundle {
|
||||||
// val en = Bool()
|
val en = Bool()
|
||||||
// val rlen = UInt(2.W)
|
val rlen = UInt(2.W)
|
||||||
// val wen = UInt(4.W)
|
val wen = UInt(4.W)
|
||||||
// val addr = UInt(DATA_ADDR_WID.W)
|
val addr = UInt(DATA_ADDR_WID.W)
|
||||||
// val wdata = UInt(DATA_WID.W)
|
val wdata = UInt(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)
|
||||||
// val mem_rdata = io.dataMemory.in.rdata
|
val mem_rdata = io.dataMemory.in.rdata
|
||||||
// val mem_wdata = io.memoryUnit.in.mem_wdata
|
val mem_wdata = io.memoryUnit.in.mem_wdata
|
||||||
// val op = io.memoryUnit.in.inst_info.op
|
val op = io.memoryUnit.in.inst_info.op
|
||||||
// io.dataMemory.out.en := io.memoryUnit.in.mem_en &&
|
io.dataMemory.out.en := io.memoryUnit.in.mem_en &&
|
||||||
// (io.memoryUnit.in.mem_sel(0) && !io.memoryUnit.in.ex(0).flush_req ||
|
(io.memoryUnit.in.mem_sel(0) && !io.memoryUnit.in.ex(0).flush_req ||
|
||||||
// io.memoryUnit.in.mem_sel(1) && !io.memoryUnit.in.ex(0).flush_req && !io.memoryUnit.in.ex(1).flush_req)
|
io.memoryUnit.in.mem_sel(1) && !io.memoryUnit.in.ex(0).flush_req && !io.memoryUnit.in.ex(1).flush_req)
|
||||||
// io.dataMemory.out.addr := mem_addr
|
io.dataMemory.out.addr := mem_addr
|
||||||
|
val rdata = Util.LookupTree(
|
||||||
// io.memoryUnit.out.rdata := MuxLookup(op, 0.U)(
|
mem_addr(2, 0),
|
||||||
// Seq(
|
List(
|
||||||
// EXE_LB -> MuxLookup(mem_addr2, 0.U)(
|
"b000".U -> mem_rdata(63, 0),
|
||||||
// Seq(
|
"b001".U -> mem_rdata(63, 8),
|
||||||
// "b11".U -> Util.signedExtend(mem_rdata(31, 24)),
|
"b010".U -> mem_rdata(63, 16),
|
||||||
// "b10".U -> Util.signedExtend(mem_rdata(23, 16)),
|
"b011".U -> mem_rdata(63, 24),
|
||||||
// "b01".U -> Util.signedExtend(mem_rdata(15, 8)),
|
"b100".U -> mem_rdata(63, 32),
|
||||||
// "b00".U -> Util.signedExtend(mem_rdata(7, 0))
|
"b101".U -> mem_rdata(63, 40),
|
||||||
// )
|
"b110".U -> mem_rdata(63, 48),
|
||||||
// ),
|
"b111".U -> mem_rdata(63, 56)
|
||||||
// EXE_LBU -> MuxLookup(mem_addr2, 0.U)(
|
)
|
||||||
// Seq(
|
)
|
||||||
// "b11".U -> Util.zeroExtend(mem_rdata(31, 24)),
|
io.memoryUnit.out.rdata := Util.LookupTree(
|
||||||
// "b10".U -> Util.zeroExtend(mem_rdata(23, 16)),
|
op,
|
||||||
// "b01".U -> Util.zeroExtend(mem_rdata(15, 8)),
|
List(
|
||||||
// "b00".U -> Util.zeroExtend(mem_rdata(7, 0))
|
LSUOpType.lb -> Util.signedExtend(rdata(7, 0), XLEN),
|
||||||
// )
|
LSUOpType.lh -> Util.signedExtend(rdata(15, 0), XLEN),
|
||||||
// ),
|
LSUOpType.lw -> Util.signedExtend(rdata(31, 0), XLEN),
|
||||||
// EXE_LH -> Mux(
|
LSUOpType.lbu -> Util.zeroExtend(rdata(7, 0), XLEN),
|
||||||
// mem_addr2(1),
|
LSUOpType.lhu -> Util.zeroExtend(rdata(15, 0), XLEN),
|
||||||
// Util.signedExtend(mem_rdata(31, 16)),
|
LSUOpType.lwu -> Util.zeroExtend(rdata(31, 0), XLEN)
|
||||||
// Util.signedExtend(mem_rdata(15, 0))
|
)
|
||||||
// ),
|
)
|
||||||
// EXE_LHU -> Mux(
|
def genWdata(data: UInt, sizeEncode: UInt): UInt = {
|
||||||
// mem_addr2(1),
|
Util.LookupTree(
|
||||||
// Util.zeroExtend(mem_rdata(31, 16)),
|
sizeEncode,
|
||||||
// Util.zeroExtend(mem_rdata(15, 0))
|
List(
|
||||||
// ),
|
"b00".U -> Fill(8, data(7, 0)),
|
||||||
// EXE_LW -> mem_rdata,
|
"b01".U -> Fill(4, data(15, 0)),
|
||||||
// EXE_LL -> mem_rdata,
|
"b10".U -> Fill(2, data(31, 0)),
|
||||||
// EXE_LWL -> MuxLookup(mem_addr2, 0.U)(
|
"b11".U -> data
|
||||||
// Seq(
|
)
|
||||||
// "b11".U -> mem_rdata,
|
)
|
||||||
// "b10".U -> Cat(mem_rdata(23, 0), mem_wdata(7, 0)),
|
}
|
||||||
// "b01".U -> Cat(mem_rdata(15, 0), mem_wdata(15, 0)),
|
io.dataMemory.out.wdata := genWdata(mem_wdata, op(1, 0))
|
||||||
// "b00".U -> Cat(mem_rdata(7, 0), mem_wdata(23, 0))
|
def genWmask(addr: UInt, sizeEncode: UInt): UInt = {
|
||||||
// )
|
Util.LookupTree(
|
||||||
// ),
|
sizeEncode,
|
||||||
// EXE_LWR -> MuxLookup(mem_addr2, 0.U)(
|
List(
|
||||||
// Seq(
|
"b00".U -> 0x1.U, //0001 << addr(2:0)
|
||||||
// "b11".U -> Cat(mem_wdata(31, 8), mem_rdata(31, 24)),
|
"b01".U -> 0x3.U, //0011
|
||||||
// "b10".U -> Cat(mem_wdata(31, 16), mem_rdata(31, 16)),
|
"b10".U -> 0xf.U, //1111
|
||||||
// "b01".U -> Cat(mem_wdata(31, 24), mem_rdata(31, 8)),
|
"b11".U -> 0xff.U //11111111
|
||||||
// "b00".U -> mem_rdata
|
)
|
||||||
// )
|
) << addr(2, 0)
|
||||||
// )
|
}
|
||||||
// )
|
io.dataMemory.out.wen := genWmask(mem_addr, op(1, 0))
|
||||||
// )
|
io.dataMemory.out.rlen := op(1, 0)
|
||||||
// io.dataMemory.out.wdata := MuxLookup(op, mem_wdata)( // default SW, SC
|
}
|
||||||
// Seq(
|
|
||||||
// EXE_SB -> Fill(4, mem_wdata(7, 0)),
|
|
||||||
// EXE_SH -> Fill(2, mem_wdata(15, 0)),
|
|
||||||
// EXE_SWL -> MuxLookup(mem_addr2, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// "b11".U -> mem_wdata,
|
|
||||||
// "b10".U -> Cat(0.U(8.W), mem_wdata(31, 8)),
|
|
||||||
// "b01".U -> Cat(0.U(16.W), mem_wdata(31, 16)),
|
|
||||||
// "b00".U -> Cat(0.U(24.W), mem_wdata(31, 24))
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// EXE_SWR -> MuxLookup(mem_addr2, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// "b11".U -> Cat(mem_wdata(7, 0), 0.U(24.W)),
|
|
||||||
// "b10".U -> Cat(mem_wdata(15, 0), 0.U(16.W)),
|
|
||||||
// "b01".U -> Cat(mem_wdata(23, 0), 0.U(8.W)),
|
|
||||||
// "b00".U -> mem_wdata
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// io.dataMemory.out.wen := MuxLookup(op, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// EXE_SB -> MuxLookup(mem_addr2, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// "b11".U -> "b1000".U,
|
|
||||||
// "b10".U -> "b0100".U,
|
|
||||||
// "b01".U -> "b0010".U,
|
|
||||||
// "b00".U -> "b0001".U
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// EXE_SH -> Mux(mem_addr2(1), "b1100".U, "b0011".U),
|
|
||||||
// EXE_SW -> "b1111".U,
|
|
||||||
// EXE_SC -> Fill(4, io.memoryUnit.in.llbit),
|
|
||||||
// EXE_SWL -> MuxLookup(mem_addr2, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// "b11".U -> "b1111".U,
|
|
||||||
// "b10".U -> "b0111".U,
|
|
||||||
// "b01".U -> "b0011".U,
|
|
||||||
// "b00".U -> "b0001".U
|
|
||||||
// )
|
|
||||||
// ),
|
|
||||||
// EXE_SWR -> MuxLookup(mem_addr2, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// "b11".U -> "b1000".U,
|
|
||||||
// "b10".U -> "b1100".U,
|
|
||||||
// "b01".U -> "b1110".U,
|
|
||||||
// "b00".U -> "b1111".U
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// io.dataMemory.out.rlen := MuxLookup(op, 0.U)(
|
|
||||||
// Seq(
|
|
||||||
// EXE_LW -> 2.U,
|
|
||||||
// EXE_LL -> 2.U,
|
|
||||||
// EXE_LH -> 1.U,
|
|
||||||
// EXE_LHU -> 1.U,
|
|
||||||
// EXE_LB -> 0.U,
|
|
||||||
// EXE_LBU -> 0.U,
|
|
||||||
// EXE_LWL -> 2.U,
|
|
||||||
// EXE_LWR -> 2.U,
|
|
||||||
// EXE_SW -> 2.U,
|
|
||||||
// EXE_SWL -> 2.U,
|
|
||||||
// EXE_SWR -> 2.U,
|
|
||||||
// EXE_SC -> 2.U,
|
|
||||||
// EXE_SH -> 1.U,
|
|
||||||
// EXE_SB -> 0.U
|
|
||||||
// )
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
|
|
|
@ -9,10 +9,11 @@ import cpu.pipeline.execute.Alu
|
||||||
import cpu.pipeline.execute.BranchCtrl
|
import cpu.pipeline.execute.BranchCtrl
|
||||||
import cpu.pipeline.execute.Fu
|
import cpu.pipeline.execute.Fu
|
||||||
import cpu.pipeline.execute.ExeAccessMemCtrl
|
import cpu.pipeline.execute.ExeAccessMemCtrl
|
||||||
|
import cpu.pipeline.memory.DataMemoryAccess
|
||||||
|
|
||||||
object TestMain extends App {
|
object TestMain extends App {
|
||||||
implicit val config = new CpuConfig()
|
implicit val config = new CpuConfig()
|
||||||
def top = new ExeAccessMemCtrl()
|
def top = new DataMemoryAccess()
|
||||||
val useMFC = false // use MLIR-based firrtl compiler
|
val useMFC = false // use MLIR-based firrtl compiler
|
||||||
val generator = Seq(chisel3.stage.ChiselGeneratorAnnotation(() => top))
|
val generator = Seq(chisel3.stage.ChiselGeneratorAnnotation(() => top))
|
||||||
if (useMFC) {
|
if (useMFC) {
|
||||||
|
|
Loading…
Reference in New Issue