Bird
Raised Fist0
Verilogprogramming~10 mins

When to use blocking (combinational) in Verilog - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to assign the output as the AND of inputs using blocking assignment.

Verilog
always @(*) begin
  out = [1] & b;
end
Drag options to blanks, or click blank then click option'
Aa
Bout
Cc
Dd
Attempts:
3 left
💡 Hint
Common Mistakes
Using the output variable on the right side causes incorrect logic.
Using non-input variables in the expression.
2fill in blank
medium

Complete the code to use blocking assignment for combinational logic that sums two inputs.

Verilog
always @(*) begin
  sum = [1] + b;
end
Drag options to blanks, or click blank then click option'
Aa
Bc
Cd
Dsum
Attempts:
3 left
💡 Hint
Common Mistakes
Using the output variable on the right side.
Using a variable not declared as input.
3fill in blank
hard

Fix the error in the combinational block by choosing the correct blocking assignment variable.

Verilog
always @(*) begin
  [1] = a & b;
  c = [1] | d;
end
Drag options to blanks, or click blank then click option'
Ad
Bc
Ca
Dtemp
Attempts:
3 left
💡 Hint
Common Mistakes
Using output variable c on the left side before it is assigned.
Using input variables incorrectly.
4fill in blank
hard

Fill both blanks to create a combinational block that calculates sum and carry using blocking assignments.

Verilog
always @(*) begin
  [1] = a ^ b;
  [2] = a & b;
end
Drag options to blanks, or click blank then click option'
Asum
Bcarry
Ctemp
Dresult
Attempts:
3 left
💡 Hint
Common Mistakes
Mixing up sum and carry variables.
Using non-blocking assignments in combinational logic.
5fill in blank
hard

Fill all three blanks to write a combinational block that computes max, min, and mid values using blocking assignments.

Verilog
always @(*) begin
  [1] = (a > b) ? a : b;
  [2] = (a < b) ? a : b;
  [3] = (a != b) ? ([1] + [2]) >> 1 : a;
end
Drag options to blanks, or click blank then click option'
Amax_val
Bmin_val
Cmid_val
Dtemp
Attempts:
3 left
💡 Hint
Common Mistakes
Using non-blocking assignments in combinational blocks.
Mixing variable names or forgetting to assign all outputs.

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