top of page

14.3. Blocking and Non-Blocking Assignments

Assignment statements are used to assign values to variables in procedural blocks. Verilog provides two types of assignments: blocking and non-blocking. Understanding the difference between these is CRITICAL for writing correct RTL code.

14.3.1. Blocking Assignments (=)

Characteristics

  • Uses the = operator

  • Executes IMMEDIATELY in sequential order

  • BLOCKS subsequent statements until complete

  • RHS evaluated and LHS updated immediately

  • Used for COMBINATIONAL logic

  • Order of statements matters!

Syntax and Behavior

Verilog

Execution Flow Example

Verilog

Result: a=1, b=1, c=1 (all updated in sequence)
 

Common Uses

Verilog

14.3.2. Non-Blocking Assignments (<=)

Characteristics

  • Uses the <= operator

  • Evaluates RHS immediately but schedules LHS update

  • Does NOT block subsequent statements

  • All updates happen at END of time step

  • Used for SEQUENTIAL logic (flip-flops)

  • Order of statements does NOT matter!

Syntax and Behavior

Verilog

Execution Flow Example

Assume: a=0, b=0, c=0 initially

Verilog

Result: Creates a shift register! Each uses old values.

Common Uses

Verilog

14.3.3. Critical Comparison

Screenshot (745).png

THE MOST IMPORTANT EXAMPLE

This example demonstrates WHY the choice of assignment type is critical:

Scenario: Creating a Shift Register

Verilog

14.3.4. Race Conditions and Determinism

Mixing blocking and non-blocking assignments in the same always block can lead to race conditions and non-deterministic behavior.

Race Condition Example

Verilog

The result is unpredictable because:

  • Different simulators may give different results

  • Synthesis vs simulation mismatch possible

  • Timing-dependent behavior

Multiple Driver Conflict

Verilog

Best Practices and Guidelines

1. Golden Rules for RTL Coding

  • Rule 1: Use non-blocking (<=) for sequential logic in always @(posedge clk)

  • Rule 2: Use blocking (=) for combinational logic in always @(*)

  • Rule 3: NEVER mix blocking and non-blocking in same always block

  • Rule 4: Assign each variable in only ONE always block

  • Rule 5: Use @(*) for combinational, not explicit lists

2. Coding Style Template

Verilog

3. Synthesis Considerations

Screenshot (746).png

Common Mistakes and How to Avoid Them

Mistake #1: Incomplete Sensitivity List

Verilog

Mistake #2: Unintentional Latches

Verilog

Mistake #3: Wrong Assignment Type

Verilog

Mistake #4: Mixing Assignment Types

Verilog

Mistake #5: Multiple Drivers

Verilog

Sequential & Parallel Blocks

Timing Control
 

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube

Connect with us

bottom of page