clear out DEC in core.cur_state.dec due to spurious interrupt.
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 30 Apr 2022 12:52:00 +0000 (13:52 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 30 Apr 2022 12:52:03 +0000 (13:52 +0100)
commit972f7cdd33ed6da0b57b2c39cddea6b0640c0ebc
tree670a7f8aece98647604f8f58cc85b69802ecc1d0
parente19eeb30cb8ede0674f581e028c06d0cb22796a8
clear out DEC in core.cur_state.dec due to spurious interrupt.

this is slightly complicated.  the STATE regfile contains pc, msr, svstate,
dec, and tb, being a reflection of CoreState.  reading from STATE regfile
is on a one-clock delay. the DEC/TB FSM needs to decrement DEC and increment
TB, by reading from the STATE regfile and then writing a new value.

of course, the SPR pipeline has to get a word in edgeways as well.

but...

the complication comes in that it is the PowerDecoder2 which receives
a *cached* copy of DEC, and this cached copy is what has (up until now)
been out-of-date with what is in the STATE regfile.

the hack-job-solution is to zero-out the cached copy when the SPR pipeline
writes a new value to DEC.  the DEC/TB FSM will then rewrite a correct
value into it.

given that PowerDecoder2 only uses the MSB of DEC (and the EE bit of MSR)
to determine whether to fire an interrupt, this should be perfectly fine.
src/soc/fu/spr/main_stage.py
src/soc/fu/spr/pipe_data.py
src/soc/simple/issuer.py