Verilog: более эффективный способ использования троичного оператора

#conditional-statements #verilog #assign #conditional-operator #hdl

#условные операторы #verilog #назначить #условный оператор #hdl

Вопрос:

Я написал следующее 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. Это отлично работает, как я и предполагал, но я ищу более эффективный способ написания частей «ИЛИ». Есть ли более эффективный способ написать это?

Ответ №1:

Здесь нет необходимости в троичном операторе. Результат каждого равенства ( == ) равен 1 биту, и вы выполняете побитовое ИЛИ ( | ). Вероятно, вам следует использовать логическое ИЛИ ( || ), результат которого также является 1-битным.

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

В SystemVerilog, который поддерживает большинство инструментов, вы можете использовать внутренний оператор

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

Ответ №2:

Нет, следует использовать каждое полное выражение, разделенное | . Однако в этой конкретной ситуации вы можете использовать (BCD >= 4'd1) amp; (BCD <= 4'd5) .

Комментарии:

1. Вы должны использовать логическое ИЛИ || , а не побитовое ИЛИ |

2. @dave_59 Действительно, здесь || следует использовать в соответствии со стандартом. Но я хотел бы обрабатывать одноразрядные промежуточные выражения как анонимные провода и выполнять операции с битовыми данными.

Ответ №3:

Поскольку ваши значения находятся в непрерывном диапазоне, это можно упростить как:

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

Если ваш набор инструментов поддерживает синтаксис SystemVerilog, вы также можете использовать inside оператор. Обратитесь к стандарту IEEE Std 1800-2017, раздел 11.4.13, оператор набора членства.

Ответ №4:

Есть несколько способов сделать это:

а) Проверка границ.

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

б) Сокращение ИЛИ проверка высокого предела.

 assign F = |BCD amp; (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