Linear Feedback Shift Register (LFSR) in Verilog - Time & Space Complexity
We want to understand how the time it takes for a Linear Feedback Shift Register (LFSR) to run grows as we change its size.
Specifically, how does the number of steps or operations change when the LFSR length changes?
Analyze the time complexity of the following code snippet.
module lfsr(
input logic clk, reset,
output logic [3:0] q
);
always_ff @(posedge clk or posedge reset) begin
if (reset) q <= 4'b0001;
else q <= {q[2:0], q[3] ^ q[0]};
end
endmodule
This code implements a 4-bit LFSR that shifts bits and uses XOR feedback to generate a sequence.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The shift and XOR feedback happen once every clock cycle.
- How many times: This operation repeats once per clock cycle indefinitely.
The LFSR shifts bits and calculates feedback every clock cycle, regardless of its size.
| Input Size (n bits) | Approx. Operations per Cycle |
|---|---|
| 4 | 4 shifts + 1 XOR |
| 8 | 8 shifts + 1 XOR |
| 16 | 16 shifts + 1 XOR |
Pattern observation: The number of shift operations grows linearly with the number of bits, but the XOR feedback count stays constant.
Time Complexity: O(n)
This means the time to perform one shift and feedback step grows linearly with the number of bits in the LFSR.
[X] Wrong: "The LFSR runs in constant time no matter how many bits it has."
[OK] Correct: Each bit must be shifted every cycle, so more bits mean more operations, making the time grow with size.
Understanding how hardware operations scale with input size helps you explain design choices clearly and shows you can think about efficiency in real circuits.
"What if we changed the LFSR to update multiple bits per clock cycle? How would the time complexity change?"
Practice
What is the main purpose of a Linear Feedback Shift Register (LFSR) in digital circuits?
Solution
Step 1: Understand LFSR function
An LFSR uses shift and XOR feedback to produce a sequence of bits that appears random.Step 2: Identify main use
This sequence is used for pseudo-random number generation and testing, not arithmetic or storage.Final Answer:
To generate a pseudo-random sequence of bits -> Option DQuick Check:
LFSR = pseudo-random bit generator [OK]
- Confusing LFSR with memory storage
- Thinking LFSR does arithmetic
- Assuming LFSR converts analog signals
Which of the following is the correct Verilog syntax to declare a 4-bit register named lfsr?
Solution
Step 1: Recall Verilog register declaration
Registers are declared withreg [msb:lsb] name;syntax.Step 2: Check each option
reg [3:0] lfsr; uses correct syntaxreg [3:0] lfsr;. reg lfsr[3:0]; uses wrong array style. wire [4:1] lfsr; uses wire, not reg. reg (3:0) lfsr; has invalid parentheses.Final Answer:
reg [3:0] lfsr; -> Option AQuick Check:
Correct reg syntax = reg [3:0] lfsr; [OK]
- Using wire instead of reg for registers
- Incorrect bit range order or syntax
- Using parentheses instead of brackets
Given this Verilog snippet for a 3-bit LFSR with taps at bits 3 and 2:
reg [2:0] lfsr = 3'b001;
always @(posedge clk) begin
lfsr <= {lfsr[1:0], lfsr[2] ^ lfsr[1]};
endWhat is the value of
lfsr after 1 clock cycle?Solution
Step 1: Calculate first clock cycle
Initial lfsr = 001. Feedback = lfsr[2]^lfsr[1] = 0^0=0.
New lfsr = {lfsr[1:0], feedback} = {0,1,0} = 010.Step 2: Confirm value
After 1 clock cycle, lfsr = 3'b010, which matches 3'b010.Final Answer:
3'b010 -> Option BQuick Check:
Shift and XOR feedback = 010 after 1 cycle [OK]
- Mixing bit order in concatenation
- Calculating feedback incorrectly
- Confusing initial and next states
Identify the error in this Verilog LFSR code snippet:
reg [3:0] lfsr = 4'b0000;
always @(posedge clk) begin
lfsr <= {lfsr[2:0], lfsr[3] ^ lfsr[0]};
endSolution
Step 1: Check initial value
LFSRs must not start with all zeros because they will stay stuck at zero forever (no feedback).Step 2: Verify other parts
Feedback taps and concatenation are valid for a 4-bit LFSR. Register size is correctly declared as 4 bits.Final Answer:
Initial value can't be all zeros in LFSR -> Option CQuick Check:
All-zero start = stuck LFSR [OK]
- Using zero initial value
- Misunderstanding feedback tap positions
- Incorrect bit concatenation order
You want to design an 8-bit LFSR in Verilog that cycles through all 255 non-zero states before repeating. Which of the following tap combinations is a valid maximal-length feedback polynomial?
Solution
Step 1: Recall maximal-length tap sets for 8-bit LFSR
Common maximal-length taps for 8-bit LFSR are bits 8 and 5 (1-based indexing).Step 2: Match options with known polynomials
Taps at bits 8 and 5 (lfsr[7] and lfsr[4]) matches a valid maximal-length set. Taps at bits 8 and 7 (lfsr[7] and lfsr[6]), 8 and 6 (lfsr[7] and lfsr[5]), and 8 and 4 (lfsr[7] and lfsr[3]) are not maximal-length taps.Step 3: Check indexing in Verilog (0-based)
Bits 8 and 5 correspond to lfsr[7] and lfsr[4], which is Taps at bits 8 and 5 (lfsr[7] and lfsr[4]).Final Answer:
Taps at bits 8 and 5 (lfsr[7] and lfsr[4]) -> Option AQuick Check:
Maximal taps for 8-bit LFSR = bits 8 and 5 [OK]
- Choosing non-maximal tap positions
- Confusing bit indexing (1-based vs 0-based)
- Assuming any two taps produce maximal length
Ready to prove it?
Pass the test and this pattern moves unknown
