Оптимизация HDL через контур блока MATLAB function Используя архитектуру MATLAB Datapath

В этом примере показано, как использовать различную оптимизацию в блоке MATLAB function и через контур блока MATLAB function с другими блоками в вашей модели Simulink®. Пример также иллюстрирует различие в области и синхронизации, когда вы используете различные настройки архитектуры HDL блока MATLAB function.

Почему использование архитектура MATLAB Datapath?

Генерация HDL-кода для блока MATLAB function поддерживает две архитектуры HDL: MATLAB Function и MATLAB Datapath. Задайте Архитектуру HDL в диалоговом окне HDL Block Properties блока MATLAB function.

Используйте MATLAB Datapath архитектура к;

  • Комплексная фиксированная точка модели и алгоритмы MATLAB с плавающей точкой в блоках MATLAB function и интерфейсе этот алгоритм с другими блоками Simulink в вашей модели.

  • Улучшите область и синхронизацию вашего проекта значительно путем оптимизации алгоритма в блоке MATLAB function и через контур блока MATLAB function с другими блоками Simulink в модели.

Эта архитектура является настройкой по умолчанию для блоков MATLAB function с типами с плавающей точкой. Путем включения MATLAB Datapath архитектура для операций фиксированной точки, можно использовать различную оптимизацию, которая включает:

  • Выравнивание иерархии

  • Разделение ресурсов и потоковая передача

  • Конвейеризация тактовой частоты

  • Адаптивная конвейеризация

  • Распределенная конвейеризация и иерархическая распределенная конвейеризация

  • Оценка критического пути

Как работы архитектуры MATLAB Datapath

Модели Fixed-point Simulink® используют MATLAB Function архитектура по умолчанию. Определенная оптимизация HDL, такая как разделение ресурсов и распределенная конвейеризация, которую вы включаете с этой архитектурой, оптимизирует блоки, окружающие блок MATLAB function и алгоритм в блоке MATLAB function. Чтобы видеть эффект оптимизации в блоке MATLAB function, исследуйте сгенерированный HDL-код на блок. Эта архитектура не применяет оптимизацию через контур блока MATLAB function с другими блоками Simulink.

Модели Simulink с плавающей точкой используют MATLAB Datapath архитектура, даже если вы задаете MATLAB Function как установка архитектуры для блока. Когда вы используете типы с плавающей точкой, задаете нативный режим с плавающей точкой. С этой архитектурой генератор кода обрабатывает блок как регулярный блок Subsystem. HDL Coder преобразовывает алгоритм потока управления кода MATLAB в блоке MATLAB function к представлению потока данных, которое использует блоки Simulink. MATLAB Datapath архитектура разворачивает циклы в вашем коде из-за этого преобразования. Если вы хотите передать циклы потоком, любое использование оптимизация потоковой передачи цикла с MATLAB Function архитектура или использование оптимизация потоковой передачи с MATLAB Datapath как архитектура HDL.

При помощи MATLAB Datapath архитектура, можно эффективнее выполнить различную оптимизацию HDL Coder™ с блоком MATLAB function, который вы в противном случае выполнили бы с блоком Subsystem. MATLAB Datapath архитектура применяет настройки оптимизации, которые вы задаете на алгоритме в блоке MATLAB function и через контур блока MATLAB function с другими блоками в вашей модели Simulink.

Например, рассмотрите эту модель с Подсистемой DUT, которая состоит из блока продукта и блока MATLAB function.

open_system('hdlcoder_MLFB_simple_datapath')
set_param('hdlcoder_MLFB_simple_datapath', 'SimulationCommand', 'Update')
open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT')

Блок MATLAB function реализует два умножения.

open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function')

Архитектура HDL блока MATLAB function установлена в MATLAB Datapath. Сгенерировать HDL-код для HDL_DUT Подсистема, запустите эту команду:

makehdl('hdlcoder_MLFB_simple_datapath/HDL_DUT')

Когда вы генерируете HDL-код, генератор кода заменяет блок MATLAB function на подсистему, которая выполняет умножение c * d и e * f.

С MATLAB Datapath архитектура, можно выполнить оптимизацию в блоке MATLAB function и через блок MATLAB function с другими блоками Simulink. В этом примере можно совместно использовать эти два множителя в блоке MATLAB function. Чтобы оптимизировать блоки, установите SharingFactor на 2 на блоке MATLAB function.

mlsubsys = 'hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function';
hdlset_param(mlsubsys, 'SharingFactor', 2)

Когда вы генерируете HDL-код, генератор кода совместно использует умножение в блоке MATLAB function. Группа совместного использования отображена в Отчете Оптимизации. Когда вы щелкаете по ссылкам в группе совместного использования, HDL Coder отображает разделяемые множители в блоке MATLAB function в сгенерированной модели и исходной модели.

Можно применить оптимизацию через блок MATLAB function с другими блоками Simulink. В этом примере можно совместно использовать блок продукта вне блока MATLAB function со множителями в блоке MATLAB function. Чтобы совместно использовать эти ресурсы, удалите SharingFactor на блоке MATLAB function, и на родительской подсистеме, HDL_DUT, включите FlattenHierarchy и установите SharingFactor на 3.

hdlset_param(mlsubsys, 'SharingFactor', 0)
hdlset_param('hdlcoder_MLFB_simple_datapath/HDL_DUT', ...
                    'FlattenHierarchy', 'on', 'SharingFactor', 3)

Примечание: не используйте свойство InlineMATLABCode с MATLAB Datapath архитектура блока. Используйте FlattenHierarchy вместо этого.

Когда вы генерируете HDL-код, генератор кода совместно использует умножение в блоке MATLAB function с блоком продукта снаружи. Вы видите группу совместного использования из трех множителей в Отчете Оптимизации. Когда вы щелкаете по ссылкам в группе совместного использования, разделяемые множители подсвечены в сгенерированной модели и исходной модели.

Модель блока MATLAB function с архитектурой функции MATLAB по умолчанию

Для модели в качестве примера, которая иллюстрирует MATLAB Datapath архитектура и как это отличается от MATLAB Function архитектура, откройте модель hdlcoder_MLFB_share_pipeline. Модель использует целочисленные типы. Для примера, который иллюстрирует, как вы используете MATLAB Datapath архитектура с типами с плавающей точкой, смотрите, Генерируют Независимый от цели HDL-код с Собственным компонентом, С плавающей точкой.

open_system('hdlcoder_MLFB_share_pipeline')
set_param('hdlcoder_MLFB_share_pipeline','SimulationCommand','Update')

Модель содержит две подсистемы DUT в верхнем уровне HDL_DUT_sharing и HDL_DUT_distpipe. Подсистемы иллюстрируют, как можно использовать разделение ресурсов и распределенную оптимизацию конвейеризации через контур блока MATLAB function с другими блоками. И подсистемы выполняют основные сложения и умножение внутри и снаружи блока MATLAB function.

open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')

open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem')

open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')

Чтобы видеть параметры HDL, которые сохранены на модели, запустите hdlsaveparams функция.

hdlsaveparams('hdlcoder_MLFB_share_pipeline')
%% Set Model 'hdlcoder_MLFB_share_pipeline' HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline', 'CriticalPathEstimation', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'HDLSubsystem', 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'OptimizationReport', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'Oversampling', 40);
hdlset_param('hdlcoder_MLFB_share_pipeline', 'ResourceReport', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'ShareAdders', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'TargetDirectory', 'hdl_prj\hdlsrc');
hdlset_param('hdlcoder_MLFB_share_pipeline', 'Traceability', 'on');

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'DistributedPipelining', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'FlattenHierarchy', 'on');

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'FlattenHierarchy', 'on');
hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'SharingFactor', 8);

Вы видите что MATLAB Function по умолчанию Архитектура HDL сохранена на модели.

Сгенерируйте HDL-код с помощью Архитектуры функции MATLAB

Чтобы сгенерировать HDL-код для совместного использования DUT, запустите эту команду:

makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')

Когда вы открываете Потоковую передачу и Совместное использование Отчета, отчет отображает четыре множителя и три сумматора как совместно используемые ресурсы.

Когда вы кликаете по второй группе совместного использования, генератор кода подсвечивает три сумматора, окружающие блок MATLAB function. Группа совместного использования включает эти два сумматора в Подсистеме и блоке Add снаружи. Генератор кода не совместно использовал множители и сумматоры, которые являются в блоке MATLAB function.

Оценка критического пути включена на модели. Когда вы аннотируете критический путь, блок MATLAB function действует как барьер для этой оптимизации. Если критический путь в блоке MATLAB function и если вы хотите подсветить критический путь, используйте MATLAB Datapath архитектура.

Сгенерировать HDL-код для HDL_DUT_distpipe, запустите эту команду:

makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')

Когда вы открываете Распределенный Отчет Конвейеризации, вы видите, что генератор кода переместил конвейеры в HDL_DUT_distpipe подсистема, но не распределила конвейеры в блоке MATLAB function.

Этот рисунок отображается, как распределенная конвейеризация переместила конвейерные регистры в подсистеме.

Примените оптимизацию через блок MATLAB function и другие блоки Simulink

Чтобы улучшить область и синхронизацию вашего проекта, используйте MATLAB Datapath архитектура. Для HDL_DUT_sharing подсистема, можно объединить разделение ресурсов с конвейеризацией тактовой частоты и совместно использовать ресурсы в блоке MATLAB function и через блок MATLAB function с другими блоками.

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

1. Включите FlattenHierarchy и задайте SharingFactor на родительской подсистеме HDL_DUT_sharing. Установите SharingFactor на 8.

share_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing';
hdlset_param(share_subsys, 'FlattenHierarchy', 'on', 'SharingFactor', 8);

2. Задайте MATLAB Datapath архитектура для блоков MATLAB function в HDL_DUT_sharing подсистема.

share_mlfcn1 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/MATLAB Function';
share_mlfcn2 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem/MATLAB Function';
hdlset_param(share_mlfcn1, 'architecture', 'MATLAB Datapath');
hdlset_param(share_mlfcn2, 'architecture', 'MATLAB Datapath');

Когда вы открываете Потоковую передачу и Совместное использование отчета, отчет отображает Большую восьмерку совместного использования множители и две группы совместного использования сумматоров.

Когда вы выбираете первую группу совместного использования, вы видите, что оптимизация совместно использовала множители в функции MATLAB с четырьмя блоками Усиления снаружи. Вторая группа совместного использования состоит из сумматоров в каждом из этих двух блоков MATLAB function.

Можно использовать распределенную оптимизацию конвейеризации с Distributedpipe_MLFB подсистема. Включите иерархическую распределенную конвейеризацию в верхнем уровне и установите архитектуру HDL функции MATLAB к MATLAB Datapath с набором DistributedPipelining к on.

hdlset_param('hdlcoder_MLFB_share_pipeline', 'HierarchicalDistPipelining', 'on');
dist_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe/MATLAB Function';
hdlset_param(dist_subsys, 'architecture', 'MATLAB Datapath');
hdlset_param(dist_subsys, 'DistributedPipelining', 'on');

После того, как вы генерируете HDL-код, открываете сгенерированную модель. Генератор кода использует иерархическую распределенную конвейеризацию и распределенную конвейеризацию, чтобы переместить конвейерные регистры через блоки и в MATLAB Function Подсистема.

Этот рисунок отображается, как распределенная конвейеризация переместила конвейерные регистры в MATLAB Function Подсистема.

Смотрите также

Блоки

Функции

Похожие темы