При оптимизации цикла можно выполнять потоковую передачу или разворачивать циклы в сгенерированном коде. Петлевая потоковая передача представляет собой оптимизацию области, а петлевая распаковка представляет собой оптимизацию скорости. Чтобы оптимизировать петли для кода MATLAB ®, находящегося внутри функционального блока MATLAB, используйте MATLAB Function архитектура. При использовании MATLAB Datapath архитектура, генератор кода разворачивает циклы независимо от настройки оптимизации цикла.
HDL Coder™ выполняет потоковую передачу цикла путем создания экземпляра тела цикла один раз и использования этого экземпляра для каждой итерации цикла. Генератор кода выполняет избыточную выборку экземпляра тела цикла, чтобы сохранить функциональный эквивалент сгенерированного цикла исходному циклу.
При потоковой передаче цикла преимущество заключается в уменьшении использования аппаратных ресурсов, поскольку экземпляр тела цикла создается меньше раз. Недостатком является то, что аппаратная реализация выполняется с меньшей скоростью.
Можно выполнить частичную потоковую передачу цикла. Частично потоковый цикл создает экземпляр тела цикла более одного раза, поэтому он использует больше площади, чем полностью потоковый цикл. Однако частично потоковая петля также использует меньшую избыточную выборку, чем полностью потоковая петля.
Кодер HDL запускает цикл путем создания нескольких экземпляров тела цикла в сгенерированном коде. Можно также частично развернуть цикл. Созданный код использует инструкцию цикла, которая содержит несколько экземпляров исходного тела цикла и меньше итераций, чем исходный цикл.
Распределенная конвейерная обработка и совместное использование ресурсов могут оптимизировать невыпущенный код. Распределенная конвейерная обработка может увеличить скорость. Совместное использование ресурсов может уменьшить площадь.
Когда при развертке цикла создается несколько экземпляров, эти экземпляры, вероятно, увеличат площадь. Размыкание цикла также затрудняет считывание кода.
Можно задать глобальную оптимизацию цикла с помощью помощника по рабочим процессам HDL или в командной строке.
Можно также задать локальную оптимизацию цикла для определенного цикла с помощью coder.hdl.loopspec pragma в коде MATLAB. Если задана как глобальная, так и локальная оптимизация цикла, то локальная оптимизация цикла переопределяет глобальный параметр.
Чтобы задать оптимизацию цикла в помощнике по рабочим процессам, выполните следующие действия.
На левой панели помощника по рабочим процессам HDL выберите Помощник по рабочим процессам HDL > Создание кода HDL.
На вкладке Оптимизации (Optimizations) для параметра Оптимизация цикла (Loop Optimizations) выберите Нет (None), Разворот циклов (Unroll Loops) или Контуры потока (Stream Loops).
Чтобы задать оптимизацию цикла в командной строке в рабочем процессе MATLAB-HDL, укажите LoopOptimization имущества coder.HdlConfig объект. Например, для coder.HdlConfig объект, hdlcfgвведите одну из следующих команд:
hdlcfg.LoopOptimization = 'UnrollLoops'; % unroll loops
hdlcfg.LoopOptimization = 'StreamLoops'; % stream loops
hdlcfg.LoopOptimization = 'LoopNone'; % no loop optimization
Сведения об оптимизации определенного цикла MATLAB см. в разделе coder.hdl.loopspec.
Примечание
При указании coder.unroll pragma, эта pragma имеет приоритет над coder.hdl.loopspec. coder.hdl.loopspec не имеет эффекта.
Кодер HDL не может выполнять потоковую передачу цикла, если:
Индекс цикла отсчитывается вниз. Индекс цикла должен увеличиваться на 1 в каждой итерации.
Существует два или более вложенных цикла на одном уровне иерархии в другом цикле.
Любая конкретная постоянная переменная обновляется как внутри, так и вне цикла.
Постоянная переменная, инициализированная ненулевым значением, обновляется внутри цикла.
Кодер HDL может выполнять потоковую передачу цикла, если постоянная переменная:
Обновление внутри цикла и чтение за его пределами.
Считывание в цикле и обновление за его пределами.
Вы не можете использовать coder.hdl.loopspec('stream') прагматика:
В подфункции. Его необходимо указать в конструкторской функции MATLAB верхнего уровня.
Для цикла, вложенного в другой цикл.
Для цикла, содержащего вложенный цикл, если коэффициент потоковой передачи не равен числу итераций.