This testbench runs all three types of shift registers. It shows how bits move through SISO and SIPO with serial input, and how PISO outputs serial data after loading parallel input.
module test_shift_register();
reg clk = 0;
reg reset;
reg serial_in;
reg load;
reg [3:0] parallel_in;
wire serial_out_siso;
wire [3:0] parallel_out_sipo;
wire serial_out_piso;
// Instantiate SISO
SISO_shift_register siso(.clk(clk), .reset(reset), .serial_in(serial_in), .serial_out(serial_out_siso));
// Instantiate SIPO
SIPO_shift_register sipo(.clk(clk), .reset(reset), .serial_in(serial_in), .parallel_out(parallel_out_sipo));
// Instantiate PISO
PISO_shift_register piso(.clk(clk), .reset(reset), .load(load), .parallel_in(parallel_in), .serial_out(serial_out_piso));
// Clock generation
always #5 clk = ~clk;
initial begin
reset = 1; serial_in = 0; load = 0; parallel_in = 4'b1010;
#10 reset = 0;
// Test SISO and SIPO with serial input 1,0,1,1
serial_in = 1; #10;
serial_in = 0; #10;
serial_in = 1; #10;
serial_in = 1; #10;
// Test PISO load and shift
load = 1; #10;
load = 0; #40;
$finish;
end
initial begin
$monitor($time, " clk=%b reset=%b serial_in=%b load=%b parallel_in=%b | SISO_out=%b SIPO_out=%b PISO_out=%b",
clk, reset, serial_in, load, parallel_in, serial_out_siso, parallel_out_sipo, serial_out_piso);
end
endmodule