`default_nettype none module Example( input logic [1:0] select, // This is an array of 3 (4-bit wide) elements output logic [2:0][3:0] data ); UniqueCase case0(.select, .data(data[0])); WildcardCase case1(.select, .data(data[1])); DefaultCase case2(.select, .data(data[2])); endmodule module UniqueCase( input logic [1:0] select, output logic [3:0] data ); always_comb begin data = 4'b0; unique case(select) 2'd0: data = 4'ha; 2'd1: data = 4'h6; 2'd2: data = 4'h3; /* unique means that the toolchain can assume 2'd3 will never happen */ endcase end endmodule module WildcardCase( input logic [1:0] select, output logic [3:0] data ); always_comb begin data = 4'b0; unique casez(select) 2'b00: data = 4'h3; 2'b1?: data = 4'hd; // Unique means that the toolchain can assume 2'b01 will never happen endcase end endmodule module DefaultCase( input logic [1:0] select, output logic [3:0] data ); always_comb begin data = 4'b0; case (select) 2'b00: data = 4'h7; 2'b01: data = 4'h9; default: data = 4'h8; endcase end endmodule // There is also a casex construct, but it is very dangerous and not recommend to be used in real designs. // https://www.verilogpro.com/verilog-case-casez-casex/