Generally full-system hangs are the result of AXI transactions hitting the fabric and not being acknowledged for one reason or another although why that’s happening at boot is don’t know. One thing to try is setting up the AXI watchdog timers on the AXI master connections which will trigger a slave error rather than a hang and see if that helps.
The following code will do this for the LPD master.
mmio = pynq.MMIO(0xFF416000, 64)
mmio.write(0x18, 3) # Return slave errors when timeouts occur
mmio.write(0x20, 0x1020) # Set and enable prescale of 32 which should be about 10 ms
mmio.write(0x10, 0x3) # Enable transactions tracking
mmio.write(0x14, 0x3) # Enable timeouts
And again for the The FPD
mmio = pynq.MMIO(0xFD610000 , 64)
mmio.write(0x18, 7) # Return slave errors when timeouts occur
mmio.write(0x20, 0x1020) # Set and enable prescale of 32 which should be about 10 ms
mmio.write(0x10, 0x7) # Enable transactions tracking
mmio.write(0x14, 0x7) # Enable timeouts
You can also enable a system-wide watchdog that’ll reset the board if Linux locks up for some reason. I don’t know of a way of triggering a reboot via JTAG in a nice way. You might be able to write to the watchdog registers via JTAG and use that to reset the board.
Peter