# also note instruction fetch failed
if hasattr(core, "icache"):
fetch_failed = core.icache.i_out.fetch_failed
+ flush_needed = True
else:
fetch_failed = Const(0, 1)
+ flush_needed = False
# don't read msr every cycle
staterf = self.core.regs.rf['state']
# also note instruction fetch failed
if hasattr(core, "icache"):
fetch_failed = core.icache.i_out.fetch_failed
+ flush_needed = True
else:
fetch_failed = Const(0, 1)
+ flush_needed = False
# set to fault in decoder
# update (highest priority) instruction fault
rising_fetch_failed = rising_edge(m, fetch_failed)
# to decode the instruction
with m.State("DECODE_SV"):
# decode the instruction
+ with m.If(~fetch_failed):
+ sync += pdecode2.instr_fault.eq(0)
sync += core.i.e.eq(pdecode2.e)
sync += core.i.state.eq(cur_state)
sync += core.i.raw_insn_i.eq(dec_opcode_i)
# reset instr_fault (highest priority)
sync += pdecode2.ldst_exc.eq(mmu)
sync += pdecode2.instr_fault.eq(0)
+ if flush_needed:
+ # request the icache to stop asserting "failed"
+ comb += core.icache.flush_in.eq(1)
with m.Else():
# otherwise assume it was a LDST exception
sync += pdecode2.ldst_exc.eq(ldst)