How blocking and non blocking statements get executed?
Execution of blocking assignments can be viewed just like a one-step process:
1. Evaluate RHS (right-hand side equation) and update LHS (left-hand side expression) of the blocking assignment without interruption from any other Verilog statement. A blocking assignment "blocks"  trailing  assignments  in  the  same  always  block  from  occurring  until  after  current assignment has been completed
Execution of nonblocking assignments can be viewed as a two-step process:
1. Evaluate RHS of nonblocking statements at the beginning of the time step.
2. Update LHS of nonblocking statements at the end of the time step.