case.v 1.44 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
`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