Skip to content

Commit

Permalink
Merge pull request #395 from riscv-boom/simplepoison
Browse files Browse the repository at this point in the history
[core] Clean up how load-misses kill misspeculated load-wakeups
  • Loading branch information
jerryz123 committed Jan 4, 2020
2 parents f5e0621 + cc1e8c2 commit 690e82d
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 12 deletions.
13 changes: 5 additions & 8 deletions src/main/scala/exu/core.scala
Original file line number Diff line number Diff line change
Expand Up @@ -677,9 +677,10 @@ class BoomCore(implicit p: Parameters) extends BoomModule
// Fast Wakeup (uses just-issued uops that have known latencies)
fast_wakeup.bits.uop := iss_uops(i)
fast_wakeup.valid := iss_valids(i) &&
iss_uops(i).bypassable &&
iss_uops(i).dst_rtype === RT_FIX &&
iss_uops(i).ldst_val
iss_uops(i).bypassable &&
iss_uops(i).dst_rtype === RT_FIX &&
iss_uops(i).ldst_val &&
!(io.lsu.ld_miss && (iss_uops(i).iw_p1_poisoned || iss_uops(i).iw_p2_poisoned))

// Slow Wakeup (uses write-port to register file)
slow_wakeup.bits.uop := resp.bits.uop
Expand Down Expand Up @@ -717,11 +718,7 @@ class BoomCore(implicit p: Parameters) extends BoomModule
}

for ((renport, intport) <- rename_stage.io.wakeups zip int_ren_wakeups) {
// Stop wakeup for bypassable children of spec-loads trying to issue during a ldMiss.
renport.valid :=
intport.valid &&
!(io.lsu.ld_miss && (intport.bits.uop.iw_p1_poisoned || intport.bits.uop.iw_p2_poisoned))
renport.bits := intport.bits
renport <> intport
}
if (usingFPU) {
for ((renport, fpport) <- fp_rename_stage.io.wakeups zip fp_pipeline.io.wakeups) {
Expand Down
6 changes: 2 additions & 4 deletions src/main/scala/exu/issue-units/issue-slot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -169,13 +169,11 @@ class IssueSlot(val numWakeupPorts: Int)(implicit p: Parameters)

for (i <- 0 until numWakeupPorts) {
when (io.wakeup_ports(i).valid &&
(io.wakeup_ports(i).bits.pdst === next_uop.prs1) &&
!(io.ldspec_miss && io.wakeup_ports(i).bits.poisoned)) {
(io.wakeup_ports(i).bits.pdst === next_uop.prs1)) {
p1 := true.B
}
when (io.wakeup_ports(i).valid &&
(io.wakeup_ports(i).bits.pdst === next_uop.prs2) &&
!(io.ldspec_miss && io.wakeup_ports(i).bits.poisoned)) {
(io.wakeup_ports(i).bits.pdst === next_uop.prs2)) {
p2 := true.B
}
when (io.wakeup_ports(i).valid &&
Expand Down

0 comments on commit 690e82d

Please sign in to comment.