@@ -23,7 +23,7 @@ import utils._
23
23
import utility ._
24
24
import xiangshan ._
25
25
import xiangshan .ExceptionNO ._
26
- import xiangshan .backend .Bundles .{DynInst , MemExuInput , MemExuOutput }
26
+ import xiangshan .backend .Bundles .{DynInst , MemExuInput , MemExuOutput , connectSamePort }
27
27
import xiangshan .backend .fu .PMPRespBundle
28
28
import xiangshan .backend .fu .FuConfig ._
29
29
import xiangshan .backend .fu .FuType
@@ -330,7 +330,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
330
330
s0_src_select_vec(fast_rep_idx) || s0_src_select_vec(mmio_idx) ||
331
331
s0_src_select_vec(nc_idx)
332
332
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 ||
334
334
s0_src_valid_vec(super_rep_idx) ||
335
335
s0_src_valid_vec(fast_rep_idx) ||
336
336
s0_src_valid_vec(lsq_rep_idx) ||
@@ -1156,6 +1156,12 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1156
1156
s2_mmio_req.valid := RegNextN (io.lsq.uncache.fire, 2 , Some (false .B ))
1157
1157
s2_mmio_req.bits := RegNextN (io.lsq.uncache.bits, 2 )
1158
1158
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
+
1159
1165
s2_kill := s2_in.uop.robIdx.needFlush(io.redirect)
1160
1166
s2_ready := ! s2_valid || s2_kill || s3_ready
1161
1167
when (s1_fire) { s2_valid := true .B }
@@ -1282,11 +1288,10 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1282
1288
! s2_tlb_miss &&
1283
1289
! s2_fwd_fail &&
1284
1290
(s2_dcache_fast_rep || s2_nuke_fast_rep) &&
1285
- s2_troublem &&
1286
- ! s2_in.misalignNeedWakeUp
1291
+ s2_troublem
1287
1292
1288
1293
// 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
1290
1295
1291
1296
val s2_data_fwded = s2_dcache_miss && s2_full_fwd
1292
1297
@@ -1303,8 +1308,8 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1303
1308
1304
1309
val s2_fwd_vp_match_invalid = io.lsq.forward.matchInvalid || io.sbuffer.matchInvalid || io.ubuffer.matchInvalid
1305
1310
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
1308
1313
1309
1314
// ld-ld violation require
1310
1315
io.lsq.ldld_nuke_query.req.valid := s2_valid
@@ -1513,7 +1518,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1513
1518
// forwrad last beat
1514
1519
val s3_fast_rep_canceled = io.replay.valid && io.replay.bits.forward_tlDchannel || io.misalign_ldin.valid || ! io.dcache.req.ready
1515
1520
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
1517
1522
io.lsq.ldin.valid := s3_can_enter_lsq_valid
1518
1523
// TODO: check this --by hx
1519
1524
// 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
1554
1559
val s3_mab_sel_rep_cause = PriorityEncoderOH (s3_mab_rep_info.cause.asUInt)
1555
1560
val s3_misalign_rep_cause = WireInit (0 .U .asTypeOf(s3_in.rep_info.cause))
1556
1561
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)
1562
1563
1563
1564
when (s3_exception || s3_hw_err || s3_rep_frm_fetch || s3_frm_mabuf) {
1564
1565
s3_replayqueue_rep_cause := 0 .U .asTypeOf(s3_lrq_rep_info.cause.cloneType)
@@ -1646,7 +1647,7 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1646
1647
io.feedback_slow.bits.dataInvalidSqIdx := DontCare
1647
1648
1648
1649
// 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
1650
1651
1651
1652
val s3_ld_wb_meta = Mux (s3_valid, s3_out.bits, s3_mmio_req.bits)
1652
1653
@@ -1738,7 +1739,6 @@ class LoadUnit(implicit p: Parameters) extends XSModule
1738
1739
FuType .ldu.U
1739
1740
)
1740
1741
1741
- XSError (s3_valid && s3_in.misalignNeedWakeUp && ! s3_frm_mabuf, " Only the needwakeup from the misalignbuffer may be high" )
1742
1742
XSError (s3_valid && s3_vecout.isvec && s3_in.vecActive && ! s3_vecout.mask.orR, " In vecActive, mask complement should not be 0" )
1743
1743
// TODO: check this --hx
1744
1744
// 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
1798
1798
// io.lsq.uncache.valid && !io.lsq.uncache.bits.uop.robIdx.needFlush(io.redirect) && !s3_out.valid && io.lsq.uncache.bits.isVls
1799
1799
// io.lsq.uncache.valid && !io.lsq.uncache.bits.uop.robIdx.needFlush(io.redirect) && !s3_out.valid && !io.lsq.uncache.bits.isVls
1800
1800
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)
1805
1805
1806
1806
// fast load to load forward
1807
1807
if (EnableLoadToLoadForward ) {
0 commit comments