`default_nettype none module ser_shift ( input wire i_clk, input wire i_load, input wire [4:0] i_shamt, input wire i_shamt_msb, input wire i_signbit, input wire i_right, output wire o_done, input wire i_d, output wire o_q); reg signbit; reg [5:0] cnt; reg wrapped; always @(posedge i_clk) begin cnt <= cnt + 6'd1; if (i_load) begin cnt <= 6'd0; signbit <= i_signbit & i_right; end wrapped <= cnt[5] | (i_shamt_msb & !i_right); end assign o_done = (cnt[4:0] == i_shamt); assign o_q = (i_right^wrapped) ? i_d : signbit; endmodule