Плохая практика - использовать длинные вложенные if-else в операторе assign?

Иногда я использую длинный оператор assign в Verilog, который имеет вложенный цикл if-else.

Пример

assign a = (b) ? '1 : ((c&d) ? '0 : ((f&h) ? '1 : '0));

Другой способ сделать это - использовать логический блок always_comb. Однако описанный выше подход экономит время и упрощает быстрое кодирование.


person newbie    schedule 15.04.2014    source источник
comment
Что не так с: assign a = b | (~(c&d) & f & h)?   -  person Qiu    schedule 15.04.2014
comment
Ответ на этот вопрос, вероятно, является скорее личным, но в целом длинные вложенные условные операторы, подобные этому, считаются плохим стилем программирования, потому что их трудно отлаживать и сложно поддерживать: cse.psu.edu/~cg577/DOCUMENTS/codingstandards/verilog.html   -  person Ari    schedule 15.04.2014
comment
Создает ли это дополнительную нагрузку на инструмент синтеза?   -  person newbie    schedule 15.04.2014
comment
@Qiu, a не может быть одним битом, поскольку значения присваивания - это SystemVerilog '0 и '1, поэтому ваше уравнение не обязательно эквивалентно.   -  person Greg    schedule 15.04.2014
comment
@newbie: Я не думаю, что сравнение if-else и условного присваивания влияет на синтез. Когда дело доходит до отладки, гораздо проще установить точки останова в разных разделах вложенного оператора if-else, но условное присвоение обычно считается одной точкой останова.   -  person Ari    schedule 16.04.2014
comment
@Greg: эквивалентно добавлению оператора репликации.   -  person Qiu    schedule 16.04.2014
comment
@newbie Пример реализуется как большой мультиплексор. Если вы хотите уменьшить размер мультиплексора (в зависимости от спецификации), разделите код. Это то, что вы ищете? Я могу объяснить больше   -  person chitranna    schedule 18.04.2014
comment
@Law, мне просто любопытно узнать, является ли это обычной практикой делать вложенные if-else в assign и может ли это создать какие-либо проблемы с инструментом синтеза. Думаю, я получил ответ. Спасибо! Если есть проблема с синхронизацией, то, очевидно, я бы ее перекодировал.   -  person newbie    schedule 18.04.2014


Ответы (2)


Форматирование

Нет ничего плохого во вложенном условном непрерывном присваивании, но есть способы сделать его более читабельным:

assign a = (b)    ? '1
         : (c&d)  ? '0
         : (f&h)  ? '1
                  : '0;

Тем не менее, это все еще структура типа «if ... else if ... else if ... else», и вопрос, который вы должны задать себе, заключается в том, что этот код должен делать и как он будет «читать». Вышеупомянутое может быть легче читать (при синтезе того же кода), если это код, использующий структуру always и "" if ... else if ... else if ... else ".

Вот пример чистого использования вложенного условного непрерывного присваивания:

assign a = (state == STATE1) ? '1
         : (state == STATE2) ? '0
         : (state == STATE3) ? '1 
           /* default */     : '0;

Читаемость

Учтите, что показанная вами форма может сэкономить время при первоначальном наборе кода, но гораздо более важно, чтобы ваш код был читаемым. Будь то вы или другой дизайнер, просмотрев код через год или больше, они оценят форму, которая позволяет им быстро понять, что делает логика.

Кодирование можно ускорить без потери читабельности с помощью редактора, который поддерживает автоматически расширяющиеся фрагменты (или сокращения). Я использую vim с сокращениями, которые действительно ускоряют ввод всей блочной структуры, и сценариями выравнивания, которые позволяют мне вертикально выровнять заданный символ (например, «=» или «(») или строку при выборе.

person Marcin K    schedule 15.04.2014

Ответ на этот вопрос, вероятно, является личным мнением, но в целом длинные вложенные условные операторы, подобные этому, считаются плохим стилем программирования, потому что их сложно отлаживать и сложно поддерживать: http://cse.psu.edu/~cg577/DOCUMENTS/codingstandards/verilog.html

Помимо if-else в always_comb вы также можете использовать оператор case:

casez ({b,c,d,f,h})
    5'b1????: '1
    5'b011??: '0
    5'b00011: '1
    default: '0
endcase

Вы также можете квалифицировать casez с priority, unique, and unique_0.

person Ari    schedule 15.04.2014
comment
Я предпочитаю case(1'b1) и if() .. else if () .. else, а не casez(). Когда количество выбранных битов растет, масштабировать легче. Плюс меньше ? писать. - person Greg; 15.04.2014
comment
@Greg: Я согласен, в некоторых случаях случай (1'b1) имеет больше смысла! - person Ari; 16.04.2014