Why we should use non-blocking assignments in driver and blocking assignments in monitor?

In reply to ram007:
The general rule is if one process writes to a variable, and another process reads the same variable synchronized to the same event, you must use a non-blocking assignment to that variable to prevent race conditions.

The process that generates a clock is not synchronized to itself, so you should not be using non-blocking assignments. Reset depends if it is synchronous or asynchronous.