
本题链接:
https://hdlbits.01xz.net/wiki/Always_case
Verilog中的case语句几乎等同于多个if-elseif-else,它将一个表达式与其他表达式的列表进行比较。它的语法和功能于C中的switch语句不同。
always @(*) begin // This is a combinational circuit
case (in)
1'b1: begin
out = 1'b1; // begin-end if >1 statement
end
1'b0: out = 1'b0;
default: out = 1'bx;
endcase
end case语句以case开头,每个“case项”以冒号结尾而不是“switch”。
每个case项只能执行一条语句,这使得C中使用的“break”变得不必要。但这意味着,如果在一个case项中执行多个语句,则必须使用begin ... end
允许重复(部分重叠)case项,此时使用第一个匹配的。然而C不允许重复的case项。
如果有大量的cases,case语句比if语句更方便。在本练习中你需要创建一个当sel在0和5之间时选择相应的数据输入的6:1多路复用器。如果sel不在0和5之间则输出0。数据输入和输出均为4位宽。注意可能会导致的锁存(请参阅always_if2)
// synthesis verilog_input_version verilog_2001
module top_module (
input [2:0] sel,
input [3:0] data0,
input [3:0] data1,
input [3:0] data2,
input [3:0] data3,
input [3:0] data4,
input [3:0] data5,
output reg [3:0] out );
// synthesis verilog_input_version verilog_2001
module top_module (
input [2:0] sel,
input [3:0] data0,
input [3:0] data1,
input [3:0] data2,
input [3:0] data3,
input [3:0] data4,
input [3:0] data5,
output reg [3:0] out );//
always@(*) begin // This is a combinational circuit
case (sel)
3'b000: begin
out = data0; // begin-end if >1 statement
end
3'b001: begin
out = data1; // begin-end if >1 statement
end
3'b010: begin
out = data2; // begin-end if >1 statement
end
3'b011: begin
out = data3; // begin-end if >1 statement
end
3'b100: begin
out = data4; // begin-end if >1 statement
end
3'b101: begin
out = data5; // begin-end if >1 statement
end
default: out = 0;
endcase
end
endmodule

case 语句是一种多路条件分支的形式,可以解决 if 语句中有多个条件选项时使用不方便的问题。
case 语句格式如下:
case(case_expr)
condition1 : true_statement1 ;
condition2 : true_statement2 ;
……
default : default_statement ;
endcase case 语句执行时,如果 condition1 为真,则执行 true_statement1 ; 如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。如果各个 condition 都不为真,则执行 default_statement 语句。
default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。
条件选项可以有多个,不仅限于 condition1、condition2 等,而且这些条件选项不要求互斥。虽然这些条件选项是并发比较的,但执行效果是谁在前且条件为真谁被执行。
ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。case 语句支持嵌套使用。
参考资料:
4.6 Verilog 条件语句 | 菜鸟教程: https://www.runoob.com/w3cnote/verilog-case.html