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

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

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

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

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

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

  • Значительно улучшите площадь и время своего проекта путем оптимизации алгоритма внутри блока MATLAB Function и через контур блока MATLAB Function с другими блоками Simulink в вашей модели.

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

  • Сплющивание иерархии

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

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

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

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

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

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

Модели 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 в представление dataflow, которое использует блоки Simulink. The MATLAB Datapath архитектура разворачивает циклы в вашем коде из-за этого преобразования. Если вы хотите потоковыми циклами, либо используйте циклическую оптимизацию потоковой передачи с MATLAB Function архитектура или используйте потоковую оптимизацию с MATLAB Datapath как архитектура HDL.

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

Например, рассмотрите эту модель с Подсистемой DUT, которая состоит из блока Product и блока 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. В этом примере можно совместно использовать блок Product вне блока 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 с блоком Product снаружи. Группа совместного использования из трех умножителей отображается в отчете Оптимизации. При клике ссылок в группе совместного использования общие множители подсвечиваются в сгенерированной модели и исходной модели.

Модель блока 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 с четырьмя блоками Gain снаружи. Вторая группа совместного использования состоит из сумматоров внутри каждого из двух Блоков MATLAB function.

Можно использовать распределенную оптимизацию конвейеризации с Distributedpipe_MLFB подсистема. Включите иерархическое распределённую конвейеризацию на верхнем уровне и установите архитектуру функции 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 Подсистема.

См. также

Блоки

Функции

Похожие темы