X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=cpu.py;h=29cbe574a8e266a5e5b4c30a666a123696d3e3a4;hb=refs%2Fheads%2Fmaster;hp=b12f90e8558223e9274b8b9f9567f6569b601e0b;hpb=203a3b3e6590d5a9c82f9f33b03a58025737b14b;p=rv32.git diff --git a/cpu.py b/cpu.py index b12f90e..29cbe57 100644 --- a/cpu.py +++ b/cpu.py @@ -235,6 +235,13 @@ class CPU(Module): # return [m.mcause.eq(0), # ] + def handle_trap(self, mcause, mepc, mie, mpie): + s = [mcause.eq(self.new_mcause), + mepc.eq(self.new_mepc), + mpie.eq(self.new_mpie), + mie.eq(self.new_mie)] + return s + def main_block(self, mtvec, mip, minfo, misa, csr, mi, m, mstatus, mie, ft, dc, load_store_misaligned, @@ -242,17 +249,16 @@ class CPU(Module): lui_auipc_result): c = {} c[FOS.empty] = [] - c[FOS.trap] = self.handle_trap.eq(1) + c[FOS.trap] = self.handle_trap(m.mcause, m.mepc, + mstatus.mie, mstatus.mpie) c[FOS.valid] = self.handle_valid(mtvec, mip, minfo, misa, csr, mi, m, mstatus, mie, ft, dc, load_store_misaligned, loaded_value, alu_result, lui_auipc_result) - return [self.handle_trap.eq(0), - self.regs.w_en.eq(0), + return [self.regs.w_en.eq(0), Case(ft.output_state, c), - self.handle_trap.eq(0), self.regs.w_en.eq(0)] def write_register(self, rd, val): @@ -268,8 +274,7 @@ class CPU(Module): lui_auipc_result): # fetch action ack trap i = If((ft.action == FA.ack_trap) | (ft.action == FA.noerror_trap), - [self.handle_trap.eq(1), - ] + self.handle_trap(m.mcause, m.mepc, mstatus.mie, mstatus.mpie) ) # load @@ -617,7 +622,10 @@ class CPU(Module): minfo = MInfo(self.comb) - self.handle_trap = Signal(reset=0) + self.new_mcause = Signal(32) + self.new_mepc = Signal(32) + self.new_mpie = Signal() + self.new_mie = Signal() ht = Instance("CPUHandleTrap", "cpu_handle_trap", i_ft_action = ft.action, @@ -625,9 +633,11 @@ class CPU(Module): i_dc_action = dc.act, i_dc_immediate = dc.immediate, i_load_store_misaligned = load_store_misaligned, - o_mcause = m.mcause, - o_mepc = m.mepc, - o_mie = mstatus.mie) + i_mie = mstatus.mie, + o_mcause = self.new_mcause, + o_mepc = self.new_mepc, + o_mpie = self.new_mpie, + o_mie = self.new_mie) self.specials += ht