Menu
CoddyTech

Casex 和 Casez

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

有时,你只关心一个值中的特定部分,而其他部分可以忽略。例如,在优先编码器中,无论其他位是什么,你都想找到第一个 1 位。

普通的 case 语句要求你列出不关心位的所有可能组合,对于宽总线来说这是不可能的。

casez 和 casex 可以解决这个问题,它们允许你使用 ?、z 或 x 将某些位标记为“无关项”。

Casez、Casex 与普通 Case

语句无关位最适合
case无精确匹配
casezz 或 ?优先编码器(推荐)
casexx、z 或 ?避免使用(会隐藏错误)
  • casez 会忽略值为 z 或 ? 的位(推荐)
  • casex 还会忽略值为 x 的位,这可能会掩盖仿真错误

始终使用 casez,不要使用 casex。 casex 很危险,因为它会忽略 x 值(这些值通常表示寄存器未初始化或仿真错误)。casez 是更安全的替代方案,因为它不会将 x 视为无关项。

示例

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
endcase

? 表示“不关心”。这个位可以是 0、1 或任何值。

challenge icon

挑战

要做什么:

添加缺少的 casez 语句,让这个解码器正常工作。

工作原理:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 4'b1??? → out = 4'b1000
  • 默认情况 → out = 4'b0000

亲手试试

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: 添加 casez 语句
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  end
  
endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器