merge multiplier and divider
This commit is contained in:
@ -17,8 +17,8 @@ class ioCtrlDpath extends Bundle()
|
||||
val sel_alu2 = UFix(OUTPUT, 3);
|
||||
val fn_dw = Bool(OUTPUT);
|
||||
val fn_alu = UFix(OUTPUT, SZ_ALU_FN);
|
||||
val mul_val = Bool(OUTPUT);
|
||||
val mul_kill = Bool(OUTPUT)
|
||||
val div_mul_val = Bool(OUTPUT)
|
||||
val div_mul_kill = Bool(OUTPUT)
|
||||
val div_val = Bool(OUTPUT);
|
||||
val div_kill = Bool(OUTPUT)
|
||||
val sel_wa = Bool(OUTPUT);
|
||||
@ -47,10 +47,7 @@ class ioCtrlDpath extends Bundle()
|
||||
val jalr_eq = Bool(INPUT)
|
||||
val ex_br_type = Bits(OUTPUT, SZ_BR)
|
||||
val ex_br_taken = Bool(INPUT)
|
||||
val div_rdy = Bool(INPUT);
|
||||
val div_result_val = Bool(INPUT);
|
||||
val mul_rdy = Bool(INPUT);
|
||||
val mul_result_val = Bool(INPUT);
|
||||
val div_mul_rdy = Bool(INPUT)
|
||||
val mem_ll_wb = Bool(INPUT)
|
||||
val mem_ll_waddr = UFix(INPUT, 5)
|
||||
val ex_waddr = UFix(INPUT, 5); // write addr from execute stage
|
||||
@ -359,8 +356,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
val ex_reg_flush_inst = Reg(resetVal = Bool(false))
|
||||
val ex_reg_jalr = Reg(resetVal = Bool(false))
|
||||
val ex_reg_btb_hit = Reg(resetVal = Bool(false))
|
||||
val ex_reg_div_val = Reg(resetVal = Bool(false))
|
||||
val ex_reg_mul_val = Reg(resetVal = Bool(false))
|
||||
val ex_reg_div_mul_val = Reg(resetVal = Bool(false))
|
||||
val ex_reg_mem_val = Reg(resetVal = Bool(false))
|
||||
val ex_reg_xcpt = Reg(resetVal = Bool(false))
|
||||
val ex_reg_fp_val = Reg(resetVal = Bool(false))
|
||||
@ -379,8 +375,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
val mem_reg_wen = Reg(resetVal = Bool(false))
|
||||
val mem_reg_fp_wen = Reg(resetVal = Bool(false))
|
||||
val mem_reg_flush_inst = Reg(resetVal = Bool(false))
|
||||
val mem_reg_div_val = Reg(resetVal = Bool(false))
|
||||
val mem_reg_mul_val = Reg(resetVal = Bool(false))
|
||||
val mem_reg_div_mul_val = Reg(resetVal = Bool(false))
|
||||
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))
|
||||
@ -479,8 +474,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
when (ctrl_killd) {
|
||||
ex_reg_jalr := Bool(false)
|
||||
ex_reg_btb_hit := Bool(false);
|
||||
ex_reg_div_val := Bool(false);
|
||||
ex_reg_mul_val := Bool(false);
|
||||
ex_reg_div_mul_val := Bool(false)
|
||||
ex_reg_mem_val := Bool(false);
|
||||
ex_reg_valid := Bool(false);
|
||||
ex_reg_wen := Bool(false);
|
||||
@ -499,8 +493,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
ex_reg_br_type := id_br_type;
|
||||
ex_reg_jalr := id_jalr
|
||||
ex_reg_btb_hit := io.imem.resp.bits.taken
|
||||
ex_reg_div_val := id_div_val
|
||||
ex_reg_mul_val := id_mul_val
|
||||
ex_reg_div_mul_val := id_mul_val || id_div_val
|
||||
ex_reg_mem_val := id_mem_val.toBool;
|
||||
ex_reg_valid := Bool(true)
|
||||
ex_reg_pcr := id_pcr
|
||||
@ -521,8 +514,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
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 ||
|
||||
ex_reg_mul_val && !io.dpath.mul_rdy ||
|
||||
ex_reg_div_mul_val && !io.dpath.div_mul_rdy ||
|
||||
mem_reg_replay_next
|
||||
ctrl_killx := take_pc_wb || replay_ex
|
||||
|
||||
@ -535,8 +527,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
mem_reg_replay := replay_ex && !take_pc_wb;
|
||||
mem_reg_xcpt_interrupt := ex_reg_xcpt_interrupt && !take_pc_wb
|
||||
when (ex_xcpt) { mem_reg_cause := ex_cause }
|
||||
mem_reg_div_val := ex_reg_div_val && io.dpath.div_rdy
|
||||
mem_reg_mul_val := ex_reg_mul_val && io.dpath.mul_rdy
|
||||
mem_reg_div_mul_val := ex_reg_div_mul_val && io.dpath.div_mul_rdy
|
||||
|
||||
when (ctrl_killx) {
|
||||
mem_reg_valid := Bool(false);
|
||||
@ -603,7 +594,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
wb_reg_eret := mem_reg_eret && !mem_reg_replay
|
||||
wb_reg_flush_inst := mem_reg_flush_inst;
|
||||
wb_reg_mem_val := mem_reg_mem_val
|
||||
wb_reg_div_mul_val := mem_reg_div_val || mem_reg_mul_val
|
||||
wb_reg_div_mul_val := mem_reg_div_mul_val
|
||||
wb_reg_fp_val := mem_reg_fp_val
|
||||
wb_reg_replay_next := mem_reg_replay_next
|
||||
}
|
||||
@ -674,7 +665,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
io.fpu.dec.ren2 && id_raddr2 === io.dpath.ex_waddr ||
|
||||
io.fpu.dec.ren3 && id_raddr3 === io.dpath.ex_waddr ||
|
||||
io.fpu.dec.wen && id_waddr === io.dpath.ex_waddr)
|
||||
val id_ex_hazard = data_hazard_ex && (ex_reg_mem_val || ex_reg_div_val || ex_reg_mul_val || ex_reg_fp_val) ||
|
||||
val id_ex_hazard = data_hazard_ex && (ex_reg_mem_val || ex_reg_div_mul_val || ex_reg_fp_val) ||
|
||||
fp_data_hazard_ex && (ex_reg_mem_val || ex_reg_fp_val)
|
||||
|
||||
// stall for RAW/WAW hazards on LB/LH and mul/div in memory stage.
|
||||
@ -691,7 +682,7 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
io.fpu.dec.ren2 && id_raddr2 === io.dpath.mem_waddr ||
|
||||
io.fpu.dec.ren3 && id_raddr3 === io.dpath.mem_waddr ||
|
||||
io.fpu.dec.wen && id_waddr === io.dpath.mem_waddr)
|
||||
val id_mem_hazard = data_hazard_mem && (mem_reg_mem_val && mem_mem_cmd_bh || mem_reg_div_val || mem_reg_mul_val || mem_reg_fp_val) ||
|
||||
val id_mem_hazard = data_hazard_mem && (mem_reg_mem_val && mem_mem_cmd_bh || mem_reg_div_mul_val || mem_reg_fp_val) ||
|
||||
fp_data_hazard_mem && mem_reg_fp_val
|
||||
id_load_use := mem_reg_mem_val && (data_hazard_mem || fp_data_hazard_mem)
|
||||
|
||||
@ -731,10 +722,8 @@ class Control(implicit conf: RocketConfiguration) extends Component
|
||||
io.dpath.sel_alu2 := id_sel_alu2.toUFix
|
||||
io.dpath.fn_dw := id_fn_dw.toBool;
|
||||
io.dpath.fn_alu := id_fn_alu.toUFix
|
||||
io.dpath.div_val := ex_reg_div_val
|
||||
io.dpath.div_kill := mem_reg_div_val && killm_common
|
||||
io.dpath.mul_val := ex_reg_mul_val
|
||||
io.dpath.mul_kill := mem_reg_mul_val && killm_common
|
||||
io.dpath.div_mul_val := ex_reg_div_mul_val
|
||||
io.dpath.div_mul_kill := mem_reg_div_mul_val && killm_common
|
||||
io.dpath.ex_fp_val:= ex_reg_fp_val;
|
||||
io.dpath.mem_fp_val:= mem_reg_fp_val;
|
||||
io.dpath.ex_jalr := ex_reg_jalr
|
||||
|
Reference in New Issue
Block a user