module mux2 (S,A,B,Y); input S; input A,B; output reg Y; always @(*) Y = (S)? B : A; endmodule module mux4 ( S, D, Y ); input[1:0] S; input[3:0] D; output Y; reg Y; wire[1:0] S; wire[3:0] D; always @* begin case( S ) 0 : Y = D[0]; 1 : Y = D[1]; 2 : Y = D[2]; 3 : Y = D[3]; endcase end endmodule module mux8 ( S, D, Y ); input[2:0] S; input[7:0] D; output Y; reg Y; wire[2:0] S; wire[7:0] D; always @* begin case( S ) 0 : Y = D[0]; 1 : Y = D[1]; 2 : Y = D[2]; 3 : Y = D[3]; 4 : Y = D[4]; 5 : Y = D[5]; 6 : Y = D[6]; 7 : Y = D[7]; endcase end endmodule module mux16 (D, S, Y); input [15:0] D; input [3:0] S; output Y; assign Y = D[S]; endmodule module top ( input [3:0] S, input [15:0] D, output M2,M4,M8,M16 ); mux2 u_mux2 ( .S (S[0]), .A (D[0]), .B (D[1]), .Y (M2) ); mux4 u_mux4 ( .S (S[1:0]), .D (D[3:0]), .Y (M4) ); mux8 u_mux8 ( .S (S[2:0]), .D (D[7:0]), .Y (M8) ); mux16 u_mux16 ( .S (S[3:0]), .D (D[15:0]), .Y (M16) ); endmodule