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
 

© Copyright 2025 VLSI Mentor. All Rights Reserved.©

Connect with us

  • Instagram
  • Facebook
  • Twitter
  • LinkedIn
  • YouTube
bottom of page