SR16RE: 16-bit SIPO shift register with clock Enable and synchronous Reset

SR16RE is a 16-bit Serial In Parallel Out shift register, with a shift-left serial input (SLI), an active-high clock enable (CE), and an active-high synchronous reset (R).

The R, CE, and SLI inputs are examined on the low-to-high transition of the clock (C). If R is asserted, Q is set to 0. Otherwise, if CE is asserted, SLI is loaded to Q[0], and the remaining bits of Q shift up (left) by one bit. Otherwise, Q retains its previous value.

Verilog
module SR16RE(
  input  R, CE, SLI, C,
  output reg [15:0] Q);

  always @(posedge C)
    if(R)
      Q <= 0;
    else if(CE)
      Q <= {Q[14:0], SLI};
endmodule
VHDL
library IEEE;
use IEEE.std_logic_1164.all;

entity SR16RE is
  port (
    R, CE, SLI, C : in     std_logic;
    Q             : buffer std_logic_vector(15 downto 0));
end entity SR16RE;

architecture A of SR16RE is
begin
  process (C) is
  begin
    if rising_edge(C) then
      if R = '1' then
        Q <= (others => '0');
      elsif CE = '1' then
        Q(15 downto 1) <= Q(14 downto 0);
        Q(0) <= SLI;
      end if;
    end if;
  end process;
end architecture A;
Testbench
DUT {
   module SR16RE(input R, CE, SLI, C, output[15:0] Q);
   create_clock C;
   [R, CE, SLI, C] -> [Q];
}

main() {
   int   i;
   bit16 test = 16'habcd;        // test input data; arbitrary
   [1, 1, 1, .C] -> [0];         // reset
   [0, 0, 1, .C] -> [0];         // check CE

   // shift in the test data, top bit first
   for(i = 15; i >= 0; i--) {
      bit1 din = test.(i);
      [0, 1, din, .C] -> [test >> i];
   }
}