Bird
Raised Fist0
Verilogprogramming~3 mins

Why When to use blocking (combinational) in Verilog? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

Discover how a simple change in assignment style can save you hours of debugging confusing circuit behavior!

The Scenario

Imagine you are wiring a complex circuit by hand, connecting each wire one by one to get the right signals. You try to update multiple signals step-by-step, but it's hard to keep track of what changes when, and the circuit doesn't behave as expected.

The Problem

Doing this manually is slow and confusing. If you update signals in the wrong order, the circuit might produce wrong outputs or glitches. It's easy to make mistakes because the order of updates matters a lot, and you can't see all changes happening at once.

The Solution

Using blocking assignments in combinational logic lets you write code that updates signals immediately and in order. This matches how combinational circuits work, where outputs depend directly on current inputs. It helps you avoid timing mistakes and makes your design clear and predictable.

Before vs After
✗ Before
a <= b;
c <= a + 1;
✓ After
a = b;
c = a + 1;
What It Enables

It enables you to model combinational logic precisely and clearly, ensuring outputs update instantly as inputs change.

Real Life Example

Designing a simple calculator circuit where the output must immediately reflect the current inputs without waiting for a clock signal.

Key Takeaways

Blocking assignments update signals immediately and in order.

They are perfect for combinational logic where outputs depend directly on inputs.

Using them avoids timing errors and makes your design easier to understand.

Practice

(1/5)
1. Which type of assignment should you use inside an always @(*) block to model combinational logic in Verilog?
easy
A. Continuous assignment (assign)
B. Non-blocking assignment (<=)
C. Blocking assignment (=)
D. Initial assignment

Solution

  1. Step 1: Understand the purpose of always @(*) blocks

    These blocks are used to describe combinational logic where outputs depend immediately on inputs.
  2. Step 2: Choose the correct assignment type for combinational logic

    Blocking assignments (=) execute statements sequentially and update values immediately, which is suitable for combinational logic.
  3. Final Answer:

    Blocking assignment (=) -> Option C
  4. Quick Check:

    Combinational logic uses blocking (=) [OK]
Hint: Use '=' in always @(*) for immediate updates [OK]
Common Mistakes:
  • Using non-blocking (<=) in combinational blocks
  • Confusing continuous assign with blocking inside always
  • Using initial blocks for combinational logic
2. Which of the following is the correct syntax for a blocking assignment inside an always @(*) block?
easy
A. output <= input + 1;
B. output = input + 1;
C. assign output = input + 1;
D. initial output = input + 1;

Solution

  1. Step 1: Identify the assignment type inside always @(*)

    Blocking assignments use the '=' operator inside procedural blocks.
  2. Step 2: Match the syntax with blocking assignment

    The statement output = input + 1; uses '=' which is the blocking assignment syntax.
  3. Final Answer:

    output = input + 1; -> Option B
  4. Quick Check:

    Blocking assignment uses '=' inside always blocks [OK]
Hint: Inside always @(*), use '=' for blocking assignments [OK]
Common Mistakes:
  • Using '<=' instead of '=' inside always @(*)
  • Using 'assign' inside procedural blocks
  • Using 'initial' for combinational logic
3. What is the output of the following Verilog code snippet?
reg a, b, c;
always @(*) begin
  a = 1'b0;
  b = a;
  c = b;
end
medium
A. a=0, b=0, c=0
B. a=0, b=1, c=1
C. a=1, b=0, c=0
D. a=1, b=1, c=1

Solution

  1. Step 1: Trace the blocking assignments sequentially

    First, a = 0; sets a to 0 immediately. Then b = a; assigns b the current value of a, which is 0. Finally, c = b; assigns c the current value of b, which is 0.
  2. Step 2: Confirm all variables have value 0

    All three variables a, b, and c are assigned 0 in order.
  3. Final Answer:

    a=0, b=0, c=0 -> Option A
  4. Quick Check:

    Blocking assignments update immediately, so all zero [OK]
Hint: Blocking updates happen immediately in order [OK]
Common Mistakes:
  • Assuming b or c keep old values
  • Confusing blocking with non-blocking timing
  • Ignoring sequential order of assignments
4. Identify the error in this combinational logic block:
always @(*) begin
  out <= in1 & in2;
  out2 = out | in3;
end
medium
A. Using non-blocking (<=) and blocking (=) mixed in combinational block
B. Missing sensitivity list
C. Using continuous assignment inside always block
D. No error, code is correct

Solution

  1. Step 1: Check assignment types inside always @(*)

    Combinational logic should use blocking assignments (=) consistently inside always @(*) blocks.
  2. Step 2: Identify mixed assignment usage

    The code uses non-blocking (<=) for out and blocking (=) for out2, which is incorrect for combinational logic.
  3. Final Answer:

    Using non-blocking (<=) and blocking (=) mixed in combinational block -> Option A
  4. Quick Check:

    Combinational blocks use only blocking (=) [OK]
Hint: Use only '=' in combinational always blocks [OK]
Common Mistakes:
  • Mixing <= and = inside combinational blocks
  • Forgetting to use always @(*) for combinational logic
  • Using continuous assign inside procedural blocks
5. You want to design a combinational logic block that calculates the maximum of two inputs a and b. Which of the following always @(*) blocks correctly uses blocking assignments to implement this?
hard
A. always @(*) begin if (a > b) max <= a; else max <= b; end
B. always @(a or b) begin if (a > b) max = a; else max = b; end
C. always @(a or b) begin if (a > b) max <= a; else max <= b; end
D. always @(*) begin if (a > b) max = a; else max = b; end

Solution

  1. Step 1: Confirm the sensitivity list for combinational logic

    Using always @(*) is preferred for combinational logic to automatically include all inputs.
  2. Step 2: Check assignment type for combinational logic

    Blocking assignments (=) must be used inside always @(*) blocks for combinational logic.
  3. Step 3: Evaluate each option

    always @(*) begin if (a > b) max = a; else max = b; end uses always @(*) and blocking assignments (=), correctly modeling combinational max logic.
  4. Final Answer:

    always @(*) begin if (a > b) max = a; else max = b; end -> Option D
  5. Quick Check:

    Combinational max needs always @(*) and '=' [OK]
Hint: Use always @(*) with '=' for combinational max logic [OK]
Common Mistakes:
  • Using non-blocking (<=) in combinational always blocks
  • Using explicit sensitivity list instead of @(*)
  • Mixing blocking and non-blocking assignments
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard