It's taken much longer than I thought it would, but I can run the testbench in the simulator and it successfully finds the (assumed) correct nonce

I've only just learnt that 'midstate' is deprecated, which this code requires. Perhaps I can work towards adding that feature (later, when I work out what this code is doing!).
The test hash I used was already in the code;
uut.midstate_buf = 256'h228ea4732a3c9ba860c009cda7252b9161a5e75ec8c582a5f106abb3af41f790;
uut.data_buf = 512'h000002800000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000002194261a9395e64dbed17115;
uut.nonce = 32'h0e33337a - 256; // Minus a little so we can exercise the code a bit
I didn't completely understand your example hashes. Am I correct in thinking you've provided data:nonce pairs, where one is correct? Or are they all correct? Obviously I'll need to calculate the midstate myself if this is the case.
Thanks for your help! I finally feel like I'm getting somewhere.