В этом примере показано, как использовать оптимизацию потоковой передачи на уровне подсистемы в кодере HDL.
Потоковая передача - это оптимизация по всей подсистеме, поддерживаемая кодером HDL для реализации оборудования, эффективного по площади. По умолчанию кодер реализует аппаратное обеспечение, которое является битовой и циклической точностью для модели Simulink. Это означает, что векторные пути данных в Simulink неэффективно сопоставляются аппаратным средствам. Рассмотрим блок продукта в Simulink, который работает на двух 64-элементных векторных входах и генерирует 64-элементный векторный выход. Этот блок выполняет 64 умножения за один временной шаг Simulink. Для сохранения точности цикла кодер HDL отображает этот блок в 64 параллельных умножителя в сгенерированном коде HDL. Учитывая, что множители на FPGA стоят дорого, это неэффективная аппаратная реализация.
Потоковая передача - это оптимизация, которая выравнивает векторный путь данных до скалярного или меньшего размера. Идея состоит в том, чтобы сериализовать выполнение параллельных аппаратных средств, чтобы ресурсы могли совместно использоваться, и векторные данные могли быть мультиплексированы по времени по совместно используемым ресурсам.
Рассмотрим следующий пример модели, которая работает на 24-элементном векторном пути данных. Эта модель содержит 3 усиления вектора и 2 добавления вектора, что приводит к аппаратной реализации, содержащей 72 умножителя и 24 сумматора. Это можно подтвердить путем создания отчета об использовании ресурсов при создании кода HDL.
bdclose all; load_system('hdl_areaopt1'); open_system('hdl_areaopt1/Controller'); hdlset_param('hdl_areaopt1/Controller', 'StreamingFactor', 0); hdlset_param('hdl_areaopt1', 'ResourceReport', 'on'); makehdl('hdl_areaopt1/Controller');
### Generating HDL for 'hdl_areaopt1/Controller'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_areaopt1', { 'HDL Code Generation' } )">hdl_areaopt1</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_areaopt1'.
### Begin compilation of the model 'hdl_areaopt1'...
### Applying HDL optimizations on the model 'hdl_areaopt1'...
### Begin model generation.
### Model generation complete.
### Begin VHDL Code Generation for 'hdl_areaopt1'.
### Working on hdl_areaopt1/Controller as hdlsrc/hdl_areaopt1/Controller.vhd.
### Generating package file hdlsrc/hdl_areaopt1/Controller_pkg.vhd.
### Code Generation for 'hdl_areaopt1' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/Controller_report.html
### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

Эффективная реализация области той же модели может быть реализована путем установки положительного целого значения для параметра реализации StreamingFactor в подсистеме. Этот параметр определяет степень масштабирования пути данных - чем выше значение, тем больше экономия площади. В этом примере мы имеем 24-элементный векторный путь данных; чтобы полностью масштабировать его, укажите значение StreamingFactor, равное 24. Это можно сделать либо с помощью диалогового окна свойств блока HDL (открываемого щелчком правой кнопкой мыши по подсистеме «Controller»), либо с помощью команды 'hdlset _ param'.
Генерируя код HDL с параметром StreamingFactor, равным 24, генерирует HDL, использующий только 3 умножителя и 2 сумматора (см. отчет о ресурсах после генерации кода HDL). Потоковая архитектура реализуется как локальная многоскоростная или в односкоростном режиме в зависимости от контекста потоковой подсистемы. Если логика подсистемы работает с более медленной частотой дискретизации или если коэффициент избыточной дискретизации установлен в значение больше единицы, то конвейерная обработка тактовой частоты запускается, и потоковая подсистема реализуется как многоцикловая односкоростная архитектура. Дополнительные сведения см. в разделе Односкоростная архитектура совместного использования ресурсов. Во всех остальных случаях создается локальная многоскоростная реализация, как описано в этом примере. Элементы векторного пути данных передаются с более высокой скоростью (в данном случае в 24 раза быстрее и обозначены красным цветом), и все вычисления работают на скалярном пути данных. На выходах вектор восстанавливается, используя задержку с отводом, и выходной сигнал дискретизируется обратно с более низкой скоростью (зеленым цветом).
hdlset_param('hdl_areaopt1/Controller', 'StreamingFactor', 24); hdlset_param('hdl_areaopt1', 'GenerateValidationModel', 'on'); makehdl('hdl_areaopt1/Controller'); open_system('gm_hdl_areaopt1/Controller'); %set_param('gm_hdl_areaopt1', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_areaopt1/Controller'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_areaopt1', { 'HDL Code Generation' } )">hdl_areaopt1</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_areaopt1'.
### Begin compilation of the model 'hdl_areaopt1'...
### Applying HDL optimizations on the model 'hdl_areaopt1'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdl_areaopt1_vnl')">gm_hdl_areaopt1_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_areaopt1'.
### MESSAGE: The design requires 24 times faster clock with respect to the base rate = 2.
### Working on Controller_tc as hdlsrc/hdl_areaopt1/Controller_tc.vhd.
### Working on hdl_areaopt1/Controller as hdlsrc/hdl_areaopt1/Controller.vhd.
### Generating package file hdlsrc/hdl_areaopt1/Controller_pkg.vhd.
### Code Generation for 'hdl_areaopt1' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/Controller_report.html
### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.

Переходы скорости, которые реализуют мультиплексирование по времени в потоковой архитектуре, вводят цикл дополнительной задержки. Чтобы поддерживать функциональную верность, эта задержка должна быть сбалансирована для всех наборов вырезов, членом которых является этот путь. Когда параметр потоковой передачи включен, кодер также автоматически включает параметр балансировки задержки ('BalureDelays'), чтобы автоматически сбалансировать эту дополнительную задержку. Кодер также автоматически включает опцию генерации модели проверки, чтобы пользователь мог проверить, что функциональная эквивалентность сохраняется по отношению к исходной модели.
sim('gm_hdl_areaopt1_vnl'); open_system('gm_hdl_areaopt1_vnl/Compare/Assert_Out1/compare: Out1')

Настроив параметр StreamingFactor, можно исследовать пространство проектирования вдоль размера пути данных. Значение 1 не подразумевает потоковой передачи (или полностью параллельной реализации), а значение 24 (или полной длины вектора) подразумевает максимальную потоковую передачу (или полностью последовательную реализацию). Выбирая значения между этими двумя крайностями, можно исследовать пространство проектирования от полностью параллельных до полностью последовательных реализаций.
Если в этой модели для параметра StreamingFactor задано значение 6, в генерируемом ЛПВП получается 4-элементный векторный путь данных. Это приводит к использованию 12 множителей и 8 сумматоров, как показано в отчете о ресурсах.
hdlset_param('hdl_areaopt1/Controller', 'StreamingFactor', 6); makehdl('hdl_areaopt1/Controller'); open_system('gm_hdl_areaopt1/Controller'); %set_param('gm_hdl_areaopt1', 'SimulationCommand', 'update');
### Generating HDL for 'hdl_areaopt1/Controller'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_areaopt1', { 'HDL Code Generation' } )">hdl_areaopt1</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_areaopt1'.
### Begin compilation of the model 'hdl_areaopt1'...
### Applying HDL optimizations on the model 'hdl_areaopt1'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdl_areaopt1_vnl')">gm_hdl_areaopt1_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdl_areaopt1'.
### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 2.
### Working on Controller_tc as hdlsrc/hdl_areaopt1/Controller_tc.vhd.
### Working on hdl_areaopt1/Controller as hdlsrc/hdl_areaopt1/Controller.vhd.
### Generating package file hdlsrc/hdl_areaopt1/Controller_pkg.vhd.
### Code Generation for 'hdl_areaopt1' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples5/tp4c1b546f/hdlsrc/hdl_areaopt1/Controller_report.html
### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 1 messages.
### HDL code generation complete.