refactor: 将所有的地址宽度调为XLEN

This commit is contained in:
Liphen 2024-01-03 10:54:44 +08:00
parent 69e8b45484
commit f3d5b5cd1e
13 changed files with 35 additions and 41 deletions

View File

@ -45,7 +45,7 @@ import cpu.defines.Const._
class WriteBufferUnit extends Bundle { class WriteBufferUnit extends Bundle {
val data = UInt(XLEN.W) val data = UInt(XLEN.W)
val addr = UInt(DATA_ADDR_WID.W) val addr = UInt(XLEN.W)
val strb = UInt(AXI_STRB_WID.W) val strb = UInt(AXI_STRB_WID.W)
val size = UInt(AXI_SIZE_WID.W) val size = UInt(AXI_SIZE_WID.W)
} }

View File

@ -204,7 +204,7 @@ class ICache(cacheConfig: CacheConfig)(implicit config: CpuConfig) extends Modul
rready <> io.axi.r.ready rready <> io.axi.r.ready
val acc_err = RegInit(false.B) val acc_err = RegInit(false.B)
val addr_err = io.cpu.addr(use_next_addr)(XLEN - 1, PADDR_WID).orR val addr_err = io.cpu.addr(use_next_addr)(XLEN - 1, VADDR_WID).orR
when(acc_err) { acc_err := false.B } when(acc_err) { acc_err := false.B }
io.cpu.acc_err := acc_err //TODO实现cached段中的访存错误 io.cpu.acc_err := acc_err //TODO实现cached段中的访存错误

View File

@ -9,7 +9,7 @@ import cpu.CacheConfig
class DTlbL1 extends Module { class DTlbL1 extends Module {
val io = IO(new Bundle { val io = IO(new Bundle {
val cache = new Tlb_DCache() val cache = new Tlb_DCache()
val addr = Input(UInt(DATA_ADDR_WID.W)) val addr = Input(UInt(XLEN.W))
}) })
val cacheConfig = CacheConfig("dcache") val cacheConfig = CacheConfig("dcache")

View File

@ -109,7 +109,7 @@ class Cache_ICache(implicit val config: CpuConfig) extends Bundle {
// read inst request from cpu // read inst request from cpu
val req = Output(Bool()) val req = Output(Bool())
val complete_single_request = Output(Bool()) // !cpu_stall val complete_single_request = Output(Bool()) // !cpu_stall
val addr = Output(Vec(config.instFetchNum, UInt(INST_ADDR_WID.W))) // virtual address and next virtual address val addr = Output(Vec(config.instFetchNum, UInt(XLEN.W))) // virtual address and next virtual address
val fence_i = Output(Bool()) val fence_i = Output(Bool())
val dcache_stall = Output(Bool()) // dcache_stall val dcache_stall = Output(Bool()) // dcache_stall
@ -125,8 +125,8 @@ class Cache_ICache(implicit val config: CpuConfig) extends Bundle {
// cpu to dcache // cpu to dcache
class Cache_DCache extends Bundle { class Cache_DCache extends Bundle {
val exe_addr = Output(UInt(DATA_ADDR_WID.W)) val exe_addr = Output(UInt(XLEN.W))
val addr = Output(UInt(DATA_ADDR_WID.W)) val addr = Output(UInt(XLEN.W))
val rlen = Output(UInt(AXI_LEN_WID.W)) val rlen = Output(UInt(AXI_LEN_WID.W))
val en = Output(Bool()) val en = Output(Bool())
val wen = Output(Bool()) val wen = Output(Bool())

View File

@ -7,7 +7,7 @@ import cpu.CpuConfig
trait CoreParameter { trait CoreParameter {
def config = new CpuConfig def config = new CpuConfig
val XLEN = if (config.isRV32) 32 else 64 val XLEN = if (config.isRV32) 32 else 64
val VADDR_WID = 32 val VADDR_WID = if (config.isRV32) 32 else 39
val PADDR_WID = 32 val PADDR_WID = 32
} }
@ -20,17 +20,13 @@ trait Constants extends CoreParameter {
// inst rom // inst rom
val INST_WID = 32 val INST_WID = 32
val INST_ADDR_WID = XLEN
// data ram
val DATA_ADDR_WID = XLEN
// GPR RegFile // GPR RegFile
val AREG_NUM = 32 val AREG_NUM = 32
val REG_ADDR_WID = 5 val REG_ADDR_WID = 5
} }
trait AXIConst { trait AXIConst extends Constants {
// AXI // AXI
val BURST_FIXED = 0 val BURST_FIXED = 0
val BURST_INCR = 1 val BURST_INCR = 1
@ -43,7 +39,7 @@ trait AXIConst {
val RESP_DECERR = 3 val RESP_DECERR = 3
val AXI_ID_WID = 4 val AXI_ID_WID = 4
val AXI_ADDR_WID = 32 val AXI_ADDR_WID = PADDR_WID // 32
val AXI_DATA_WID = 64 val AXI_DATA_WID = 64
val AXI_STRB_WID = 8 val AXI_STRB_WID = 8
val AXI_RESP_WID = 2 val AXI_RESP_WID = 2

View File

@ -32,8 +32,8 @@ class DecoderBranchPredictorUnit extends Bundle {
val pht_index = Output(UInt(bpuConfig.phtDepth.W)) val pht_index = Output(UInt(bpuConfig.phtDepth.W))
val branch_inst = Input(Bool()) val branch_inst = Input(Bool())
val pred_branch = Input(Bool()) val branch = Input(Bool())
val branch_target = Input(UInt(XLEN.W)) val target = Input(UInt(XLEN.W))
val update_pht_index = Input(UInt(bpuConfig.phtDepth.W)) val update_pht_index = Input(UInt(bpuConfig.phtDepth.W))
} }
@ -89,10 +89,10 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
jumpCtrl.in.pc := pc(0) jumpCtrl.in.pc := pc(0)
jumpCtrl.in.src_info := io.executeStage.inst0.src_info jumpCtrl.in.src_info := io.executeStage.inst0.src_info
val inst0_branch = jumpCtrl.out.jump || io.bpu.pred_branch val inst0_branch = jumpCtrl.out.jump || io.bpu.branch
io.fetchUnit.branch := inst0_branch && io.ctrl.allow_to_go io.fetchUnit.branch := inst0_branch && io.ctrl.allow_to_go
io.fetchUnit.target := Mux(io.bpu.pred_branch, io.bpu.branch_target, jumpCtrl.out.jump_target) io.fetchUnit.target := Mux(io.bpu.branch, io.bpu.target, jumpCtrl.out.jump_target)
io.instFifo.allow_to_go(0) := io.ctrl.allow_to_go io.instFifo.allow_to_go(0) := io.ctrl.allow_to_go
io.bpu.pc := pc(0) io.bpu.pc := pc(0)
@ -108,7 +108,7 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
io.executeStage.inst0.pc := pc(0) io.executeStage.inst0.pc := pc(0)
io.executeStage.inst0.info := info(0) io.executeStage.inst0.info := info(0)
io.executeStage.inst0.src_info.src1_data := MuxCase( io.executeStage.inst0.src_info.src1_data := MuxCase(
SignedExtend(pc(0), INST_ADDR_WID), SignedExtend(pc(0), XLEN),
Seq( Seq(
info(0).src1_ren -> forwardCtrl.out.inst(0).src1.rdata, info(0).src1_ren -> forwardCtrl.out.inst(0).src1.rdata,
(info(0).inst(6, 0) === "b0110111".U) -> 0.U (info(0).inst(6, 0) === "b0110111".U) -> 0.U
@ -144,14 +144,14 @@ class DecoderUnit(implicit val config: CpuConfig) extends Module with HasExcepti
io.executeStage.inst0.jb_info.jump_regiser := jumpCtrl.out.jump_register io.executeStage.inst0.jb_info.jump_regiser := jumpCtrl.out.jump_register
io.executeStage.inst0.jb_info.branch_inst := io.bpu.branch_inst io.executeStage.inst0.jb_info.branch_inst := io.bpu.branch_inst
io.executeStage.inst0.jb_info.pred_branch := io.bpu.pred_branch io.executeStage.inst0.jb_info.pred_branch := io.bpu.branch
io.executeStage.inst0.jb_info.branch_target := io.bpu.branch_target io.executeStage.inst0.jb_info.branch_target := io.bpu.target
io.executeStage.inst0.jb_info.update_pht_index := io.bpu.update_pht_index io.executeStage.inst0.jb_info.update_pht_index := io.bpu.update_pht_index
io.executeStage.inst1.pc := pc(1) io.executeStage.inst1.pc := pc(1)
io.executeStage.inst1.info := info(1) io.executeStage.inst1.info := info(1)
io.executeStage.inst1.src_info.src1_data := MuxCase( io.executeStage.inst1.src_info.src1_data := MuxCase(
SignedExtend(pc(1), INST_ADDR_WID), SignedExtend(pc(1), XLEN),
Seq( Seq(
info(1).src1_ren -> forwardCtrl.out.inst(1).src1.rdata, info(1).src1_ren -> forwardCtrl.out.inst(1).src1.rdata,
(info(1).inst(6, 0) === "b0110111".U) -> 0.U (info(1).inst(6, 0) === "b0110111".U) -> 0.U

View File

@ -16,7 +16,6 @@ class JumpCtrl(implicit val config: CpuConfig) extends Module {
val forward = Vec(config.commitNum, new DataForwardToDecoderUnit()) val forward = Vec(config.commitNum, new DataForwardToDecoderUnit())
}) })
val out = Output(new Bundle { val out = Output(new Bundle {
val jump_inst = Bool()
val jump_register = Bool() val jump_register = Bool()
val jump = Bool() val jump = Bool()
val jump_target = UInt(XLEN.W) val jump_target = UInt(XLEN.W)
@ -28,7 +27,6 @@ class JumpCtrl(implicit val config: CpuConfig) extends Module {
val fusel = io.in.info.fusel val fusel = io.in.info.fusel
val jump_inst = VecInit(BRUOpType.jal).contains(op) && fusel === FuType.bru val jump_inst = VecInit(BRUOpType.jal).contains(op) && fusel === FuType.bru
val jump_register_inst = VecInit(BRUOpType.jalr).contains(op) && fusel === FuType.bru val jump_register_inst = VecInit(BRUOpType.jalr).contains(op) && fusel === FuType.bru
io.out.jump_inst := jump_inst || jump_register_inst
io.out.jump := (jump_inst || jump_register_inst && !io.out.jump_register) && valid io.out.jump := (jump_inst || jump_register_inst && !io.out.jump_register) && valid
if (config.decoderNum == 2) { if (config.decoderNum == 2) {
io.out.jump_register := jump_register_inst && io.in.info.src1_raddr.orR && io.out.jump_register := jump_register_inst && io.in.info.src1_raddr.orR &&

View File

@ -32,7 +32,7 @@ class ExecuteUnit(implicit val config: CpuConfig) extends Module {
} }
val memoryStage = Output(new ExecuteUnitMemoryUnit()) val memoryStage = Output(new ExecuteUnitMemoryUnit())
val dataMemory = new Bundle { val dataMemory = new Bundle {
val addr = Output(UInt(DATA_ADDR_WID.W)) val addr = Output(UInt(XLEN.W))
} }
}) })

View File

@ -23,7 +23,7 @@ class Fu(implicit val config: CpuConfig) extends Module {
) )
val stall_req = Output(Bool()) val stall_req = Output(Bool())
val dataMemory = new Bundle { val dataMemory = new Bundle {
val addr = Output(UInt(DATA_ADDR_WID.W)) val addr = Output(UInt(XLEN.W))
} }
val branch = new Bundle { val branch = new Bundle {
val pred_branch = Input(Bool()) val pred_branch = Input(Bool())

View File

@ -15,14 +15,14 @@ class CsrMemoryUnit(implicit val config: CpuConfig) extends Bundle {
val set_lr = Bool() val set_lr = Bool()
val set_lr_val = Bool() val set_lr_val = Bool()
val set_lr_addr = UInt(DATA_ADDR_WID.W) val set_lr_addr = UInt(XLEN.W)
}) })
val out = Output(new Bundle { val out = Output(new Bundle {
val flush = Bool() val flush = Bool()
val target = UInt(XLEN.W) val target = UInt(XLEN.W)
val lr = Bool() val lr = Bool()
val lr_addr = UInt(DATA_ADDR_WID.W) val lr_addr = UInt(XLEN.W)
}) })
} }
@ -147,9 +147,9 @@ class Csr(implicit val config: CpuConfig) extends Module with HasCSRConst {
// Atom LR/SC Control Bits // Atom LR/SC Control Bits
val set_lr = WireInit(Bool(), false.B) val set_lr = WireInit(Bool(), false.B)
val set_lr_val = WireInit(Bool(), false.B) val set_lr_val = WireInit(Bool(), false.B)
val set_lr_addr = WireInit(UInt(DATA_ADDR_WID.W), 0.U) val set_lr_addr = WireInit(UInt(XLEN.W), 0.U)
val lr = RegInit(Bool(), false.B) val lr = RegInit(Bool(), false.B)
val lr_addr = RegInit(UInt(DATA_ADDR_WID.W), 0.U) val lr_addr = RegInit(UInt(XLEN.W), 0.U)
set_lr := io.memoryUnit.in.set_lr set_lr := io.memoryUnit.in.set_lr
set_lr_val := io.memoryUnit.in.set_lr_val set_lr_val := io.memoryUnit.in.set_lr_val
set_lr_addr := io.memoryUnit.in.set_lr_addr set_lr_addr := io.memoryUnit.in.set_lr_addr

View File

@ -62,7 +62,7 @@ class GlobalBranchPredictor(
io.decoder.branch_inst := io.decoder.info.valid && io.decoder.branch_inst := io.decoder.info.valid &&
FuType.bru === io.decoder.info.fusel && BRUOpType.isBranch(io.decoder.info.op) FuType.bru === io.decoder.info.fusel && BRUOpType.isBranch(io.decoder.info.op)
io.decoder.branch_target := io.decoder.pc + imm io.decoder.target := io.decoder.pc + imm
// 局部预测模式 // 局部预测模式
val bht = RegInit(VecInit(Seq.fill(1 << BHT_DEPTH)(0.U(PHT_DEPTH.W)))) val bht = RegInit(VecInit(Seq.fill(1 << BHT_DEPTH)(0.U(PHT_DEPTH.W))))
@ -70,7 +70,7 @@ class GlobalBranchPredictor(
val bht_index = io.decoder.pc(1 + BHT_DEPTH, 2) val bht_index = io.decoder.pc(1 + BHT_DEPTH, 2)
val pht_index = bht(bht_index) val pht_index = bht(bht_index)
io.decoder.pred_branch := io.decoder.branch :=
io.decoder.branch_inst && (pht(pht_index) === weakly_taken || pht(pht_index) === strongly_taken) io.decoder.branch_inst && (pht(pht_index) === weakly_taken || pht(pht_index) === strongly_taken)
val update_bht_index = io.execute.pc(1 + BHT_DEPTH, 2) val update_bht_index = io.execute.pc(1 + BHT_DEPTH, 2)
val update_pht_index = bht(update_bht_index) val update_pht_index = bht(update_bht_index)
@ -111,7 +111,7 @@ class AdaptiveTwoLevelPredictor(
io.decoder.branch_inst := io.decoder.info.valid && io.decoder.branch_inst := io.decoder.info.valid &&
FuType.bru === io.decoder.info.fusel && BRUOpType.isBranch(io.decoder.info.op) FuType.bru === io.decoder.info.fusel && BRUOpType.isBranch(io.decoder.info.op)
io.decoder.branch_target := io.decoder.pc + imm io.decoder.target := io.decoder.pc + imm
val bht = RegInit(VecInit(Seq.fill(1 << BHT_DEPTH)(0.U(PHT_DEPTH.W)))) val bht = RegInit(VecInit(Seq.fill(1 << BHT_DEPTH)(0.U(PHT_DEPTH.W))))
val pht = RegInit(VecInit(Seq.fill(1 << PHT_DEPTH)(strongly_taken))) val pht = RegInit(VecInit(Seq.fill(1 << PHT_DEPTH)(strongly_taken)))
@ -121,7 +121,7 @@ class AdaptiveTwoLevelPredictor(
io.instBuffer.pht_index(i) := bht(io.instBuffer.pc(i)(1 + BHT_DEPTH, 2)) io.instBuffer.pht_index(i) := bht(io.instBuffer.pc(i)(1 + BHT_DEPTH, 2))
} }
io.decoder.pred_branch := io.decoder.branch :=
io.decoder.branch_inst && (pht(pht_index) === weakly_taken || pht(pht_index) === strongly_taken) io.decoder.branch_inst && (pht(pht_index) === weakly_taken || pht(pht_index) === strongly_taken)
io.decoder.update_pht_index := bht(io.decoder.pc(1 + BHT_DEPTH, 2)) io.decoder.update_pht_index := bht(io.decoder.pc(1 + BHT_DEPTH, 2))

View File

@ -18,7 +18,7 @@ class Lsu_DataMemory extends Bundle {
val rlen = UInt(AXI_LEN_WID.W) val rlen = UInt(AXI_LEN_WID.W)
val wen = Bool() val wen = Bool()
val wstrb = UInt(AXI_STRB_WID.W) val wstrb = UInt(AXI_STRB_WID.W)
val addr = UInt(DATA_ADDR_WID.W) val addr = UInt(XLEN.W)
val wdata = UInt(XLEN.W) val wdata = UInt(XLEN.W)
}) })
} }
@ -31,7 +31,7 @@ class Lsu_MemoryUnit extends Bundle {
val ex = new ExceptionInfo() val ex = new ExceptionInfo()
val lr = Bool() val lr = Bool()
val lr_addr = UInt(DATA_ADDR_WID.W) val lr_addr = UInt(XLEN.W)
val allow_to_go = Bool() val allow_to_go = Bool()
}) })
@ -44,7 +44,7 @@ class Lsu_MemoryUnit extends Bundle {
val set_lr = Bool() val set_lr = Bool()
val set_lr_val = Bool() val set_lr_val = Bool()
val set_lr_addr = UInt(DATA_ADDR_WID.W) val set_lr_addr = UInt(XLEN.W)
}) })
} }
@ -81,9 +81,9 @@ class Lsu(implicit val config: CpuConfig) extends Module {
// Atom LR/SC Control Bits // Atom LR/SC Control Bits
val setLr = Wire(Bool()) val setLr = Wire(Bool())
val setLrVal = Wire(Bool()) val setLrVal = Wire(Bool())
val setLrAddr = Wire(UInt(DATA_ADDR_WID.W)) val setLrAddr = Wire(UInt(XLEN.W))
val lr = WireInit(Bool(), false.B) val lr = WireInit(Bool(), false.B)
val lrAddr = WireInit(UInt(DATA_ADDR_WID.W), DontCare) val lrAddr = WireInit(UInt(XLEN.W), DontCare)
io.memoryUnit.out.set_lr := setLr io.memoryUnit.out.set_lr := setLr
io.memoryUnit.out.set_lr_val := setLrVal io.memoryUnit.out.set_lr_val := setLrVal
io.memoryUnit.out.set_lr_addr := setLrAddr io.memoryUnit.out.set_lr_addr := setLrAddr

View File

@ -11,7 +11,7 @@ class LsExecute extends Module {
val dataMemory = new Lsu_DataMemory() val dataMemory = new Lsu_DataMemory()
val in = Input(new Bundle { val in = Input(new Bundle {
val mem_en = Bool() val mem_en = Bool()
val mem_addr = UInt(DATA_ADDR_WID.W) val mem_addr = UInt(XLEN.W)
val wdata = UInt(XLEN.W) val wdata = UInt(XLEN.W)
val info = new InstInfo() val info = new InstInfo()
}) })