Blocking vs non-blocking assignment in Verilog - Performance Comparison
When writing Verilog code, how assignments happen affects how long the code takes to run.
We want to see how blocking and non-blocking assignments change the number of steps the hardware simulation takes.
Analyze the time complexity of these two assignment styles.
// Blocking assignment example
always @(posedge clk) begin
a = b; // blocking
c = a + 1;
end
// Non-blocking assignment example
always @(posedge clk) begin
a <= b; // non-blocking
c <= a + 1;
end
This code updates signals a and c on a clock edge using two assignment types.
Look at what happens every clock cycle.
- Primary operation: Assigning values to signals
aandc. - How many times: Once per clock cycle, but order and timing differ between blocking and non-blocking.
Imagine the number of signals grows to n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 assignments per cycle |
| 100 | 100 assignments per cycle |
| 1000 | 1000 assignments per cycle |
Pattern observation: The number of assignments grows linearly with the number of signals.
Time Complexity: O(n)
This means the time to update signals grows directly with how many signals you assign each cycle.
[X] Wrong: "Blocking assignments always take more time than non-blocking because they run in order."
[OK] Correct: Both assignment types update signals once per cycle; the difference is in timing and simulation order, not the number of operations.
Understanding how assignment types affect simulation steps helps you write clearer, more predictable hardware code.
"What if we replaced all blocking assignments with non-blocking in a large sequential block? How would the time complexity change?"
Practice
Solution
Step 1: Understand blocking assignment behavior
Blocking assignments use '=' and execute statements in order, updating variables immediately.Step 2: Understand non-blocking assignment behavior
Non-blocking assignments use '<=' and update variables only after all right-hand sides are evaluated, allowing parallel updates.Final Answer:
Blocking assignments use '=' and update variables immediately, while non-blocking assignments use '<=' and update variables after all right sides are evaluated. -> Option CQuick Check:
Blocking = immediate, Non-blocking = delayed update [OK]
- Confusing '=' and '<=' usage
- Thinking both update variables immediately
- Assuming non-blocking is only for testbenches
Solution
Step 1: Identify non-blocking assignment operator
Non-blocking assignments use the '<=' operator in Verilog.Step 2: Check syntax correctness
reg_var <= value; uses '<=' correctly, while others use invalid or different operators.Final Answer:
reg_var <= value; -> Option BQuick Check:
Non-blocking uses '<=' [OK]
- Using '=' instead of '<=' for non-blocking
- Confusing ':=' or '==' as assignment
- Syntax errors with missing semicolons
reg a, b, c; always @(posedge clk) begin a = b; b <= c; end
What will be the value of 'a' and 'b' after the clock edge if initially b=0 and c=1?
Solution
Step 1: Evaluate blocking assignment 'a = b;'
Blocking assignment updates 'a' immediately with current 'b' value, which is 0.Step 2: Evaluate non-blocking assignment 'b <= c;'
Non-blocking assignment schedules 'b' to update after the block with 'c' value, which is 1.Final Answer:
a = 0, b = 1 -> Option AQuick Check:
Blocking immediate, non-blocking delayed update [OK]
- Assuming both update simultaneously
- Confusing initial values of variables
- Ignoring order of assignments
always @(posedge clk) begin reg1 <= reg2; reg2 = reg1; end
Solution
Step 1: Analyze assignment types in sequential block
In sequential always blocks, non-blocking assignments should be used for all registers to avoid race conditions.Step 2: Identify blocking assignment misuse
Using blocking assignment '=' for reg2 causes immediate update, which can cause incorrect behavior in sequential logic.Final Answer:
Using blocking assignment for reg2 causes incorrect sequential behavior. -> Option AQuick Check:
Sequential logic needs non-blocking assignments [OK]
- Thinking blocking is allowed in sequential always blocks
- Ignoring race conditions caused by mixed assignments
- Assuming wires can be assigned in always blocks
always @(posedge clk or posedge reset) begin
if (reset)
q = 0;
else
q <= d;
endWhat is the problem with this code?
Solution
Step 1: Understand assignment consistency in sequential blocks
Sequential logic should use non-blocking assignments consistently to avoid simulation and synthesis mismatches.Step 2: Identify mixed assignment problem
Using blocking '=' for reset and non-blocking '<=' for data causes timing mismatches and incorrect behavior.Final Answer:
Mixing blocking '=' for reset and non-blocking '<=' for data causes simulation mismatches. -> Option DQuick Check:
Use non-blocking consistently in sequential logic [OK]
- Mixing blocking and non-blocking in same always block
- Ignoring asynchronous reset in sensitivity list
- Assuming blocking '=' is fine for reset
Ready to prove it?
Pass the test and this pattern moves unknown
