exponenta event banner

Улучшение совместного использования ресурсов с помощью функции обнаружения и замены клонов

В этом примере показано, как можно автоматически идентифицировать и заменить повторяющиеся шаблоны с помощью приложения Clone Detector App. Следовательно, это также улучшает возможности оптимизации модели с помощью совместного использования ресурсов. Clone Detector App восстанавливает модели путем идентификации клонов в конструкции и замены клонов ссылками на блоки подсистем в библиотеке. В этом примере используется модель, которая уже была изменена для оптимального совместного использования ресурсов с помощью приложения детектора клонов. Дополнительные сведения об этих изменениях см. в разделе «Улучшение совместного использования ресурсов с модификациями конструкции».

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

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

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

Эта отредактированная модель сохраняется как hdlcoureParkTransformShare.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

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

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

Дополнительные сведения о рабочем процессе синтеза см. в разделах Генерация кода HDL и Синтез FPGA из Simulink Model.

Использование функции обнаружения клонов для оптимизации модели совместного использования ресурсов

Перед использованием приложения Clone Detector App создайте библиотеку клиентов, содержащую каждый повторяющийся шаблон в модели в качестве атомной подсистемы. В этом примере предоставляется пользовательская библиотека с именем hdlcoureParkTransformShareLib.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, чтобы связать библиотеку для обнаружения клонов, и задайте для параметра Maximum number of different parameters значение 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

Заметьте, что Гадюки/Подтракторы, Регистры и Полное 1-битное количество Регистров уменьшили после того, как атомные подсистемы разделены.

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

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

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