Hi Kaz,
I tried your suggested procedure and it worked on my simulation. Setting the rdreq to INOUT was a good idea to work around needing a variable to assign to rdreq as you cant read an output.
I was still confused as to why using a variable in the procedure was causing the simulation not to evaluate properly so I had a bit more of a search online and found a clue:
--- Quote Start ---
A procedure may declare local variables. These do not retain their values between successive calls, but are re-initialised each time. Array-type parameters may be unconstrained
--- Quote End ---
So from this im guessing that when I call the procedure concurrently, every time the inputs change and the procedure gets re-evaluated the variable is getting re-initialised. in the case of the state machine this is meaning that it keeps getting re-initialised to check_empty so the state machine isnt transitioning and in my second procedure rdreq_ip is always being re-intialised to 0 and is never able to clear rdreq.