Casex 和 Casez
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 56 课,共 90 课。
有时,你只关心一个值中的特定部分,而其他部分可以忽略。例如,在优先编码器中,无论其他位是什么,你都想找到第一个 1 位。
普通的 case 语句要求你列出不关心位的所有可能组合,对于宽总线来说这是不可能的。
casez 和 casex 可以解决这个问题,它们允许你使用 ?、z 或 x 将某些位标记为“无关项”。
Casez、Casex 与普通 Case
| 语句 | 无关位 | 最适合 |
|---|---|---|
case | 无 | 精确匹配 |
casez | z 或 ? | 优先编码器(推荐) |
casex | x、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 或任何值。
挑战
要做什么:
添加缺少的 casez 语句,让这个解码器正常工作。
工作原理:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器