module Ext(
    input  [31:0] DataIn,
    input  [1:0]  ExtOp,
    output [31:0] DataOut
);
    wire [31:0] imm12, imm16, imm20, imm26;
    assign imm12 = {{20{DataIn[21]}}, DataIn[21:10]};
    assign imm16 = {{14{DataIn[25]}}, DataIn[25:10], 2'b0};
    assign imm20 = {DataIn[24:5], 12'b0};
    assign imm26 = {{4{DataIn[9]}}, DataIn[9:0], DataIn[25:10], 2'b0};

    reg [31:0] temp_DataOut;
    always @(*) begin
        case (ExtOp)
            2'b00: temp_DataOut = imm12;
            2'b01: temp_DataOut = imm16;
            2'b10: temp_DataOut = imm20;
            2'b11: temp_DataOut = imm26;
            default: temp_DataOut = 32'hxxxxxxxx;
        endcase
    end
    assign DataOut = temp_DataOut;
endmodule