This test module creates a clock and a counter that increments after reset is released. The assertion checks that the counter never goes above 10. If it does, an error message prints.
Verilog
module test_assertion();
reg clk = 0;
reg reset = 1;
reg [7:0] count = 0;
always #5 clk = ~clk; // Clock toggles every 5 time units
initial begin
#10 reset = 0; // Release reset after 10 time units
end
always @(posedge clk) begin
if (!reset) count <= count + 1;
end
// Assertion: count should never be greater than 10
always @(posedge clk) begin
assert (count <= 10) else $error("Count exceeded 10");
end
initial begin
#240 $finish; // Stop simulation after 240 time units
end
endmodule
OutputSuccess
Important Notes
Assertions run during simulation and help catch bugs early.
Use clear error messages to understand what went wrong.
Assertions do not change your design; they only check it.
Summary
Assertions check conditions automatically during simulation.
They help find errors quickly and clearly.
Use assertions to improve design quality and debugging.
Practice
(1/5)
1. What is the main purpose of an assertion in Verilog verification?
easy
A. To declare variables for testbench
B. To generate synthesis code for hardware
C. To automatically check if a condition is true during simulation
D. To optimize the design for speed
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 C
Quick Check:
Assertions check conditions automatically [OK]
Hint: Assertions check conditions during simulation automatically [OK]
Common Mistakes:
Confusing assertions with synthesis code
Thinking assertions declare variables
Assuming assertions optimize hardware
2. Which of the following is the correct syntax to write a simple immediate assertion in Verilog?
easy
A. assert property (signal == 1'b1);
B. assert(signal == 1'b1);
C. assert property signal == 1'b1;
D. assert(signal = 1'b1);
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 '=='.
D. assert property (@(posedge clk) valid ##3 valid);
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.