Assertion-based verification basics in Verilog - Time & Space Complexity
When we use assertions in Verilog, we want to check if certain conditions hold during simulation.
We ask: how does the time to check these assertions grow as the design or input size grows?
Analyze the time complexity of the following assertion code snippet.
property p_check;
@(posedge clk) disable iff (!reset) (data_in == expected);
endproperty
assert_p_check: assert property (p_check);
This code checks on every clock edge if the input data matches an expected value, ignoring checks when reset is low.
Assertions run repeatedly during simulation cycles.
- Primary operation: Checking the condition (data_in == expected) every clock cycle.
- How many times: Once per clock cycle during active simulation.
The number of checks grows directly with the number of clock cycles simulated.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 cycles | 10 checks |
| 100 cycles | 100 checks |
| 1000 cycles | 1000 checks |
Pattern observation: The work grows linearly as simulation time increases.
Time Complexity: O(n)
This means the time to check assertions grows in a straight line with the number of clock cycles.
[X] Wrong: "Assertions only run once and do not add to simulation time."
[OK] Correct: Assertions are checked every relevant event, so their cost adds up over many cycles.
Understanding how assertions impact simulation time helps you write efficient verification code and shows you think about design performance.
"What if we added multiple assertions checking different signals each cycle? How would the time complexity change?"
Practice
Solution
Step 1: Understand what assertions do
Assertions are used to check if certain conditions hold true automatically during simulation.Step 2: Differentiate from other Verilog constructs
Assertions do not generate hardware or declare variables; they only verify behavior during simulation.Final Answer:
To automatically check if a condition is true during simulation -> Option CQuick Check:
Assertions check conditions automatically [OK]
- Confusing assertions with synthesis code
- Thinking assertions declare variables
- Assuming assertions optimize hardware
Solution
Step 1: Recall immediate assertion syntax
The correct syntax for a simple immediate assertion is 'assert (condition);'.Step 2: Check each option for syntax correctness
assert(signal == 1'b1); matches the immediate assertion syntax. assert property (signal == 1'b1); uses 'assert property' which is for concurrent assertions. assert property signal == 1'b1; misses parentheses after 'property'. assert(signal = 1'b1); uses assignment '=' instead of comparison '=='.Final Answer:
assert(signal == 1'b1); -> Option BQuick Check:
Immediate assertion syntax: 'assert (condition);' [OK]
- Using 'assert property' for immediate assertions
- Missing parentheses around condition
- Using '=' instead of '==' for comparison
assert property (@(posedge clk) (data != 0)); What happens if data is zero at a clock edge during simulation?Solution
Step 1: Understand the assertion condition
The assertion checks at every positive clock edge that 'data' is not zero.Step 2: Analyze what happens if 'data' equals zero
If 'data' is zero at a clock edge, the condition 'data != 0' is false, so the assertion fails and reports an error.Final Answer:
The assertion fails and reports an error -> Option DQuick Check:
Assertion fails if condition is false at check time [OK]
- Thinking assertion passes when condition is false
- Assuming simulation stops silently
- Believing assertion ignores failures
assert property @(posedge clk) (reset == 1'b0);
Solution
Step 1: Check assertion syntax for event and condition
The correct syntax requires parentheses around the entire property expression, including the event and condition.Step 2: Identify missing parentheses
The code misses parentheses around '@(posedge clk) (reset == 1'b0)', which is required for 'assert property'.Final Answer:
Incorrect use of 'assert property' without parentheses around condition -> Option AQuick Check:
'assert property' needs parentheses around event and condition [OK]
- Omitting parentheses around event and condition
- Confusing '=' with '=='
- Assuming no parentheses needed for event
valid remains high for exactly 3 clock cycles after it goes high. Which assertion best captures this behavior?Solution
Step 1: Understand the requirement
The signal 'valid' must stay high for exactly 3 clock cycles after it goes high, then go low.Step 2: Analyze each assertion
assert property (@(posedge clk) valid |-> valid ##1 valid ##1 !valid); uses '|->' implication and timing control to check 'valid' at current cycle, then stays high for 2 more cycles, then low at the 4th cycle, matching exactly 3 cycles high.Step 3: Eliminate incorrect options
assert property (@(posedge clk) valid |-> ##1 valid ##1 valid ##1 !valid); checks 4 cycles high (3 ##1 delays plus !valid at 4th). assert property (@(posedge clk) valid |-> ##3 valid); checks only after 3 cycles, not duration. assert property (@(posedge clk) valid ##3 valid); lacks implication operator and timing control.Final Answer:
assert property (@(posedge clk) valid |-> valid ##1 valid ##1 !valid); -> Option AQuick Check:
Use '|->' with timing to check exact cycle count [OK]
- Confusing number of cycles with delays
- Missing implication operator '|->'
- Incorrect timing control syntax
Ready to prove it?
Pass the test and this pattern moves unknown
