Skip to content
Snippets Groups Projects

MIA processor now halts on the correct clock cycle

Merged Johannes Kung requested to merge mia_halt into main
2 files
+ 20
14
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -134,10 +134,6 @@ class MicroMemory(Module):
micro controller sets control signals to other modules in accordance
with the micro instruction pointed to.
"""
# Always set HALT to False so that an eventual previously signalled
# HALT is reset and execution can continue normally.
self.halt = False
instruction = self.upc_s.get_value()
if instruction is None:
return
@@ -240,8 +236,27 @@ class MicroMemory(Module):
case 0b1110:
self._conditional_jump(self.o_flag_val, 0, uadr_field)
case 0b1111:
# Halt is handled by update_register
self.upc_control_s.update_value(0b011)
self.halt = True
def update_register(self) -> None:
"""
Signal halt when the micro memory performs a halt instruction.
Notes
-----
Although the micro memory is not a register, this override is needed to
make sure a halt instruction is signalled on the actual clock cycle
where it is "executed". All control signals for the halt will have been
propagated at the end of the previous cycle. If the halt signalling
were to be done in update_logic, the halt would erroneously be signaled
one cycle to early.
"""
seq_field = (self.memory[self.curr_instr] >> 7) & 0b1111
if seq_field == 0b1111:
self.halt = True
else:
self.halt = False
def _conditional_jump(self, flag, cond_value, uadr):
"""Helper function for executing a conditional jump to the specified uadr
Loading