Verilog Best Practice - Увеличение переменной - PullRequest
5 голосов
/ 05 ноября 2011

Я ни в коем случае не эксперт Verilog, и мне было интересно, знает ли кто-нибудь, какой из этих способов увеличить значение лучше. Извините, если это слишком простой вопрос.

Способ A:

В комбинационном логическом блоке, возможно, в автомате:

//some condition
count_next = count + 1;

А потом где-то в последовательном блоке:

count <= count_next;

или путь B:
Комбинационный блок:

//some condition
count_en = 1;

Последовательный блок:

if (count_en == 1)
  count <= count + 1;

Я видел Путь А чаще. Одним из потенциальных преимуществ способа B является то, что если вы увеличиваете одну и ту же переменную во многих местах вашего конечного автомата, возможно, он будет использовать только один сумматор вместо многих; или это ложь?

Какой метод предпочтительнее и почему? Есть ли у них существенный недостаток?

Спасибо.

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Каково ваше определение «лучше»? Это может быть лучшая производительность (более высокая максимальная частота синтезированной схемы), меньшая площадь (меньше логических элементов) или более быстрое выполнение моделирования.

Рассмотрим случай меньшей площади для ПЛИС Xilinx и Altera. Регистры в этих семействах FPGA имеют вход enable . В вашем «Пути B» * count_en * будет напрямую отображен в этот регистр enable , что приведет к меньшему количеству логических элементов. По сути, «Путь B» предоставляет больше «подсказок» инструменту синтеза, как лучше синтезировать эту схему. Также возможно, что большинство инструментов синтеза FPGA (я говорю о Xilinx XST, Altera MAP, Mentor Precision и Synopsl Synplify) правильно выведет регистр , разрешающий ввод из «Пути A».

Если * count_en * синтезирован как enable вход регистра, это приведет к повышению производительности схемы, поскольку логика приращения счетчика будет иметь меньше логических уровней.

Спасибо

1 голос
/ 05 ноября 2011

Одним из потенциальных преимуществ способа B является то, что если вы увеличиваете одну и ту же переменную во многих местах вашего конечного автомата, возможно, он будет использовать только один сумматор вместо многих; или это ложь?

Любой инструмент синтеза попытается автоматически распределить ресурсы. Насколько хорошо они это делают, зависит от инструмента и написанного кода. Вот документ, который описывает некоторые функции Design Compiler . Обратите внимание, что в некоторых случаях меньшая площадь означает худшее время.

Какой метод предпочтительнее и почему? Есть ли у них существенный недостаток?

Это зависит. Verilog (для синтеза) - это средство для реализации некоторой логической схемы, но в спецификации не указано, как именно это делается. Способ A может быть таким же, как путь B на FPGA, но путь A не согласуется с проектированием с низким энергопотреблением на ASIC из-за безусловного последовательного назначения. Использование сетей сброса является почти обязательным требованием для ASIC, но поскольку многие FPGA запускаются в известном состоянии, вы можете сэкономить немало ресурсов, не имея их.

1 голос
/ 05 ноября 2011

Я использую Путь A в своем коде Verilog.В моих последовательных блоках почти нет логики;они просто назначают регистры на основе значений «проводных регистров», вычисленных в комбинационных блоках всегда.Такого пути не будет.А с Verilog нам нужна вся помощь, которую мы можем получить.

...