В этом примере показано, как вы можете автоматически идентифицировать и заменить повторяющиеся шаблоны с помощью 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
Заметьте, что после совместного использования количество регистров среза уменьшилось.