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

В этом примере показано, как вы можете автоматически идентифицировать и заменить повторяющиеся шаблоны с помощью Clone Detector App.Следовательно, это также улучшает возможности оптимизации модели с помощью совместного использования ресурсов. Модели рефакторов Clone Detector App путем идентификации клонов в проекте и замены клонов ссылками на подсистемные блоки в библиотеке. Этот пример использует модель, которая уже была изменена для оптимального совместного использования ресурсов с помощью Приложения 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 Synthesis из Simulink Model.

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

Перед использованием приложения 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 и Product внутри атомарных подсистем, они теперь могут использоваться совместно и приводят к улучшению использования ресурсов.

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

Заметьте, что счетчики Adders/Dedtractors, Registers и Total 1-Bit Registers уменьшились после совместного использования атомарных подсистем.

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

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

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