Skip to content

Commit

Permalink
[lsu] LSU never dispatches to both LDQ and STQ for 1 op. Check this (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
jerryz123 committed Jan 4, 2020
1 parent 690e82d commit df23508
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions src/main/scala/lsu/lsu.scala
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,12 @@ class LSU(implicit p: Parameters, edge: TLEdgeOut) extends BoomModule()(p)
io.core.ldq_full(w) := ldq_full
io.core.dis_ldq_idx(w) := ld_enq_idx

val dis_ld_val = io.core.dis_uops(w).valid && io.core.dis_uops(w).bits.uses_ldq
stq_full = WrapInc(st_enq_idx, numStqEntries) === stq_head
io.core.stq_full(w) := stq_full
io.core.dis_stq_idx(w) := st_enq_idx

val dis_ld_val = io.core.dis_uops(w).valid && io.core.dis_uops(w).bits.uses_ldq
val dis_st_val = io.core.dis_uops(w).valid && io.core.dis_uops(w).bits.uses_stq
when (dis_ld_val)
{
ldq(ld_enq_idx).valid := true.B
Expand All @@ -298,15 +302,7 @@ class LSU(implicit p: Parameters, edge: TLEdgeOut) extends BoomModule()(p)
assert (ld_enq_idx === io.core.dis_uops(w).bits.ldq_idx, "[lsu] mismatch enq load tag.")
assert (!ldq(ld_enq_idx).valid, "[lsu] Enqueuing uop is overwriting ldq entries")
}
ld_enq_idx = Mux(dis_ld_val, WrapInc(ld_enq_idx, numLdqEntries),
ld_enq_idx)

stq_full = WrapInc(st_enq_idx, numStqEntries) === stq_head
io.core.stq_full(w) := stq_full
io.core.dis_stq_idx(w) := st_enq_idx

val dis_st_val = io.core.dis_uops(w).valid && io.core.dis_uops(w).bits.uses_stq
when (dis_st_val)
.elsewhen (dis_st_val)
{
stq(st_enq_idx).valid := true.B
stq(st_enq_idx).bits.uop := io.core.dis_uops(w).bits
Expand All @@ -318,10 +314,16 @@ class LSU(implicit p: Parameters, edge: TLEdgeOut) extends BoomModule()(p)
assert (st_enq_idx === io.core.dis_uops(w).bits.stq_idx, "[lsu] mismatch enq store tag.")
assert (!stq(st_enq_idx).valid, "[lsu] Enqueuing uop is overwriting stq entries")
}

ld_enq_idx = Mux(dis_ld_val, WrapInc(ld_enq_idx, numLdqEntries),
ld_enq_idx)

next_live_store_mask = Mux(dis_st_val, next_live_store_mask | (1.U << st_enq_idx),
next_live_store_mask)
st_enq_idx = Mux(dis_st_val, WrapInc(st_enq_idx, numStqEntries),
st_enq_idx)

assert(!(dis_ld_val && dis_st_val), "A UOP is trying to go into both the LDQ and the STQ")
}

ldq_tail := ld_enq_idx
Expand Down

0 comments on commit df23508

Please sign in to comment.