two bug fixes to fpu
This commit is contained in:
parent
a09e8d1c55
commit
c7c35322c2
@ -67,6 +67,7 @@ class ioCtrlDpath extends Bundle()
|
|||||||
val sboard_clra = UFix(5, INPUT);
|
val sboard_clra = UFix(5, INPUT);
|
||||||
val fp_sboard_clr = Bool(INPUT);
|
val fp_sboard_clr = Bool(INPUT);
|
||||||
val fp_sboard_clra = UFix(5, INPUT);
|
val fp_sboard_clra = UFix(5, INPUT);
|
||||||
|
val fp_sboard_wb_waddr = UFix(5, INPUT);
|
||||||
val irq_timer = Bool(INPUT);
|
val irq_timer = Bool(INPUT);
|
||||||
val irq_ipi = Bool(INPUT);
|
val irq_ipi = Bool(INPUT);
|
||||||
}
|
}
|
||||||
@ -639,7 +640,8 @@ class rocketCtrl extends Component
|
|||||||
|
|
||||||
fp_sboard.io.w(0).en := wb_reg_dcache_miss && wb_reg_fp_wen || wb_reg_fp_sboard_set
|
fp_sboard.io.w(0).en := wb_reg_dcache_miss && wb_reg_fp_wen || wb_reg_fp_sboard_set
|
||||||
fp_sboard.io.w(0).data := Bool(true)
|
fp_sboard.io.w(0).data := Bool(true)
|
||||||
fp_sboard.io.w(0).addr := io.dpath.wb_waddr
|
//fp_sboard.io.w(0).addr := io.dpath.wb_waddr
|
||||||
|
fp_sboard.io.w(0).addr := io.dpath.fp_sboard_wb_waddr
|
||||||
|
|
||||||
fp_sboard.io.w(1).en := io.dpath.fp_sboard_clr
|
fp_sboard.io.w(1).en := io.dpath.fp_sboard_clr
|
||||||
fp_sboard.io.w(1).data := Bool(false)
|
fp_sboard.io.w(1).data := Bool(false)
|
||||||
@ -698,7 +700,7 @@ class rocketCtrl extends Component
|
|||||||
// replay mem stage PC on a DTLB miss or a long-latency writeback
|
// replay mem stage PC on a DTLB miss or a long-latency writeback
|
||||||
val mem_ll_wb = io.dpath.mem_wb || io.dpath.mul_result_val || io.dpath.div_result_val
|
val mem_ll_wb = io.dpath.mem_wb || io.dpath.mul_result_val || io.dpath.div_result_val
|
||||||
val dmem_kill_mem = mem_reg_valid && (io.dtlb_miss || io.dmem.resp_nack)
|
val dmem_kill_mem = mem_reg_valid && (io.dtlb_miss || io.dmem.resp_nack)
|
||||||
val replay_mem = dmem_kill_mem || mem_reg_wen && mem_ll_wb || mem_reg_replay
|
val replay_mem = dmem_kill_mem || mem_reg_wen && mem_ll_wb || mem_reg_replay || mem_reg_fp_val && io.fpu.nack_mem
|
||||||
val kill_mem = dmem_kill_mem || mem_reg_wen && mem_ll_wb || take_pc_wb || mem_exception || mem_reg_kill
|
val kill_mem = dmem_kill_mem || mem_reg_wen && mem_ll_wb || take_pc_wb || mem_exception || mem_reg_kill
|
||||||
val kill_dcache = io.dtlb_miss || mem_reg_wen && mem_ll_wb || take_pc_wb || mem_exception || mem_reg_kill
|
val kill_dcache = io.dtlb_miss || mem_reg_wen && mem_ll_wb || take_pc_wb || mem_exception || mem_reg_kill
|
||||||
|
|
||||||
|
@ -423,6 +423,10 @@ class rocketDpath extends Component
|
|||||||
io.ctrl.fp_sboard_clr := r_dmem_fp_replay
|
io.ctrl.fp_sboard_clr := r_dmem_fp_replay
|
||||||
io.ctrl.fp_sboard_clra := r_dmem_resp_waddr
|
io.ctrl.fp_sboard_clra := r_dmem_resp_waddr
|
||||||
|
|
||||||
|
val r_mem_reg_waddr = Reg(){UFix(width = 5)}
|
||||||
|
r_mem_reg_waddr := mem_reg_waddr
|
||||||
|
io.ctrl.fp_sboard_wb_waddr := r_mem_reg_waddr
|
||||||
|
|
||||||
// processor control regfile write
|
// processor control regfile write
|
||||||
pcr.io.w.addr := wb_reg_raddr1
|
pcr.io.w.addr := wb_reg_raddr1
|
||||||
pcr.io.w.en := io.ctrl.pcr === PCR_T || io.ctrl.pcr === PCR_S || io.ctrl.pcr === PCR_C
|
pcr.io.w.en := io.ctrl.pcr === PCR_T || io.ctrl.pcr === PCR_S || io.ctrl.pcr === PCR_C
|
||||||
|
@ -171,6 +171,7 @@ class ioDpathFPU extends Bundle {
|
|||||||
class ioCtrlFPU extends Bundle {
|
class ioCtrlFPU extends Bundle {
|
||||||
val valid = Bool(OUTPUT)
|
val valid = Bool(OUTPUT)
|
||||||
val nack = Bool(INPUT)
|
val nack = Bool(INPUT)
|
||||||
|
val nack_mem = Bool(INPUT)
|
||||||
val illegal_rm = Bool(INPUT)
|
val illegal_rm = Bool(INPUT)
|
||||||
val killx = Bool(OUTPUT)
|
val killx = Bool(OUTPUT)
|
||||||
val killm = Bool(OUTPUT)
|
val killm = Bool(OUTPUT)
|
||||||
@ -637,6 +638,7 @@ class rocketFPU(sfma_latency: Int, dfma_latency: Int) extends Component
|
|||||||
val fsr_busy = ctrl.rdfsr && fp_inflight || mem_reg_valid && mem_ctrl.wrfsr || wb_reg_valid && wb_ctrl.wrfsr
|
val fsr_busy = ctrl.rdfsr && fp_inflight || mem_reg_valid && mem_ctrl.wrfsr || wb_reg_valid && wb_ctrl.wrfsr
|
||||||
val units_busy = mem_reg_valid && mem_ctrl.fma && (io.sfma.valid && mem_ctrl.single || io.dfma.valid && !mem_ctrl.single)
|
val units_busy = mem_reg_valid && mem_ctrl.fma && (io.sfma.valid && mem_ctrl.single || io.dfma.valid && !mem_ctrl.single)
|
||||||
io.ctrl.nack := fsr_busy || units_busy || write_port_busy
|
io.ctrl.nack := fsr_busy || units_busy || write_port_busy
|
||||||
|
io.ctrl.nack_mem := units_busy
|
||||||
io.ctrl.dec <> fp_decoder.io.sigs
|
io.ctrl.dec <> fp_decoder.io.sigs
|
||||||
// we don't currently support round-max-magnitude (rm=4)
|
// we don't currently support round-max-magnitude (rm=4)
|
||||||
io.ctrl.illegal_rm := ex_rm(2)
|
io.ctrl.illegal_rm := ex_rm(2)
|
||||||
|
Loading…
Reference in New Issue
Block a user