In Verilog, how you assign a value determines when that value updates. Mixing these up is the #1 cause of "simulation vs synthesis" mismatches.
Blocking (=)
Symbol: =
Behavior: Executes immediately. The next line of code cannot run until this one finishes.
Analogy: A Chef chopping vegetables. He cannot start cooking until he finishes chopping.
Use for: Combinational Logic
Non-Blocking (<=)
Symbol: <=
Behavior: Schedules assignment for the end of the time step. All lines execute in parallel.
Analogy: An Assembly Line. All workers perform their task on the current item simultaneously.
Use for: Sequential Logic (Flip-Flops)