I$: Don't raise io.resp.valid if io.s1_kill was high previous cycle
@solomatnikov found the bug. It doesn't manifest in Rocket because the Frontend masks io.resp.valid with s2_valid.
This commit is contained in:
parent
d67738204f
commit
dd85d7e0a0
@ -212,7 +212,7 @@ class ICacheModule(outer: ICache) extends LazyModuleImp(outer)
|
|||||||
|
|
||||||
case 2 =>
|
case 2 =>
|
||||||
val s2_valid = RegNext(s1_valid && !io.s1_kill, Bool(false))
|
val s2_valid = RegNext(s1_valid && !io.s1_kill, Bool(false))
|
||||||
val s2_hit = RegNext(s1_hit, Bool(false))
|
val s2_hit = RegNext(s1_hit)
|
||||||
val s2_tag_hit = RegEnable(s1_tag_hit, s1_valid || s1_slaveValid)
|
val s2_tag_hit = RegEnable(s1_tag_hit, s1_valid || s1_slaveValid)
|
||||||
val s2_dout = RegEnable(s1_dout, s1_valid || s1_slaveValid)
|
val s2_dout = RegEnable(s1_dout, s1_valid || s1_slaveValid)
|
||||||
val s2_way_mux = Mux1H(s2_tag_hit, s2_dout)
|
val s2_way_mux = Mux1H(s2_tag_hit, s2_dout)
|
||||||
@ -223,7 +223,7 @@ class ICacheModule(outer: ICache) extends LazyModuleImp(outer)
|
|||||||
when (s2_valid && s2_disparity) { invalidate := true }
|
when (s2_valid && s2_disparity) { invalidate := true }
|
||||||
|
|
||||||
io.resp.bits := s2_data_decoded.uncorrected
|
io.resp.bits := s2_data_decoded.uncorrected
|
||||||
io.resp.valid := s2_hit && !s2_disparity
|
io.resp.valid := s2_valid && s2_hit && !s2_disparity
|
||||||
|
|
||||||
tl_in.map { tl =>
|
tl_in.map { tl =>
|
||||||
tl.a.ready := !tl_out.d.fire() && !s1_slaveValid && !s2_slaveValid && !(tl.d.valid && !tl.d.ready)
|
tl.a.ready := !tl_out.d.fire() && !s1_slaveValid && !s2_slaveValid && !(tl.d.valid && !tl.d.ready)
|
||||||
|
Loading…
Reference in New Issue
Block a user