init
would need to be a content to work inside of an initial
block and it would only work for RTL simulation and some FPGAs. Most synthesizers ignore initial
blocks. A better approach is to add a bit to load. It is a good idea to out non-blocking assignments to registers. You can save a flop with dataOut
by using an assign statement.
always @(posedge CLK) begin
if (LOAD) Q <= init;
else if (EN) Q <= {in,Q[n-1:1]};
end
assign dataOut = Q[0];