blob: 809e3f733591268ff8230b1df8dbb7f019e9f91d [file] [log] [blame] [edit]
`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/