В этом примере показано, как можно автоматически идентифицировать и заменить повторяющиеся шаблоны при помощи Приложения 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. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 39 cycles. ### Output port 1: 39 cycles. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/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/BR2020bd_1444674_32127/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. ### Starting HDL check. ### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays. ### Output port 0: 33 cycles. ### Output port 1: 33 cycles. ### 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. ### Generating HTML files for code generation report at <a href="matlab:web('/tmp/BR2020bd_1444674_32127/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/BR2020bd_1444674_32127/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
Заметьте, что количество Регистров Среза уменьшало после совместного использования.