В этом примере показано, как использовать оптимизацию потоковой передачи уровня подсистемы в HDL Coder.
Потоковая передача является оптимизацией подв масштабе всей системы, поддержанной HDL Coder для реализации эффективного областью оборудования. По умолчанию кодер реализует оборудование, которое побитово и цикл - с точностью до модели Simulink. Это подразумевает, что вектор datapaths в Simulink сопоставляет неэффективно с оборудованием. Рассмотрите блок продукта в Simulink, который работает с двумя векторами с 64 элементами, вводит и генерирует векторный выход с 64 элементами. Этот блок выполняет 64 умножения в одном временном шаге Simulink. Чтобы остаться точным циклом, HDL Coder сопоставляет этот блок с 64 параллельными множителями в сгенерированном HDL-коде. Учитывая, что множители являются дорогими на FPGAs, это - неэффективная аппаратная реализация.
Потоковая передача является оптимизацией, которая сглаживает вектор datapath или к скаляру или к вектору меньшего размера datapath. Идея состоит в том, чтобы сериализировать выполнение параллельного оборудования, так, чтобы ресурсы могли быть совместно использованы, и векторные данные могут быть мультиплексированы временем по совместно используемым ресурсам.
Рассмотрите следующую модель в качестве примера, которая работает с вектором с 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/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/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' на подсистеме. Этот параметр задает степень, до которой datapath является scalarized - чем выше значение, тем больше сбережения области. В этом примере у нас есть вектор с 24 элементами datapath; к полностью scalarize это, задайте значение 'StreamingFactor' 24. Это может быть сделано любой через диалоговое окно свойств блока HDL (открытый путем щелчка правой кнопкой по подсистеме 'Контроллера') или посредством команды '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/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/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/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2021bd_1724986_151598/publish_examples5/tp2eddda0e/hdlsrc/hdl_areaopt1/Controller_report.html ### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.