Shift register (SIPO, PISO, SISO) in Verilog - Time & Space Complexity
We want to understand how the time it takes to run a shift register changes as the number of bits grows.
How does the number of steps grow when we increase the size of the register?
Analyze the time complexity of the following Verilog code for a Serial-In Parallel-Out (SIPO) shift register.
module sipo_shift_register #(parameter N = 8) (
input wire clk,
input wire serial_in,
output reg [N-1:0] parallel_out
);
always @(posedge clk) begin
parallel_out <= {parallel_out[N-2:0], serial_in};
end
endmodule
This code shifts in one bit each clock cycle and outputs all bits in parallel after N cycles.
Look for loops or repeated steps in the code.
- Primary operation: Shifting bits in the register each clock cycle.
- How many times: Once per clock cycle, repeated N times to fill the register.
Each new bit requires one clock cycle to shift in, so the total time grows with the number of bits.
| Input Size (n) | Approx. Operations (clock cycles) |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The time grows directly with the number of bits; doubling bits doubles the time.
Time Complexity: O(n)
This means the time to shift in all bits grows linearly with the size of the register.
[X] Wrong: "The shift register processes all bits at once, so time does not depend on size."
[OK] Correct: Each bit must be shifted in one by one, so more bits mean more steps and more time.
Understanding how shift registers work and their timing helps you explain hardware design clearly and shows you can think about how systems scale.
"What if we changed the shift register to shift in multiple bits at once? How would the time complexity change?"
Practice
Solution
Step 1: Understand shift register types
SIPO means data enters serially and exits in parallel form.Step 2: Match the description
The question asks for serial input to parallel output, which matches SIPO.Final Answer:
SIPO (Serial-In Parallel-Out) -> Option DQuick Check:
Serial input to parallel output = SIPO [OK]
- Confusing PISO with SIPO
- Thinking SISO converts to parallel output
- Mixing up input and output directions
Solution
Step 1: Identify PISO input type
PISO shift register takes parallel input, so input must be a bus (multiple bits).Step 2: Check port declaration syntax
input [3:0] parallel_in correctly declares a 4-bit input bus.Final Answer:
input [3:0] parallel_in -> Option AQuick Check:
Parallel input uses input [3:0] [OK]
- Using output instead of input for inputs
- Declaring parallel input as single bit
- Confusing serial and parallel port directions
q after 3 clock cycles if d inputs are 1, 0, 1 respectively?reg [3:0] q;
always @(posedge clk) begin
q <= {q[2:0], d};
endSolution
Step 1: Understand shifting operation
Each clock, bits shift left and new bit d enters at LSB (rightmost).Step 2: Trace each clock cycle
Initial q=0000 (assumed).
Cycle 1: q=0000 -> shift left + d=1 -> 0001
Cycle 2: q=0001 -> shift left + d=0 -> 0010
Cycle 3: q=0010 -> shift left + d=1 -> 0101Final Answer:
4'b0101 -> Option AQuick Check:
Shift left + input d = 0101 after 3 cycles [OK]
- Assuming shift right instead of left
- Not updating q each cycle
- Mixing bit order in concatenation
module piso_shift(
input clk,
input [3:0] parallel_in,
input load,
output reg serial_out
);
reg [3:0] shift_reg;
always @(posedge clk) begin
if (load)
shift_reg <= parallel_in;
else
shift_reg <= shift_reg >> 1;
serial_out <= shift_reg[0];
end
endmoduleSolution
Step 1: Understand PISO operation
PISO outputs bits serially starting from the most significant bit (MSB), which is shift_reg[3] here.Step 2: Check serial_out assignment
Code assigns serial_out = shift_reg[0], which is the least significant bit (LSB), incorrect for PISO.Final Answer:
serial_out should output shift_reg[3], not shift_reg[0] -> Option BQuick Check:
PISO outputs MSB first = shift_reg[3] [OK]
- Assigning serial_out to LSB instead of MSB
- Confusing shift direction for PISO
- Thinking load must be asynchronous
Solution
Step 1: Identify required functionality
The design needs to convert parallel input to serial output, which matches PISO behavior.Step 2: Describe implementation
Load 8-bit parallel data into a register on load signal, then shift right each clock cycle outputting MSB (or LSB depending on design) as serial output.Final Answer:
Use a PISO shift register; load 8-bit data and shift out MSB serially each clock -> Option CQuick Check:
Parallel to serial = PISO shift register [OK]
- Choosing SIPO instead of PISO
- Confusing serial input with parallel input
- Using SISO which only shifts serial data
Ready to prove it?
Pass the test and this pattern moves unknown
