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

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

Введение

Алгоритмы, смоделированные в Simulink для генерации HDL-кода, могут иметь несколько частот дискретизации. Эти многочисленные скорости могут быть частью модели Simulink или могут быть представлены с опциями HDL Coder, такими как избыточная дискретизация. При указанной избыточной дискретизации сгенерированного HDL-кода будет запускаться на FPGA с более высокой тактовой частотой. Эта более высокая скорость позволяет дополнительной оптимизации принимать эффект.

Когда HDL Coder сконфигурирован так, чтобы использовать один синхроимпульс, он генерирует контроллер синхронизации для управления тактовыми элементами, такими как задержки, при различных скоростях дискретизации с разрешениями синхроимпульса. Эти синхроимпульсы синхронны с одним синхроимпульсом и переключаются со скоростью, которая в несколько раз медленнее, чем у базового синхроимпульса. Пути данных между парами элементов с медленным тактовым генератором называются многоколесными каналами, потому что они позволяют данным принимать несколько тактов для перемещения. Однако инструменты синтеза не могут вывести эту приемлемую задержку непосредственно из HDL-кода. Инструменты предполагают, что данные изменяются каждый цикл и должны перемещаться от одного регистра к следующему в течение одного такта. Инструменты синтеза должны приложить больше усилий, чтобы удовлетворить чрезмерное требование времени и, следовательно, могут отказать во времени. Путем объявления набора путей данных в качестве многокилометровых путей и предоставления фактического определения времени этих путей нижестоящему инструменту синтеза, HDL Coder может упростить и ускорить процесс достижения требуемых временных ограничений для проекта.

Этот пример демонстрирует, как сгенерировать ограничения многоколесного пути в HDL Coder, так что могут быть заданы временные требования, что позволяет эффективно анализировать временные моменты в инструменте синтеза.

Применение многоколесных ограничений с помощью HDL Coder

В этом примере мы используем Xilinx Vivado 2016.4 результаты статического анализа синхронизации и маршрутизации для Virtex7 устройства (xc7v2000t, fhg1761, -1), чтобы показать влияние включенных ограничений многоколесного пути. Другие инструменты и устройства синтеза имеют сходное поведение. HDL Coder генерирует ограничительные файлы XDC- формата для Xilinx Vivado, UCF- формата для Xilinx ISE и SDC- формата для Altera Quartus II.

Рассмотрим пример, hdlcoder_multi_cycle_path_constraints.slx. Модель содержит конечная импульсная характеристика прямой формы с цепью сумматоров в критическом пути. Хотя скорость входных данных этого фильтра задана как 2MHz, мы хотим, чтобы этот проект выполнялся как можно быстрее, чтобы она могла быть интегрирована с другими IP, требующими высокой частоты. Мы начинаем с выбора 130MHz тактовой частоты без какой-либо оптимизации синхронизации путем установки коэффициента избыточной дискретизации на 65 и TargetFrequency на 130.

bdclose('all');
load_system('hdlcoder_multi_cycle_path_constraints');
open_system('hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'Oversampling', 65);
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'TargetFrequency', 130);
set_param('hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');

Сгенерируйте HDL с этими настройками и проверьте сгенерированную модель. Заметьте, что сгенерированная модель на самом деле идентична исходной модели.

makehdl('hdlcoder_multi_cycle_path_constraints/Subsystem');
load_system('gm_hdlcoder_multi_cycle_path_constraints');
set_param('gm_hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');
open_system('gm_hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
### Generating HDL for 'hdlcoder_multi_cycle_path_constraints/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_multi_cycle_path_constraints', { 'HDL Code Generation' } )">hdlcoder_multi_cycle_path_constraints</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_multi_cycle_path_constraints'.
### Begin compilation of the model 'hdlcoder_multi_cycle_path_constraints'...
### Applying HDL optimizations on the model 'hdlcoder_multi_cycle_path_constraints'...
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_multi_cycle_path_constraints'.
### MESSAGE: The design requires 65 times faster clock with respect to the base rate = 2.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.vhd.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_multi_cycle_path_constraints' completed.
### Writing Vivado multicycle constraints XDC file <a href="matlab:edit('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc')">hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples3/tpff0237be/hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_report.html
### HDL check for 'hdlcoder_multi_cycle_path_constraints' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Сгенерированный HDL не удовлетворяет требованиям времени для синхроимпульса в 130MHz. Как показано на фрагменте отчета о синхронизации ниже, требование к синхронизации составляет 7,692 нс (1/130MHz), и отрицательное ослабление указывает на нарушение этого требования. Отчеты о синхронизации других инструментов синтеза могут выглядеть по-другому, хотя критический путь от этого примера проекта останется неизменным.

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

open_system('hdlcoder_multi_cycle_path_constraints/Subsystem');

Заметьте, что подсистема Продукт окружена задержками, выполняемыми с желаемой 2MHz скоростью передачи данных. Из-за заданной 65-кратной избыточной дискретизации проект может терпеть несколько тактов, чтобы данные распространялись через него. HDL Coder требует, чтобы многоколесные области были окружены элементами с медленной синхронизацией, такими как эти задержки, так что ограничения могут определять пути между ними как многоколесные пути. Включите MulticyclePathConstraints, и HDL Coder сгенерирует дополнительный файл.

hdlset_param('hdlcoder_multi_cycle_path_constraints', 'MulticyclePathConstraints', 'on');

Мы можем даже увеличить целевую частоту до 300MHz.

hdlset_param('hdlcoder_multi_cycle_path_constraints', 'Oversampling', 150);
hdlset_param('hdlcoder_multi_cycle_path_constraints', 'TargetFrequency', 300);

Сгенерируйте ограничения HDL и многоколесного пути.

makehdl('hdlcoder_multi_cycle_path_constraints/Subsystem');
### Generating HDL for 'hdlcoder_multi_cycle_path_constraints/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_multi_cycle_path_constraints', { 'HDL Code Generation' } )">hdlcoder_multi_cycle_path_constraints</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_multi_cycle_path_constraints'.
### Begin compilation of the model 'hdlcoder_multi_cycle_path_constraints'...
### Applying HDL optimizations on the model 'hdlcoder_multi_cycle_path_constraints'...
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_multi_cycle_path_constraints'.
### MESSAGE: The design requires 150 times faster clock with respect to the base rate = 2.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Dot_Product.vhd.
### Working on Subsystem_tc as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_tc.vhd.
### Working on hdlcoder_multi_cycle_path_constraints/Subsystem as hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_multi_cycle_path_constraints' completed.
### Writing Vivado multicycle constraints XDC file <a href="matlab:edit('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc')">hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples3/tpff0237be/hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_report.html
### HDL check for 'hdlcoder_multi_cycle_path_constraints' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Проверьте сгенерированный файл ограничения XDC.

dbtype('hdl_prj/hdlsrc/hdlcoder_multi_cycle_path_constraints/Subsystem_constraints.xdc');
1     # Multicycle constraints for clock enable: Subsystem_tc.u1_d150_o0
2     set enbregcell [get_cells -hier -filter {mcp_info=="Subsystem_tc.u1_d150_o0"}]
3     set enbregnet [get_nets -of_objects [get_pins -of_objects $enbregcell -filter {DIRECTION == OUT}]]
4     set reglist [get_cells -of [filter [all_fanout -flat -endpoints_only $enbregnet] IS_ENABLE]]
5     set_multicycle_path 150 -setup -from $reglist -to $reglist -quiet
6     set_multicycle_path 149 -hold  -from $reglist -to $reglist -quiet
7     

Эти ограничения сначала находят щелчки, которые управляются 2MHz сигналом включения синхроимпульса. Затем они определяют пути среди этих многожильных путей щелчков, чтобы позволить распространению данных до 150 циклов.

Осмотрите сгенерированную модель.

open_system('gm_hdlcoder_multi_cycle_path_constraints/Subsystem/Dot Product');
set_param('gm_hdlcoder_multi_cycle_path_constraints', 'SimulationCommand', 'update');

Сгенерированная модель и HDL-код идентичны предыдущим результатам, потому что сгенерирование разрешенных ограничений многоколесного пути не изменяет архитектуру HDL. Проект ранее не мог соответствовать желаемому времени в 130MHz. Однако, когда вы задаете ограничения многоколесного пути, этот проект может запускаться в 300MHz на FPGA.

Дополнительная информация об ограничениях многоколесного пути:

Многоколесные ограничения пути требуются для инструментов синтеза, чтобы понять требования к синхронизации. Эта информация извлекается из модели Simulink, поскольку она не может быть выведена из сгенерированного HDL-кода. Ограничения многоколесного тракта идентифицируют пути между синхронизируемыми элементами, управляемые одним и тем же разрешением синхроимпульса. В некоторых случаях он может не соответствовать требованиям к синхронизации. Для примера пути данных не распознается как многоколесный путь, если она не стробируется с обеими задержками ввода и вывода или находится между двумя задержками различных скоростей. Поэтому, если вы хотите использовать ограничения многоколесного пути для определенных деталей в проекте, важно сохранить многоколесные пути в этой области от изменения оптимизациями, вводящими трубопроводы, такие как входной и выходная конвейеризация, тактовая частота конвейеризации, адаптивное совместное использование ресурсов конвейеризации, потоковая передача, конвейерные математические операции, например, метод Ньютона-Рафсона для sqrt или recip, Cordic алгоритм для тригонометрических функций и IP- отображения с плавающей точкой.