Когда мы синтезируем нашу программируемую логику, мы, конечно, можем выбирать из целого ряда вариантов синтеза. Например, мы можем ограничить fanout_limit или включить повторное время. На более высоком уровне мы также можем запросить механизм синтеза для оптимизации производительности или площади.

Однако когда у нас есть проект, содержащий несколько экземпляров разной сложности, возможности глобального синтеза могут быть ограничены.

Для некоторых высокопроизводительных экземпляров мы можем захотеть оптимизировать производительность, в то время как для других экземпляров такая оптимизация может быть пустой тратой ресурсов.

Другими словами, один размер очень часто не подходит всем.

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

Мы можем сделать это в Vivado, используя команды синтеза блоков, определенные в файле XDC.

Работая с блочным синтезом, мы можем определить как альтернативные стратегии синтеза для глобальной стратегии, так и применить более тонкий контроль над конкретными вариантами синтеза.

Когда дело доходит до стратегий синтеза для каждого экземпляра в проекте, мы можем применить одно из следующих действий:

  1. По умолчанию — пытается достичь баланса между площадью и производительностью.
  2. Area_Optimized — параметры синтеза сосредоточены на эффективной логике, а не на производительности.
  3. Alternative_Routability — улучшает маршрутизацию проекта, используя меньше ресурсов Mux F.
  4. Performance_optimized — параметры синтеза сосредоточены на производительности, а не на логике.

Подробную информацию о детальных настройках синтеза для каждой стратегии вы можете найти здесь.

Если мы хотим применить определенную стратегию к экземпляру, мы можем применить желаемую стратегию, используя приведенную ниже команду в файле XDF.

set_property BLOCK_SYNTH.STRATEGY {значение} [get_cells ‹имя экземпляра›]

Стратегии синтеза предлагают очень грубый уровень контроля над производительностью синтеза. Иногда нам требуется более детальное управление, поэтому мы также можем управлять следующими параметрами синтеза с помощью синтеза блоков: повторная синхронизация, пороговое значение сумматора, пороговое значение компаратора, минимальный размер SHREG, извлечение FSM, объединение LUT, пороговое значение набора элементов управления, максимальный ввод LUT. , Mux F Mapping и Keep Equivalent Registers.

Их также можно использовать в сочетании со стратегиями синтеза.

Как только мы решили применить опцию синтеза блоков к экземпляру, она распространяется вниз по иерархии этого экземпляра.

Конечно, мы также можем переопределить унаследованные параметры на более низких уровнях с помощью другого параметра синтеза блоков, как показано ниже.

Давайте завершим этот блог простым примером, основанным на плате Ultra96 и обновлении дизайна PL для моего недавнего проекта Ultra96 PetaLinux.

В этом проекте программируемая логика содержит контроллер AXI BRAM и AXI UART16550, которые можно увидеть на блок-схеме.

Выполнение синтеза в этом проекте со стратегией по умолчанию и без параметров синтеза блоков, определенных в файле XDC, приводит к использованию ресурсов, как указано ниже.

В этом примере мы установим параметр синтеза блоков на контроллере AXI BRAM для оптимизации производительности, в отличие от стратегии по умолчанию, которая будет применяться ко всем оставшимся блокам в проекте.

Повторно запустив синтез Vivado с применением этой опции блочного синтеза, мы можем увидеть небольшое увеличение количества LUT, используемых в решении.

Этого следует ожидать, поскольку применение оптимизации производительности к контроллеру AXI BRAM запретит совместное использование ресурсов, снизив максимально допустимое разветвление вместе с другими настройками, которые увеличат использование ресурсов.

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

Хотя представленный пример прост, возможность применять различные варианты синтеза может быть очень важна, когда мы работаем со сложными проектами.

Синтез блоков может быть особенно эффективным, когда мы работаем с перегруженными проектами — это проекты, в которых у нас возникают проблемы с достижением временного закрытия из-за перегрузки маршрутизации.

Мы можем получить отчет о перегрузке для проекта с помощью команды:

report_design_analysis — перегрузка

Как только экземпляр, вызывающий перегрузку, будет идентифицирован, мы можем применить параметр синтеза блоков, отключающий использование Mux F. Повторно запускающий синтез, который уменьшит перегрузку и улучшит временные характеристики.

В целом, блочный синтез является хорошим инструментом в наборе инструментов для разработчиков ПЛИС.

Посмотрите мои проекты FPGA/SoC:Адам Тейлор на Hackster.io

Получите код:ATaylorCEngFIET (Адам Тейлор)

Дополнительную информацию о разработке Xilinx FPGA/SoC можно найти еженедельно на MicroZed Chronicles.