В этом примере показано, как использовать оптимизацию совместного использования уровня подсистемы в HDL Coder.
Совместное использование является оптимизацией уровня подсистемы, поддержанной HDL Coder для реализации эффективного областью оборудования.
По умолчанию кодер реализует оборудование, которое является 1 к 1 отображением блоков Simulink к реализациям аппаратного модуля. Оптимизация разделения ресурсов позволяет пользователям совместно использовать аппаратные ресурсы путем включения отображения N-1 'N' функционально эквивалентные блоки Simulink к одному аппаратному модулю. Пользователь задает 'N' с помощью параметра реализации 'SharingFactor'.
Поскольку мультиплексированная временем архитектура подвергается более длинной задержке, чтобы завершить операцию, HDL Coder™ автоматически управляет несоответствием синхронизации в зависимости от того, какие ресурсы совместно используются. Предположим, что совместно используемые ресурсы действуют на уровне основной частоты дискретизации, затем разделение ресурсов реализовано как локальная многоскоростная архитектура, которая описана в этом примере. Если совместно используемые ресурсы действуют на уровне более медленной частоты дискретизации, чем основная частота дискретизации, то HDL Coder™ вызывает конвейеризацию тактовой частоты к, синтезирует реализацию, которая использует бюджет задержки, заданный в дифференциале уровня. В этом случае ресурс совместно использовал архитектуру, одна реализация уровня и берет несколько временных шагов, чтобы завершить все разделяемые операции. Один пример планировщика уровня описывает детали этой реализации.
Остальная часть этого примера иллюстрирует локальную многоскоростную архитектуру разделения ресурсов. Рассмотрите следующую симметричную КИХ-модель фильтра. Это содержит 4 блока продукта, которые функционально эквивалентны и которые сопоставляют с 4 множителями в оборудовании. Отчет Использования Ресурса перечисляет используемые аппаратные ресурсы.
bdclose all; load_system('sfir_fixed'); open_system('sfir_fixed/symmetric_fir'); hdlset_param('sfir_fixed', 'ResourceReport', 'on'); makehdl('sfir_fixed/symmetric_fir');
### Generating HDL for 'sfir_fixed/symmetric_fir'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('sfir_fixed', { 'HDL Code Generation' } )">sfir_fixed</a> for HDL code generation parameters. ### Starting HDL check. ### Begin VHDL Code Generation for 'sfir_fixed'. ### Working on sfir_fixed/symmetric_fir as hdlsrc/sfir_fixed/symmetric_fir.vhd. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/sfir_fixed/html/sfir_fixed_codegen_rpt.html');">sfir_fixed_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/sfir_fixed/symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
Чтобы уменьшать ресурсы области, можно вызвать оптимизацию совместного использования путем устанавливания параметра 'SharingFactor' на подсистеме к положительному целочисленному значению. Этот параметр задает 'N' в аппаратном отображении N-1. В этом примере существует 4 блока продукта, таким образом генерирование HDL с набором 'SharingFactor' к 4 генерирует HDL с 1 множителем.
Модель генерации кода отражает архитектуру совместного использования. Входные параметры с разделяемыми блоками мультиплексированы временем по совместно используемому ресурсу на более быстром уровне (в этом случае 4x быстрее, отображены красным). Выходные параметры затем направляются соответствующим потребителям на более медленном уровне (отображенный зеленым).
hdlset_param('sfir_fixed/symmetric_fir', 'SharingFactor', 4); hdlset_param('sfir_fixed', 'GenerateValidationModel', 'on'); makehdl('sfir_fixed/symmetric_fir'); open_system('gm_sfir_fixed/symmetric_fir'); set_param('gm_sfir_fixed', 'SimulationCommand', 'update');
### Generating HDL for 'sfir_fixed/symmetric_fir'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('sfir_fixed', { 'HDL Code Generation' } )">sfir_fixed</a> for HDL code generation parameters. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 1 cycles. ### Output port 1: 1 cycles. ### Generating new validation model: <a href="matlab:open_system('gm_sfir_fixed_vnl')">gm_sfir_fixed_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'sfir_fixed'. ### MESSAGE: The design requires 4 times faster clock with respect to the base rate = 1. ### Working on symmetric_fir_tc as hdlsrc/sfir_fixed/symmetric_fir_tc.vhd. ### Working on sfir_fixed/symmetric_fir as hdlsrc/sfir_fixed/symmetric_fir.vhd. ### Generating package file hdlsrc/sfir_fixed/symmetric_fir_pkg.vhd. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/sfir_fixed/html/sfir_fixed_codegen_rpt.html');">sfir_fixed_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/sfir_fixed/symmetric_fir_report.html ### HDL check for 'sfir_fixed' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Оптимизация совместного использования реализована с помощью мультиплексирования с разделением времени. Simulink требует, чтобы выходные параметры совместно используемого ресурса были произведены на уровне предопределенной частоты дискретизации, таким образом, HDL Coder разгоняет совместно используемый ресурс на более быстром уровне, чем скорость передачи данных. В вышеупомянутом примере разделяемая архитектура, которая включает совместно используемый ресурс, сериализатор мультиплексора во входных параметрах и демультиплексор-deserializer при выходных параметрах, действует на 4 раза уровне входных данных, потому что 'Sharingfactor' = 4.
Переходы уровня, которые реализуют мультиплексирование времени в архитектуре разделения ресурсов, вводят дополнительную задержку. Чтобы обеспечить функциональную эквивалентность, задержка, балансирующаяся автоматически, вставляет соответствие с задержками параллельных путей к слиянию. Смотрите, что Задержка Балансируется и Рабочий процесс Модели Валидации В примере HDL Coder™ для получения дополнительной информации. Сгенерированная модель валидации позволяет пользователю проверять функциональную эквивалентность путем сравнения операции архитектуры общего оборудования с исходной моделью.
sim('gm_sfir_fixed_vnl'); open_system('gm_sfir_fixed_vnl/Compare/Assert_y_out/compare: y_out') open_system('gm_sfir_fixed_vnl/Compare/Assert_delayed_xout/compare: delayed_xout')
Сетевая сверхдискретизация для целого проекта эквивалентна LCM всего набора значений 'SharingFactor' на модели. Рассмотрите пример, hdlcoder_uniform_oversampling.slx. Это имеет две подсистемы: подсистема 'Share3' имеет 3 блока усиления, которые могут быть совместно использованы, и 'Share4' имеет 4 блока усиления, которые могут быть совместно использованы.
saved_warning_state = warning('off', 'hdlcoder:makehdl:DeprecateMaxOverSampling'); warning('off', 'hdlcoder:makehdl:DeprecateMaxComputationLatency'); bdclose('all'); load_system('hdlcoder_uniform_oversampling'); open_system('hdlcoder_uniform_oversampling/Subsystem'); set_param('hdlcoder_uniform_oversampling', 'SimulationCommand', 'update'); hdlsaveparams('hdlcoder_uniform_oversampling/Subsystem');
%% Set Model 'hdlcoder_uniform_oversampling' HDL parameters hdlset_param('hdlcoder_uniform_oversampling', 'GenerateValidationModel', 'on'); hdlset_param('hdlcoder_uniform_oversampling', 'HDLSubsystem', 'hdlcoder_uniform_oversampling'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share3', 'SharingFactor', 3); % Set SubSystem HDL parameters hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share4', 'SharingFactor', 4);
Заметьте, что 'Share3' устанавливает свой 'SharingFactor' на 3, и 'Share4' устанавливает свой 'SharingFactor' на 4. HDL Coder™ применяет локальное разделение ресурсов к каждой подсистеме, и в результате реализация HDL требует LCM (3, 4) = 12x сверхдискретизация. Об этом сообщают в сообщении во время генерации HDL-кода.
makehdl('hdlcoder_uniform_oversampling/Subsystem');
### Generating HDL for 'hdlcoder_uniform_oversampling/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_uniform_oversampling', { 'HDL Code Generation' } )">hdlcoder_uniform_oversampling</a> for HDL code generation parameters. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 1 cycles. ### Output port 1: 1 cycles. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_uniform_oversampling_vnl')">gm_hdlcoder_uniform_oversampling_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_uniform_oversampling'. ### MESSAGE: The design requires 12 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share3 as hdlsrc/hdlcoder_uniform_oversampling/Share3.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share4 as hdlsrc/hdlcoder_uniform_oversampling/Share4.vhd. ### Working on Subsystem_tc as hdlsrc/hdlcoder_uniform_oversampling/Subsystem_tc.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem as hdlsrc/hdlcoder_uniform_oversampling/Subsystem.vhd. ### Generating package file hdlsrc/hdlcoder_uniform_oversampling/Subsystem_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdlcoder_uniform_oversampling/Subsystem_report.html ### HDL check for 'hdlcoder_uniform_oversampling' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Один способ обойти этот мультипликативный эффект сверхдискретизации состоит в том, чтобы установить 'SharingFactor' всех подсистем в доступный бюджет на сверхдискретизацию. В вышеупомянутом примере, если бюджет на сверхдискретизацию только 4x, то установленный 'SharingFactor' = 4 и для 'Share3' и для 'Share4'. В этом случае HDL Coder может совместно использовать меньше ресурсов, чем SharingFactor и остаться неактивным для остающихся циклов.
hdlset_param('hdlcoder_uniform_oversampling/Subsystem/Share3', 'SharingFactor', 4); makehdl('hdlcoder_uniform_oversampling/Subsystem');
### Generating HDL for 'hdlcoder_uniform_oversampling/Subsystem'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_uniform_oversampling', { 'HDL Code Generation' } )">hdlcoder_uniform_oversampling</a> for HDL code generation parameters. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 1 cycles. ### Output port 1: 1 cycles. ### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_uniform_oversampling_vnl')">gm_hdlcoder_uniform_oversampling_vnl</a>. ### Validation model generation complete. ### Begin VHDL Code Generation for 'hdlcoder_uniform_oversampling'. ### MESSAGE: The design requires 4 times faster clock with respect to the base rate = 0.1. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share3 as hdlsrc/hdlcoder_uniform_oversampling/Share3.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem/Share4 as hdlsrc/hdlcoder_uniform_oversampling/Share4.vhd. ### Working on Subsystem_tc as hdlsrc/hdlcoder_uniform_oversampling/Subsystem_tc.vhd. ### Working on hdlcoder_uniform_oversampling/Subsystem as hdlsrc/hdlcoder_uniform_oversampling/Subsystem.vhd. ### Generating package file hdlsrc/hdlcoder_uniform_oversampling/Subsystem_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdlcoder_uniform_oversampling/Subsystem_report.html ### HDL check for 'hdlcoder_uniform_oversampling' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Заметьте, что фактором сверхдискретизации является теперь LCM (4,4) = 4, и что это - значение, о котором сообщают во время генерации кода. В общем случае это - хорошая идея установить значения 'SharingFactor' в доступный бюджет на сверхдискретизацию. Если ваш проект содержит меньше общих ресурсов, чем значение 'SharingFactor', вы задаете, HDL Coder совместно использует общие доступные ресурсы, и разгоняет их значением 'SharingFactor'. Однако, если вы хотите применить и разделение ресурсов и другую оптимизацию, который использует разгон, такой как потоковая передача, или примените разделение ресурсов в нескольких вложенных подсистемах, это общее руководство может привести к более высокому фактору сверхдискретизации.
HDL Coder поддерживает разделение ресурсов 4 типов блока: продукт, Усиление, Атомарная подсистема и функция MATLAB. Для блоков MATLAB function используйте архитектуру MATLAB Datapath с фиксированными точками. Эта архитектура является настройкой по умолчанию для типов с плавающей точкой. Можно задать Архитектуру HDL в диалоговом окне HDL Block Properties блока MATLAB function.
Совместное использование функционально эквивалентного продукта и блоков Усиления означает, что множители в реализации HDL будут совместно использованы. Два блока продукта функционально эквивалентны если: a) типы данных их вводов и выводов идентичны, b) их настройки параметров блоков идентичны и c) их свойства блока HDL идентичны. Для блока Gain функциональная эквивалентность дополнительно требует, чтобы постоянное значение и типы данных были также идентичны. Однако, если усиление, постоянные типы данных идентичны для двух блоков Усиления с различными постоянными значениями усиления, HDL Coder, может совместно использовать их. Точно так же, если блок Gain может быть реализован как блок продукта с постоянным входом, и это имеет совпадающие типы данных как другой блок продукта в проекте, кодер может совместно использовать их.
Третий тип блока, Атомарная подсистема, полезен для совместного использования функционально эквивалентных островов логики, инкапсулировавшей в атомарных подсистемах. Две атомарных подсистемы функционально эквивалентны и могут быть совместно использованы если: a) их контрольные суммы Simulink идентичны (дополнительную информацию см. в Simulink.SubSystem.getChecksum), и b) их свойства блока HDL идентичны.
% The following example demonstrates an audio filtering model that applies % the same filter on the left and right channels. By default, HDL Coder % generates two filter modules in hardware. bdclose all; load_system('hdlcoder_audiofiltering'); open_system('hdlcoder_audiofiltering/Audio filter'); % The filters on the two audio channels can be shared by specifying a % 'SharingFactor' value of 2 on the encompassing subsystem. This generates % an architecture that uses only one filter, as shown below. hdlset_param('hdlcoder_audiofiltering/Audio filter', 'SharingFactor', 2); makehdl('hdlcoder_audiofiltering/Audio filter'); open_system('gm_hdlcoder_audiofiltering/Audio filter'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_audiofiltering/Audio filter'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_audiofiltering', { 'HDL Code Generation' } )">hdlcoder_audiofiltering</a> for HDL code generation parameters. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 1 cycles. ### Output port 1: 1 cycles. ### Begin VHDL Code Generation for 'hdlcoder_audiofiltering'. ### MESSAGE: The design requires 2 times faster clock with respect to the base rate = 0.00012207. ### Working on hdlcoder_audiofiltering/Audio filter/Filter_left as hdlsrc/hdlcoder_audiofiltering/Filter_left.vhd. ### Working on Audio filter_tc as hdlsrc/hdlcoder_audiofiltering/Audio_filter_tc.vhd. ### Working on hdlcoder_audiofiltering/Audio filter as hdlsrc/hdlcoder_audiofiltering/Audio_filter.vhd. ### Generating package file hdlsrc/hdlcoder_audiofiltering/Audio_filter_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdlcoder_audiofiltering/Audio_filter_report.html ### HDL check for 'hdlcoder_audiofiltering' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Поскольку 'SharingFactor' является параметром уровня подсистемы, различные подсистемы на разных уровнях иерархии могут задать различные значения совместного использования. В примере аудиофильтра фильтры на каждом канале используют 3 блока усиления соответственно.
open_system('hdlcoder_audiofiltering/Audio filter/Filter_left');
Мы можем задать значение 'SharingFactor' 2 на верхнем уровне DUT, чтобы совместно использовать фильтры на двух каналах. Кроме того, мы можем задать значение 'SharingFactor' 3 на каждой из подсистем фильтра, чтобы позволить совместно использовать 3 блоков усиления в каждом канале. Когда HDL-код теперь сгенерирован, заметьте сначала, что левые и правые фильтры были совместно использованы, и у нас есть только один фильтр на верхнем уровне иерархии.
hdlset_param('hdlcoder_audiofiltering/Audio filter', 'SharingFactor', 2); hdlset_param('hdlcoder_audiofiltering/Audio filter/Filter_left', 'SharingFactor', 3); hdlset_param('hdlcoder_audiofiltering/Audio filter/Filter_right', 'SharingFactor', 3); makehdl('hdlcoder_audiofiltering/Audio filter'); open_system('gm_hdlcoder_audiofiltering/Audio filter'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
### Generating HDL for 'hdlcoder_audiofiltering/Audio filter'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_audiofiltering', { 'HDL Code Generation' } )">hdlcoder_audiofiltering</a> for HDL code generation parameters. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 2 cycles. ### Output port 1: 2 cycles. ### Begin VHDL Code Generation for 'hdlcoder_audiofiltering'. ### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 0.00012207. ### Working on hdlcoder_audiofiltering/Audio filter/Filter_left as hdlsrc/hdlcoder_audiofiltering/Filter_left.vhd. ### Working on Audio filter_tc as hdlsrc/hdlcoder_audiofiltering/Audio_filter_tc.vhd. ### Working on hdlcoder_audiofiltering/Audio filter as hdlsrc/hdlcoder_audiofiltering/Audio_filter.vhd. ### Generating package file hdlsrc/hdlcoder_audiofiltering/Audio_filter_pkg.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdlcoder_audiofiltering/Audio_filter_report.html ### HDL check for 'hdlcoder_audiofiltering' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.
Кроме того, 3 блока усиления в ниже иерархии (в подсистеме фильтра) были также совместно использованы. Конечный результат состоит в том, что мы уменьшали использование ресурсов от 6 множителей всего до один.
open_system('gm_hdlcoder_audiofiltering/Audio filter/Filter_left'); set_param('gm_hdlcoder_audiofiltering', 'SimulationCommand', 'update');
Разделение ресурсов может также быть объединено с другой оптимизацией как потоковая передача.
Рассмотрите модель ниже: это содержит вектор с 24 элементами datapath и 3 векторных блока усиления, которые сопоставят с 72 множителями по умолчанию. Потоковая передача может scalarize вектор datapath, в то время как совместное использование может совместно использовать 3 блока усиления.
bdclose all; load_system('hdl_areaopt1'); open_system('hdl_areaopt1/Controller'); set_param('hdl_areaopt1', 'SimulationCommand', 'update');
Чтобы вызвать обе оптимизации, мы устанавливаем 'StreamingFactor' на 24 и 'SharingFactor' к 3. Первый сократит количество множителей от 72 до 3, и последний уменьшает 3 скалярных множителя до 1.
hdlset_param('hdl_areaopt1/Controller', 'StreamingFactor', 24); hdlset_param('hdl_areaopt1/Controller', 'SharingFactor', 3); 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. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 2 cycles. ### Begin VHDL Code Generation for 'hdl_areaopt1'. ### MESSAGE: The design requires 72 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdl_areaopt1/html/hdl_areaopt1_codegen_rpt.html');">hdl_areaopt1_codegen_rpt.html</a> ### Creating HDL Code Generation Check Report file:///tmp/BR2019bd_1170825_64229/publish_examples4/tp4efa3ca0/hdlsrc/hdl_areaopt1/Controller_report.html ### HDL check for 'hdl_areaopt1' complete with 0 errors, 0 warnings, and 1 messages. ### HDL code generation complete.