Menu
CoddyTech

Case 语句

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 55 课,共 90 课。

case 语句可以根据单个表达式的值,在许多不同操作中进行选择。与多个 if-else 语句相比,如果要将同一个变量与许多不同的值进行比较,使用它会更简洁。

case 语句会将表达式与一组值进行比较,并执行匹配的代码块。它类似于多路分支。

语法:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

强烈建议在组合 case 语句中始终包含 default。如果没有 default,当 sel 取值不在任何 case 分支中时,out 不会被赋值,并会保留之前的值。当 sel 的值仅由 0 和 1 位组成,但没有对应分支时,综合会构建出非预期的存储器(锁存器),而不是纯组合逻辑。在仿真中,sel 上的 X 或 Z 也会使 out 保持不变,但不会创建锁存器。

简单示例

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

如果 sel 是 00,out 就取值 a。如果 sel 是 01,out 就取值 b。如果 sel 是 10,out 就取值 c。

否则,out 会得到 0。

每个分支中的多条语句

使用 begin 和 end 来包含多条语句:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

重要规则

规则说明
case 值应该唯一如果有重复值,只会执行第一个匹配的分支
值的位宽应该匹配写 2'b01,不要写 1'b1(较短的值会用零补齐)
default 是可选的,但建议使用用于捕获未映射的值
没有 default 时,未映射的值会导致锁存器在组合逻辑中

Case 与 If-Else

 CaseIf-Else
适用于一个变量,多个值复杂条件
可读性非常清晰可能变得杂乱
示例多路复用器、解码器比较器、范围检查
challenge icon

挑战

补全 case 语句

要做什么:

添加缺失的 case 语句,让这个多路复用器正常工作。

工作原理:

  • 当 select = 2'b00 时,result = in0
  • 当 select = 2'b01 时,result = in1
  • 当 select = 2'b10 时,result = in2
  • 当 select = 2'b11 时,result = in3

亲手试试

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: 添加 case 语句
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // default -> result = 0
  end
  
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器