# LD/ST requested activates "busy" (only if not already busy)
with m.If(self.pi.is_ld_i | self.pi.is_st_i):
- comb += busy_l.s.eq(~busy_delay)
+ with m.If(self.pi.exc_o.happened):
+ comb += busy_l.s.eq(0)
+ sync += Display("fast exception")
+ with m.Else():
+ comb += busy_l.s.eq(~busy_delay)
# if now in "LD" mode: wait for addr_ok, then send the address out
# to memory, acknowledge address, and send out LD data
with m.If(pi.addr.ok):
self.set_wr_addr(m, pi.addr.data, lenexp.lexp_o, misalign, pr,
pi.is_dcbz_i)
- with m.If(adrok_l.qn):
+ with m.If(adrok_l.qn & self.pi.exc_o.happened==0):
comb += pi.addr_ok_o.eq(1) # acknowledge addr ok
sync += adrok_l.s.eq(1) # and pull "ack" latch
# monitor for an exception, clear busy immediately
with m.If(self.pi.exc_o.happened):
comb += busy_l.r.eq(1)
+ comb += reset_l.s.eq(1) # also reset whole unit
# however ST needs one cycle before busy is reset
#with m.If(self.pi.st.ok | self.pi.ld.ok):