In reply to SV26:
The variables driver_cb.addr and driver_cb.wr is illegally driven by a
blocking assignment.
A simple solution is to change only the code displayed in my previous post to look like this:
vif.driver_cb.wr <= req.wr;
vif.driver_cb.addr <= req.addr;
@ (vif.driver_cb)
req.rdata = vif.driver_cb.rdata;
It is not a good practice to use blocking and nonblocking assignment in the same task but it solves your problem.