【问题标题】:Verilog: More efficient way to use ternary operatorVerilog:使用三元运算符的更有效方式
【发布时间】:2020-12-15 20:11:01
【问题描述】:

我写了以下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,则函数返回 1,否则返回 0。这完全符合我的预期,但我正在寻找一种更有效的编写方式“或”部分。有没有更有效的方法来写这个?

【问题讨论】:

    标签: conditional-statements verilog assign conditional-operator hdl


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您应该使用逻辑 OR || 而不是按位 OR |
      • @dave_59 确实,这里||应该按照标准使用。但我想将一位中间表达式视为匿名线路,并执行按位操作。
      【解决方案3】:

      这里不需要三元运算符。每个相等的结果 (==) 都是 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操作符

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

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-19
          • 2020-07-22
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 2021-08-01
          • 2021-08-20
          相关资源
          最近更新 更多