#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