clock gate integer datapath more aggressively
This commit is contained in:
@ -385,6 +385,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
val mem_reg_mem_val = Reg(resetVal = Bool(false))
|
||||
val mem_reg_xcpt = Reg(resetVal = Bool(false))
|
||||
val mem_reg_fp_val = Reg(resetVal = Bool(false))
|
||||
val mem_reg_vec_val = Reg(resetVal = Bool(false))
|
||||
val mem_reg_replay = Reg(resetVal = Bool(false))
|
||||
val mem_reg_replay_next = Reg(resetVal = Bool(false))
|
||||
val mem_reg_pcr = Reg(resetVal = PCR_N)
|
||||
@ -507,7 +508,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
ex_reg_mem_val := id_mem_val.toBool;
|
||||
ex_reg_valid := Bool(true)
|
||||
ex_reg_pcr := id_pcr
|
||||
ex_reg_wen := id_wen
|
||||
ex_reg_wen := id_wen && id_waddr != UFix(0)
|
||||
ex_reg_fp_wen := id_fp_val && io.fpu.dec.wen
|
||||
ex_reg_eret := id_eret.toBool;
|
||||
ex_reg_flush_inst := id_fence_i
|
||||
@ -521,7 +522,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
}
|
||||
|
||||
// replay inst in ex stage
|
||||
val wb_dcache_miss = wb_reg_mem_val && (wb_reg_wen || wb_reg_fp_wen) && !io.dmem.resp.valid
|
||||
val wb_dcache_miss = wb_reg_mem_val && !io.dmem.resp.valid
|
||||
val replay_ex = wb_dcache_miss && ex_reg_load_use || mem_reg_flush_inst ||
|
||||
ex_reg_mem_val && !io.dmem.req.ready ||
|
||||
ex_reg_div_val && !io.dpath.div_rdy ||
|
||||
@ -549,8 +550,9 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
mem_reg_eret := Bool(false);
|
||||
mem_reg_mem_val := Bool(false);
|
||||
mem_reg_flush_inst := Bool(false);
|
||||
mem_reg_fp_val := Bool(false);
|
||||
mem_reg_replay_next := Bool(false)
|
||||
mem_reg_fp_val := Bool(false)
|
||||
mem_reg_vec_val := Bool(false)
|
||||
mem_reg_replay_next := Bool(false)
|
||||
mem_reg_xcpt := Bool(false)
|
||||
}
|
||||
.otherwise {
|
||||
@ -561,9 +563,10 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
mem_reg_eret := ex_reg_eret;
|
||||
mem_reg_mem_val := ex_reg_mem_val;
|
||||
mem_reg_flush_inst := ex_reg_flush_inst;
|
||||
mem_reg_fp_val := ex_reg_fp_val
|
||||
mem_reg_replay_next := ex_reg_replay_next
|
||||
mem_reg_mem_type := ex_reg_mem_type
|
||||
mem_reg_fp_val := ex_reg_fp_val
|
||||
mem_reg_vec_val := ex_reg_vec_val
|
||||
mem_reg_replay_next := ex_reg_replay_next
|
||||
mem_reg_mem_type := ex_reg_mem_type
|
||||
mem_reg_xcpt := ex_xcpt
|
||||
}
|
||||
|
||||
@ -575,7 +578,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
(mem_reg_mem_val && io.dmem.xcpt.pf.st, UFix(11))))
|
||||
|
||||
val fpu_kill_mem = mem_reg_fp_val && io.fpu.nack_mem
|
||||
val ll_wb_kill_mem = io.dpath.mem_ll_wb && (mem_reg_wen || mem_reg_fp_wen)
|
||||
val ll_wb_kill_mem = io.dpath.mem_ll_wb && (mem_reg_wen || mem_reg_fp_wen || mem_reg_vec_val || mem_reg_pcr != PCR_N)
|
||||
val replay_mem = ll_wb_kill_mem || mem_reg_replay || fpu_kill_mem
|
||||
val killm_common = ll_wb_kill_mem || take_pc_wb || mem_reg_xcpt || !mem_reg_valid
|
||||
ctrl_killm := killm_common || mem_xcpt || fpu_kill_mem
|
||||
@ -628,12 +631,12 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
}
|
||||
|
||||
val sboard = new Scoreboard
|
||||
sboard.set(wb_reg_div_mul_val || wb_dcache_miss && io.dpath.wb_wen, io.dpath.wb_waddr)
|
||||
sboard.set((wb_reg_div_mul_val || wb_dcache_miss) && io.dpath.wb_wen, io.dpath.wb_waddr)
|
||||
sboard.clear(io.dpath.mem_ll_wb, io.dpath.mem_ll_waddr)
|
||||
|
||||
val id_stall_fpu = if (HAVE_FPU) {
|
||||
val fp_sboard = new Scoreboard
|
||||
fp_sboard.set(wb_dcache_miss && wb_reg_fp_wen && !replay_wb || io.fpu.sboard_set, io.dpath.wb_waddr)
|
||||
fp_sboard.set((wb_dcache_miss && wb_reg_fp_wen || io.fpu.sboard_set) && !replay_wb, io.dpath.wb_waddr)
|
||||
fp_sboard.clear(io.dpath.fp_sboard_clr, io.dpath.fp_sboard_clra)
|
||||
fp_sboard.clear(io.fpu.sboard_clr, io.fpu.sboard_clra)
|
||||
|
||||
@ -725,7 +728,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
io.imem.invalidate := wb_reg_flush_inst
|
||||
|
||||
io.dpath.mem_load := mem_reg_mem_val && mem_reg_wen
|
||||
io.dpath.wb_load := wb_reg_mem_val && io.dpath.wb_wen
|
||||
io.dpath.wb_load := wb_reg_mem_val && wb_reg_wen
|
||||
io.dpath.ren2 := id_renx2.toBool;
|
||||
io.dpath.ren1 := id_renx1.toBool;
|
||||
io.dpath.sel_alu2 := id_sel_alu2.toUFix
|
||||
|
Reference in New Issue
Block a user