Verilog:使用三元运算符的更有效方法

Verilog: More efficient way to use ternary operator

我写了以下assign声明:

assign F = (BCD == 4'd1 | BCD == 4'd2 | BCD == 4'd3 | BCD == 4'd4 | BCD == 4'd5) ? 1'b1 : 1'b0;

如果 BCD 输入(4 位)为 1-5,则函数 returns 为 1,否则 returns 为 0。这完全符合我的预期,但我正在寻找一种更有效的方式来编写“或”部分。有没有更高效的写法?

由于您的值处于连续范围内,因此可以简化为:

assign F = ((BCD >= 4'd1) && (BCD <= 4'd5));

如果您的工具集支持 SystemVerilog 语法,您还可以使用 inside 运算符。请参阅 IEEE 标准 1800-2017,第 11.4.13 节 设置成员资格运算符

不,应该使用 | 分隔的每个完整表达式。但是,在这种特殊情况下,您可以使用 (BCD >= 4'd1) & (BCD <= 4'd5).

这里不需要三元运算符。每个等式 (==) 的结果是 1 位,而你正在做 bit-wise OR (|)。您可能应该使用 logical OR (||),其结果也是 1 位。

assign F = (BCD == 4'd1 || BCD == 4'd2 || BCD == 4'd3 || BCD == 4'd4 || BCD == 4'd5);

在大多数工具都支持的SystemVerilog中,可以使用inside operator

assign F = BCD inside {[1:5]}; //  contiguous range
assign F = BCD inside {[1:3],5, [7:10]}; //  noncontiguous values

有几种方法可以做到这一点:

a) 边界检查。

assign F = (BCD > 4'd0) & (BCD < 4'd6);

b) OR 减少和上限检查。

assign F = |BCD & (BCD < 4'd6);

c) 这是一个行为硬件描述,它会被综合工具优化。不过,它是参数化的。

localparam LOW = 1;
localparam HIGH = 5;
integer i;
reg F;
always @ (*) begin
  F = 1'b0;
  for(i = LOW; i <= HIGH; i = i + 1) begin: val_check
    if(BCD == i[3:0]) F = 1'b1;
  end
end