In reply to Bhaskar44:
Let me go back to answer your original question. All statements you put inside a begin/end block execute sequentially, meaning the next statement does not execute until the previous statement finishes its execution. An assignment is a statement. An if is a conditional branching statement. A begin/end block is a single compound statement. You can use a begin/end statement anywhere a single statement is allowed, and the statement(s) inside the block execute sequentially as well. The execution of the begin/end block statement does not complete until it has finishes the last statement in its sequence.
There are no races between statements within a begin/end block because only one statement is executing at any one time. However, a fork/join block is also a single compound statement, but the statements inside a fork execute in parallel. So you can have races between statements in a fork/join, and you can also have races between multiple initial and always blocks if they execute simultaniously.