In reply to moshiko:
You sample with blocking assignments as you are putting values into a testbench structure. You assign with non-blocking assignments as the clocking block uses the output skew to assign the clocking block values to the associated signals.
Clocking blocks are designed to prevent race conditions where signals change at the same time as the clock. You are correct that the input skew will sample all values prior to the clock edge. This ensures that you get the values for all signals correctly and don’t have a mismatch of some signals that have changed and some that haven’t.