D flip-flop with asynchronous reset in Verilog - Time & Space Complexity
We want to understand how the time needed to run a D flip-flop with asynchronous reset changes as inputs change.
Specifically, how does the circuit's behavior scale with input signals over time?
Analyze the time complexity of the following code snippet.
module dff_async_reset (
input wire clk,
input wire rst_n,
input wire d,
output reg q
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1'b0;
else
q <= d;
end
endmodule
This code models a D flip-flop that updates its output on the clock's rising edge or resets immediately when reset is low.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The flip-flop updates output on every clock cycle or reset event.
- How many times: Once per clock cycle or reset signal change, repeating continuously as the clock runs.
Each clock cycle triggers one update, so the number of operations grows directly with the number of clock cycles.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 clock cycles | 10 updates |
| 100 clock cycles | 100 updates |
| 1000 clock cycles | 1000 updates |
Pattern observation: The operations increase linearly as the number of clock cycles increases.
Time Complexity: O(n)
This means the work done grows in a straight line with the number of clock cycles or reset events.
[X] Wrong: "The flip-flop updates multiple times per clock cycle, so complexity is higher."
[OK] Correct: The flip-flop only updates once per clock edge or reset event, so operations do not multiply within a single cycle.
Understanding how hardware elements like flip-flops behave over time helps you reason about timing and performance in digital designs.
"What if we added a synchronous reset instead of asynchronous? How would the time complexity change?"
Practice
What does the asynchronous reset in a D flip-flop do?
Solution
Step 1: Understand asynchronous reset behavior
Asynchronous reset forces the output to zero immediately, without waiting for the clock edge.Step 2: Compare with other options
Other options describe clock-dependent or toggling behavior, which is not asynchronous reset.Final Answer:
It clears the output immediately, ignoring the clock signal. -> Option BQuick Check:
Asynchronous reset = immediate clear [OK]
- Confusing asynchronous reset with synchronous reset
- Thinking reset waits for clock edge
- Mixing reset with toggle or clock enable
Which of the following is the correct Verilog sensitivity list for a D flip-flop with asynchronous reset?
module dff(input clk, input rst_n, input d, output reg q);
Solution
Step 1: Identify asynchronous reset sensitivity
Asynchronous reset triggers on reset signal edge, so sensitivity list must include clock posedge and reset negedge.Step 2: Check syntax correctness
always @(posedge clk or negedge rst_n) uses 'or' to combine posedge clk and negedge rst_n, which is correct syntax.Final Answer:
always @(posedge clk or negedge rst_n) -> Option CQuick Check:
Sensitivity list uses 'or' for async reset [OK]
- Using 'and' instead of 'or' in sensitivity list
- Omitting reset from sensitivity list
- Using only clock edge without reset
Given the following Verilog code, what is the value of q after the reset is deasserted and one clock rising edge occurs with d = 1?
module dff(input clk, input rst_n, input d, output reg q);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 0;
else
q <= d;
end
endmoduleSolution
Step 1: Analyze reset effect
When rst_n is low, q is set to 0 immediately.Step 2: Analyze clock edge after reset
After reset is released (rst_n=1), on next posedge clk, q takes value of d, which is 1.Final Answer:
q = 1 -> Option AQuick Check:
After reset, q follows d on clock edge [OK]
- Assuming q stays 0 after reset
- Ignoring clock edge for q update
- Thinking q is undefined after reset
Identify the error in this D flip-flop with asynchronous reset code snippet:
always @(posedge clk or posedge rst_n) begin
if (!rst_n)
q <= 0;
else
q <= d;
endSolution
Step 1: Check reset polarity
The reset is active low, so sensitivity should be on negedge rst_n, not posedge.Step 2: Verify reset condition
The condition uses !rst_n correctly for active low reset.Final Answer:
Reset edge should be negedge, not posedge. -> Option AQuick Check:
Active low reset uses negedge in sensitivity [OK]
- Using posedge for active low reset
- Confusing reset polarity and condition
- Adding unnecessary clock edges
You want to design a D flip-flop with asynchronous reset that sets q to 1 when reset is active (active low). Which code snippet correctly implements this behavior?
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
q <= 1;
else
q <= d;
endSolution
Step 1: Check reset polarity and action
Reset is active low (negedge rst_n), and when active (!rst_n), q is set to 1 as required.Step 2: Verify normal operation
When reset is not active, q follows d on clock rising edge.Final Answer:
This code correctly sets q to 1 on reset and updates q on clock. -> Option DQuick Check:
Active low reset sets q=1, else q=d [OK]
- Assuming reset must clear q to 0
- Using posedge for active low reset
- Reversing reset condition logic
Ready to prove it?
Pass the test and this pattern moves unknown
