I found the issue. It turns out removing the clock slew (set_clock_transition in the script) solved it, though I'm not exactly sure why. Feel free to explain if you can. Maybe this will help someone else in the future.
I realised the reason why readmemh wasn't working for me was that the size of the structure being written to has to be the same size as the data being read in. This may be a normal constraint or it could be down to my setup but it fixed the issue for me.