Улучшите разделение ресурсов с обнаружением клонов и заменой

В этом примере показано, как можно автоматически идентифицировать и заменить повторяющиеся шаблоны при помощи Приложения Clone Detector. Следовательно, это также улучшает возможности для оптимизации модели при помощи разделения ресурсов. Приложение Clone Detector осуществляет рефакторинг модели путем идентификации клонов в проекте и заменяющий клоны на ссылки на блоки подсистемы в библиотеке. Этот пример использует модель, которая была уже изменена для оптимального разделения ресурсов при помощи Приложения Clone Detector. Чтобы узнать больше об этих модификациях, см., "Улучшают Разделение ресурсов с Модификациями Проекта".

Обнаружение клонов

Обнаружение клонов является инструментом, который может использоваться, чтобы идентифицировать шаблоны моделирования в проекте, которые похожи на несколько демонстрационных шаблонов, обеспеченных как входные параметры через пользовательский файл библиотеки. Если Приложение Clone Detector идентифицирует эти шаблоны, оно заменяет шаблоны на атомарные подсистемы. Это включает генерацию оптимального кода через повторное использование кода и приводит к лучшему использованию ресурса посредством совместного использования ресурсов среди атомарных подсистем. Для получения дополнительной информации относительно Обнаружения клонов, относитесь, чтобы Включить Повторное использование Компонента при помощи Обнаружения клонов (Simulink Check).

Настройте модель для разделения ресурсов

Эта отредактированная модель сохранена как hdlcoderParkTransformShare.slx. Скопируйте эту версию модели во временную директорию с помощью следующих команд:

design_name = 'hdlcoderParkTransformShare';
design_new_name = 'hdlcoderParkTransformShareCopy';

hdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos');
hdlc_temp_dir = [tempdir 'hdlcoderParkTransformDir'];

% Create a temporary folder and copy the Simulink model.
cd(tempdir);
[~, ~, ~] = rmdir(hdlc_temp_dir, 's');
mkdir(hdlc_temp_dir);
cd(hdlc_temp_dir);

copyfile(fullfile(hdlc_demo_dir, [design_name,'.slx']), fullfile(hdlc_temp_dir, [design_new_name,'.slx']), 'f');

% Open the model.
open_system(design_new_name);

Установите SharingFactor 6 на подсистеме интереса и сгенерируйте HDL наряду с соответствующими отчетами из модели.

subsystem = [design_new_name '/DUT'];
hdlset_param(subsystem, 'SharingFactor', 6);
makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformShareCopy/DUT'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformShareCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformShareCopy</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'.
### Begin compilation of the model 'hdlcoderParkTransformShareCopy'...
### Applying HDL optimizations on the model 'hdlcoderParkTransformShareCopy'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 39 cycles.
### Output port 2: 39 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderParkTransformShareCopy_vnl')">gm_hdlcoderParkTransformShareCopy_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderParkTransformShareCopy'.
### MESSAGE: The design requires 6 times faster clock with respect to the base rate = 6.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sincos_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sincos_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sub_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_add_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single_block.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_uminus_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_uminus_single.vhd.
### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_pkg.vhd.
### Code Generation for 'hdlcoderParkTransformShareCopy' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/html/hdlcoderParkTransformShareCopy_codegen_rpt.html');">hdlcoderParkTransformShareCopy_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 1 warnings, and 1 messages.
### HDL code generation complete.

Высокоуровневый Отчет Ресурса показывает, что использование ресурса для проекта, как оценивалось, было:

             Resource              Usage
     _________________________   ________
     Multipliers                 13
     Adders/Subtractors          178
     Registers                   1012
     Total 1-Bit Registers       16888
     RAMs                        0
     Multiplexers                610
     I/O Bits                    196
     Static Shift operators      8
     Dynamic Shift operators     8

Можно также запустить рабочий процесс синтеза на модели. Результаты синтеза для этой модели:

             Resource             Usage
     _________________________   ________
     Slice LUTs                  8792
     Slice Registers             8419
     DSPs                        13
     Block Ram Tile              0
     URAM                        0

Для получения дополнительной информации относительно рабочего процесса синтеза, смотрите генерацию HDL-кода и Синтез FPGA из Модели Simulink.

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

Прежде чем вы будете использовать Приложение Clone Detector, будете создавать потребительскую библиотеку, которая содержит каждый шаблон повторения в модели как Атомарная подсистема. В данном примере вам дают пользовательскую библиотеку, названную hdlcoderParkTransformShareLib.slx.

% Copy the library into the temporary directory
lib_name = 'hdlcoderParkTransformShareLib';
lib_new_name = 'hdlcoderParkTransformShareLibCopy';

copyfile(fullfile(hdlc_demo_dir, [lib_name,'.slx']), fullfile(hdlc_temp_dir, [lib_new_name,'.slx']), 'f');

% Open the custom library
open_system('hdlcoderParkTransformShareLibCopy');

Замените шаблоны модели с библиотекой, содержащей Атомарную подсистему. Чтобы сконфигурировать Приложение Clone Detector и заменить клоны, относитесь, чтобы Включить Повторное использование Компонента при помощи Обнаружения клонов (Simulink Check). А именно, следуйте инструкциям в разделе Set the Parameters for Clone Detection, чтобы соединить библиотеку для обнаружения клонов и определить Максимальный номер различного значения параметров к 0.

Затем следуйте за разделом Replace Clones, чтобы применить эту библиотеку к модели для точной замены клона.

Заметьте, что все шаблоны в исходной модели были заменены атомарными подсистемами от библиотеки как показано ниже:

Сохраните изменения, внесенные в эту систему. В Редакторе Simulink, на вкладке Simulation, нажимают Save.

Сравните результаты оптимизированной модели

Поскольку эта модель содержит Sin, Cos и блоки продукта в атомарных подсистемах, они могут теперь быть совместно использованы и результаты в улучшении использования ресурса.

subsystem = [design_new_name '/DUT'];
hdlset_param(subsystem, 'SharingFactor', 3);
% Generate HDL code and the corresponding reports for the optimized model
makehdl(subsystem);
### Generating HDL for 'hdlcoderParkTransformShareCopy/DUT'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoderParkTransformShareCopy', { 'HDL Code Generation' } )">hdlcoderParkTransformShareCopy</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoderParkTransformShareCopy'.
### Begin compilation of the model 'hdlcoderParkTransformShareCopy'...
### Applying HDL optimizations on the model 'hdlcoderParkTransformShareCopy'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 33 cycles.
### Output port 2: 33 cycles.
### Begin model generation.
### Model generation complete.
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoderParkTransformShareCopy_vnl')">gm_hdlcoderParkTransformShareCopy_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoderParkTransformShareCopy'.
### MESSAGE: The design requires 3 times faster clock with respect to the base rate = 6.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sincos_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sincos_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_sub_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_sub_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_mul_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_mul_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_add_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_add_single.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT/nfp_uminus_single as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/nfp_uminus_single.vhd.
### Working on DUT_tc as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_tc.vhd.
### Working on hdlcoderParkTransformShareCopy/DUT as hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT.vhd.
### Generating package file hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_pkg.vhd.
### Code Generation for 'hdlcoderParkTransformShareCopy' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2021ad_1584584_202060/publish_examples4/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/html/hdlcoderParkTransformShareCopy_codegen_rpt.html');">hdlcoderParkTransformShareCopy_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples4/hdlcoderParkTransformDir/hdl_prj/hdlsrc/hdlcoderParkTransformShareCopy/DUT_report.html
### HDL check for 'hdlcoderParkTransformShareCopy' complete with 0 errors, 1 warnings, and 1 messages.
### HDL code generation complete.

После совместного использования Высокоуровневый Отчет Ресурса показывает, что использование ресурса для проекта, как оценивалось, было:

             Resource             Usage
     _________________________   ________
     Multipliers                 13
     Adders/Subtractors          177
     Registers                   1004
     Total 1-Bit Registers       16657
     RAMs                        0
     Multiplexers                610
     I/O Bits                    196
     Static Shift operators      8
     Dynamic Shift operators     8

Заметьте, что Сумматоры/Вычитающие устройства, Регистры и Общие 1-битные количества Регистров уменьшали после того, как атомарные подсистемы совместно используются.

Можно также запустить рабочий процесс синтеза на модели. Результаты синтеза для этой модели:

             Resource             Usage
     _________________________   ________
     Slice LUTs                  8848
     Slice Registers             8308
     DSPs                        13
     Block Ram Tile              0
     URAM                        0

Заметьте, что количество Регистров Среза уменьшало после совместного использования.