跳到主要内容

1.4.7 带casez的优先级编码器

构建一个适用于8位输入的优先编码器。给定一个8位向量,输出应报告向量中第一个(最低有效位)为1的位。如果输入向量中没有任何位置为1,则输出为零。例如,输入8'b10010000应输出3'd4,因为bit[4]是首次出现高电平的位。

从之前的练习(2.4.6 always_case2)来看,case语句中会有256种情况。如果我们使case语句中的case项支持“无关”位,则可以减少这种情况(减少到9种情况)。这就是casez的作用:它在比较时将值为z的位视为无关位。

例如,这将实现前一个练习中的4输入优先编码器:

always @(*) begin
casez (in[3:0])
4'bzzz1: out = 0; // in[3:1] can be anything
4'bzz1z: out = 1;
4'bz1zz: out = 2;
4'b1zzz: out = 3;
default: out = 0;
endcase
end

case语句的行为就像是依次检查每个项目(实际上是一个大的组合逻辑函数)。请注意,某些输入(例如,4'b1111)会匹配不止一个case项目。选择第一个匹配项(因此,4'b1111匹配第一个项目,out = 0,但不匹配后面的项目)。

  • 还有一个类似的casex,它将x和z都视为无关位。我认为相比casez,使用它没有什么特别的目的。
  • 符号?是z的同义词,所以2'bz0与2'b?0相同。

直接明确指定优先级行为可能会减少错误,而不是依赖于case项目的排序。例如,即使某些case项目被重新排序,以下代码的行为仍然相同,因为任何位模式最多只能匹配一个case项目:

casez (in[3:0])
4'bzzz1: ...
4'bzz10: ...
4'bz100: ...
4'b1000: ...
default: ...
endcase

模块声明

// synthesis verilog_input_version verilog_2001
module top_module (
input [7:0] in,
output reg [2:0] pos );

做题区