`default_nettype none

module Example(
    input wire [1:0] select,
    // This is an array of 3 (4-bit wide) elements
    output wire [11:0] data
);
    // Unflatten the array
    wire [3:0] __data[2:0];
    assign data = {__data[2], __data[1], __data[0]};

    UniqueCase case0(.select(select), .data(__data[0]));
    WildcardCase case1(.select(select), .data(__data[1]));
    DefaultCase case2(.select(select), .data(__data[2]));

endmodule

module UniqueCase(
    input wire [1:0] select,
    output reg [3:0] data
);

    always @* begin
        data = 4'b0;
        // Unique keyword doesn't exist in Verilog
        case(select)
            2'd0: data = 4'ha;
            2'd1: data = 4'h6;
            2'd2: data = 4'h3;
        endcase
    end

endmodule

module WildcardCase(
    input wire [1:0] select,
    output reg [3:0] data
);

    always @* begin
        data = 4'b0;
        // Unique keyword doesn't exist in Verilog
        // casez doesn't exist in VTR, so manually elaborating it
        case(select) // casez
            2'b00: data = 4'h3;
            // 2'b1?: data = 4'hd;
            2'b10: data = 4'hd;
            2'b11: data = 4'hd;
        endcase
    end

endmodule

module DefaultCase(
    input wire [1:0] select,
    output reg [3:0] data
);

    always @* begin
        data = 4'b0;
        case (select)
            2'b00: data = 4'h7;
            2'b01: data = 4'h9;
            default: data = 4'h8;
        endcase
    end

endmodule