Потоковая передача: Оптимизация области

В этом примере показано, как использовать потоковую оптимизацию уровня подсистемы в HDL Coder.

Введение

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

Потоковая передача - это оптимизация, которая уплощает вектор данные либо к скаляру, либо к вектору данным меньшего размера. Идея состоит в том, чтобы сериализовать выполнение параллельного оборудования, чтобы ресурсы могли быть разделены, и векторные данные могут быть мультиплексированы во времени по общим ресурсам.

Рассмотрим следующую модель примера, которая работает с 24-элементным векторным datapath. Эта модель содержит 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.

Потоковая передача для скаляризации Datapath

Эффективная реализация этой же модели может быть реализована путем установки положительного целого значения в параметр реализации 'StreamingFactor' в подсистеме. Этот параметр задает степень, до которой скаляризируется datapath - чем больше значение, тем больше экономия площади. В этом примере у нас есть векторный datapath с 24 элементами; чтобы полностью скаляризировать его, задайте значение 'StreamingFactor' 24. Это можно сделать или через диалоговое окно свойств блоков (открывается щелчком правой кнопкой мыши по подсистеме 'Controller') или через команду 'hdlset _ param'.

Генерация HDL-кода с набором 'StreamingFactor', равным 24, генерирует HDL, который использует только 3 умножителя и 2 сумматора (см. отчет ресурса после генерации HDL-кода). Потоковая архитектура реализована как локальная многоскоростная или в режиме с одной скоростью в зависимости от контекста потоковой подсистемы. Если логика подсистемы работает с более медленной частотой дискретизации или если коэффициент избыточной дискретизации установлен на значение, больше единицы, то активируется конвейеризация с тактовой частотой, и потоковая подсистема реализована как многоцикловая односкоростная архитектура. Дополнительные сведения см. в разделе Односкоростная архитектура совместного использования ресурсов. Во всех других случаях создается локальная многоскоростная реализация, как описано в этом примере. Элементы вектора datapath транслируются с более высокой скоростью (в этом случае в 24 раза быстрее и обозначаются красным цветом), и все расчеты работают с скаляром datapath. На выходах вектор восстанавливается с помощью отсроченной задержки, и выход дискретизируется назад с более медленной скоростью (в зеленом цвете).

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.

Балансировка задержки и функциональная эквивалентность

Переходы скорости, которые реализуют временное мультиплексирование в потоковой архитектуре, вводят цикл дополнительной задержки. Чтобы сохранить функциональную точность, эта задержка должна быть сбалансирована между всеми наборами вырезов, которые являются представителем этого пути. Когда опция потоковой передачи включена, кодер автоматически включает опцию балансировки задержки ('BalanceDelays'), чтобы автоматически сбалансировать эту дополнительную задержку. Кодер также автоматически включает опцию генерации модели валидации, чтобы пользователь мог проверить, что функциональная эквивалентность поддерживается относительно исходной модели.

sim('gm_hdl_areaopt1_vnl');
open_system('gm_hdl_areaopt1_vnl/Compare/Assert_Out1/compare: Out1')

Параметризация для большей гибкости

Путем настройки параметра 'StreamingFactor' можно исследовать пространство проекта вдоль размерности datapath. Значение 1 не подразумевает потоковой передачи (или полностью параллельной реализации), а значение 24 (или полная длина вектора) подразумевает максимальную потоковую передачу (или полностью последовательную реализацию). Путем выбора значений между этими двумя крайностями можно исследовать пространство проекта от полностью параллельных до полностью последовательных реализаций.

Если установить значение 'StreamingFactor' равным 6 в этой модели примера, мы получим 4-элементный вектор datapath в сгенерированном HDL. Это приводит к использованию 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.