Skip to content

Commit 05f95a5

Browse files
committed
fix(LoadUnit): misalign load wakeup not enter loadunit
fix(LoadUnit): misalign load should go to RAR/RAW Queue
1 parent 0d55e1d commit 05f95a5

File tree

1 file changed

+19
-19
lines changed

1 file changed

+19
-19
lines changed

src/main/scala/xiangshan/mem/pipeline/LoadUnit.scala

+19-19
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import utils._
2323
import utility._
2424
import xiangshan._
2525
import xiangshan.ExceptionNO._
26-
import xiangshan.backend.Bundles.{DynInst, MemExuInput, MemExuOutput}
26+
import xiangshan.backend.Bundles.{DynInst, MemExuInput, MemExuOutput, connectSamePort}
2727
import xiangshan.backend.fu.PMPRespBundle
2828
import xiangshan.backend.fu.FuConfig._
2929
import xiangshan.backend.fu.FuType
@@ -330,7 +330,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
330330
s0_src_select_vec(fast_rep_idx) || s0_src_select_vec(mmio_idx) ||
331331
s0_src_select_vec(nc_idx)
332332
s0_valid := !s0_kill && (s0_src_select_vec(nc_idx) || ((
333-
s0_src_valid_vec(mab_idx) ||
333+
s0_src_valid_vec(mab_idx) && !io.misalign_ldin.bits.misalignNeedWakeUp ||
334334
s0_src_valid_vec(super_rep_idx) ||
335335
s0_src_valid_vec(fast_rep_idx) ||
336336
s0_src_valid_vec(lsq_rep_idx) ||
@@ -1156,6 +1156,12 @@ class LoadUnit(implicit p: Parameters) extends XSModule
11561156
s2_mmio_req.valid := RegNextN(io.lsq.uncache.fire, 2, Some(false.B))
11571157
s2_mmio_req.bits := RegNextN(io.lsq.uncache.bits, 2)
11581158

1159+
val s3_misalign_wakeup_req = Wire(Valid(new LqWriteBundle))
1160+
val s3_misalign_wakeup_req_bits = WireInit(0.U.asTypeOf(new LqWriteBundle))
1161+
connectSamePort(s3_misalign_wakeup_req_bits, io.misalign_ldin.bits)
1162+
s3_misalign_wakeup_req.valid := RegNextN(io.misalign_ldin.bits.misalignNeedWakeUp && io.misalign_ldin.fire, 3, Some(false.B))
1163+
s3_misalign_wakeup_req.bits := RegNextN(s3_misalign_wakeup_req_bits, 3)
1164+
11591165
s2_kill := s2_in.uop.robIdx.needFlush(io.redirect)
11601166
s2_ready := !s2_valid || s2_kill || s3_ready
11611167
when (s1_fire) { s2_valid := true.B }
@@ -1282,11 +1288,10 @@ class LoadUnit(implicit p: Parameters) extends XSModule
12821288
!s2_tlb_miss &&
12831289
!s2_fwd_fail &&
12841290
(s2_dcache_fast_rep || s2_nuke_fast_rep) &&
1285-
s2_troublem &&
1286-
!s2_in.misalignNeedWakeUp
1291+
s2_troublem
12871292

12881293
// need allocate new entry
1289-
val s2_can_query = !((s2_dcache_fast_rep || s2_nuke) && !s2_in.misalignNeedWakeUp) && s2_troublem
1294+
val s2_can_query = !(s2_dcache_fast_rep || s2_nuke) && s2_troublem
12901295

12911296
val s2_data_fwded = s2_dcache_miss && s2_full_fwd
12921297

@@ -1303,8 +1308,8 @@ class LoadUnit(implicit p: Parameters) extends XSModule
13031308

13041309
val s2_fwd_vp_match_invalid = io.lsq.forward.matchInvalid || io.sbuffer.matchInvalid || io.ubuffer.matchInvalid
13051310
val s2_vp_match_fail = s2_fwd_vp_match_invalid && s2_troublem
1306-
val s2_safe_wakeup = !s2_out.rep_info.need_rep && !s2_mmio && (!s2_in.nc || s2_nc_with_data) && !s2_mis_align && !s2_real_exception || s2_in.misalignNeedWakeUp // don't need to replay and is not a mmio\misalign no data
1307-
val s2_safe_writeback = s2_real_exception || s2_safe_wakeup || s2_vp_match_fail || s2_in.misalignNeedWakeUp
1311+
val s2_safe_wakeup = !s2_out.rep_info.need_rep && !s2_mmio && (!s2_in.nc || s2_nc_with_data) && !s2_mis_align && !s2_real_exception // don't need to replay and is not a mmio\misalign no data
1312+
val s2_safe_writeback = s2_real_exception || s2_safe_wakeup || s2_vp_match_fail
13081313

13091314
// ld-ld violation require
13101315
io.lsq.ldld_nuke_query.req.valid := s2_valid
@@ -1513,7 +1518,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
15131518
// forwrad last beat
15141519
val s3_fast_rep_canceled = io.replay.valid && io.replay.bits.forward_tlDchannel || io.misalign_ldin.valid || !io.dcache.req.ready
15151520

1516-
val s3_can_enter_lsq_valid = s3_valid && (!s3_fast_rep || s3_fast_rep_canceled) && !s3_in.feedbacked && !s3_in.misalignNeedWakeUp
1521+
val s3_can_enter_lsq_valid = s3_valid && (!s3_fast_rep || s3_fast_rep_canceled) && !s3_in.feedbacked
15171522
io.lsq.ldin.valid := s3_can_enter_lsq_valid
15181523
// TODO: check this --by hx
15191524
// io.lsq.ldin.valid := s3_valid && (!s3_fast_rep || !io.fast_rep_out.ready) && !s3_in.feedbacked && !s3_in.lateKill
@@ -1554,11 +1559,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
15541559
val s3_mab_sel_rep_cause = PriorityEncoderOH(s3_mab_rep_info.cause.asUInt)
15551560
val s3_misalign_rep_cause = WireInit(0.U.asTypeOf(s3_in.rep_info.cause))
15561561

1557-
s3_misalign_rep_cause := Mux(
1558-
s3_in.misalignNeedWakeUp,
1559-
0.U.asTypeOf(s3_mab_rep_info.cause.cloneType),
1560-
VecInit(s3_mab_sel_rep_cause.asBools)
1561-
)
1562+
s3_misalign_rep_cause := VecInit(s3_mab_sel_rep_cause.asBools)
15621563

15631564
when (s3_exception || s3_hw_err || s3_rep_frm_fetch || s3_frm_mabuf) {
15641565
s3_replayqueue_rep_cause := 0.U.asTypeOf(s3_lrq_rep_info.cause.cloneType)
@@ -1646,7 +1647,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
16461647
io.feedback_slow.bits.dataInvalidSqIdx := DontCare
16471648

16481649
// TODO: vector wakeup?
1649-
io.ldCancel.ld2Cancel := s3_valid && !s3_safe_wakeup && !s3_isvec && (!s3_frm_mabuf || s3_in.misalignNeedWakeUp)
1650+
io.ldCancel.ld2Cancel := s3_valid && !s3_safe_wakeup && !s3_isvec
16501651

16511652
val s3_ld_wb_meta = Mux(s3_valid, s3_out.bits, s3_mmio_req.bits)
16521653

@@ -1738,7 +1739,6 @@ class LoadUnit(implicit p: Parameters) extends XSModule
17381739
FuType.ldu.U
17391740
)
17401741

1741-
XSError(s3_valid && s3_in.misalignNeedWakeUp && !s3_frm_mabuf, "Only the needwakeup from the misalignbuffer may be high")
17421742
XSError(s3_valid && s3_vecout.isvec && s3_in.vecActive && !s3_vecout.mask.orR, "In vecActive, mask complement should not be 0")
17431743
// TODO: check this --hx
17441744
// io.ldout.valid := s3_out.valid && !s3_out.bits.uop.robIdx.needFlush(io.redirect) && !s3_vecout.isvec ||
@@ -1798,10 +1798,10 @@ class LoadUnit(implicit p: Parameters) extends XSModule
17981798
// io.lsq.uncache.valid && !io.lsq.uncache.bits.uop.robIdx.needFlush(io.redirect) && !s3_out.valid && io.lsq.uncache.bits.isVls
17991799
//io.lsq.uncache.valid && !io.lsq.uncache.bits.uop.robIdx.needFlush(io.redirect) && !s3_out.valid && !io.lsq.uncache.bits.isVls
18001800

1801-
io.misalign_ldout.valid := s3_valid && (!s3_fast_rep || s3_fast_rep_canceled) && s3_frm_mabuf
1802-
io.misalign_ldout.bits := io.lsq.ldin.bits
1803-
io.misalign_ldout.bits.data := Mux(s3_in.misalignWith16Byte, s3_merged_data_frm_pipe, s3_picked_data_frm_pipe(2))
1804-
io.misalign_ldout.bits.rep_info.cause := s3_misalign_rep_cause
1801+
io.misalign_ldout.valid := s3_valid && (!s3_fast_rep || s3_fast_rep_canceled) && s3_frm_mabuf || s3_misalign_wakeup_req.valid
1802+
io.misalign_ldout.bits := Mux(s3_misalign_wakeup_req.valid, s3_misalign_wakeup_req.bits, io.lsq.ldin.bits)
1803+
io.misalign_ldout.bits.data := s3_picked_data_frm_pipe(2)
1804+
io.misalign_ldout.bits.rep_info.cause := Mux(s3_misalign_wakeup_req.valid, 0.U.asTypeOf(s3_in.rep_info.cause), s3_misalign_rep_cause)
18051805

18061806
// fast load to load forward
18071807
if (EnableLoadToLoadForward) {

0 commit comments

Comments
 (0)