С оптимизацией цикла можно передать потоком или развернуть циклы в сгенерированном коде. Потоковая передача цикла является оптимизацией области, и развертывание цикла является оптимизацией скорости. Чтобы оптимизировать циклы для кода MATLAB®, который является в блоке MATLAB Function, используйте MATLAB Function
архитектура. Когда вы используете MATLAB Datapath
архитектура, генератор кода разворачивает циклы независимо от установки оптимизации цикла.
HDL Coder™ передает цикл потоком путем инстанцирования тела цикла однажды и использования того экземпляра в каждой итерации цикла. Генератор кода сверхдискретизировал экземпляр тела цикла, чтобы сохранить сгенерированный цикл функционально эквивалентным исходному циклу.
Если вы передаете цикл потоком, преимуществом является уменьшенное использование аппаратного ресурса, потому что тело цикла инстанцируют меньше раз. Недостаток является запусками аппаратной реализации на более низкой скорости.
Можно частично передать цикл потоком. Частично переданный потоком цикл инстанцирует тела цикла несколько раз, таким образом, это использует больше области, чем полностью переданный потоком цикл. Однако частично переданный потоком цикл также использует меньше сверхдискретизации, чем полностью переданный потоком цикл.
HDL Coder разворачивает цикл путем инстанцирования нескольких экземпляров тела цикла в сгенерированном коде. Можно также частично развернуть цикл. Сгенерированный код использует инструкцию циклов, которая содержит несколько экземпляров исходного тела цикла и меньше итераций, чем исходный цикл.
Распределенная конвейеризация и разделение ресурсов могут оптимизировать развернутый код. Распределенная конвейеризация может увеличить скорость. Разделение ресурсов может уменьшить область.
Когда развертывание цикла создаст несколько экземпляров, эти экземпляры, вероятно, увеличат область. Развертывание цикла также делает код тяжелее, чтобы читать.
Можно задать глобальную оптимизацию цикла при помощи HDL Workflow Advisor, или в командной строке.
Можно также задать локальную оптимизацию цикла для определенного цикла при помощи coder.hdl.loopspec
прагма в коде MATLAB. Если вы задаете и глобальную и локальную оптимизацию цикла, локальная оптимизация цикла заменяет глобальную установку.
Задавать оптимизацию цикла в Советнике по вопросам Рабочего процесса:
На левой панели HDL Workflow Advisor выберите HDL Workflow Advisor> HDL Code Generation.
Во вкладке 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
прагма, эта прагма более приоритетна по сравнению с coder.hdl.loopspec
. coder.hdl.loopspec
не оказывает влияния.
HDL Coder не может передать цикл потоком если:
Индекс цикла считает в обратном порядке. Индекс цикла должен увеличиться на 1 на каждой итерации.
Существует два или больше вложенных цикла на том же уровне иерархии в другом цикле.
Какая-то конкретная персистентная переменная обновляется и внутри и снаружи цикла.
Персистентная переменная, которая инициализируется к ненулевому значению, обновляется в цикле.
HDL Coder может передать цикл потоком, когда персистентная переменная:
Обновленный в цикле и читают вне цикла.
Читайте в цикле и обновленный вне цикла.
Вы не можете использовать coder.hdl.loopspec('stream')
прагма:
В подфункции. Необходимо указать, что это в MATLAB верхнего уровня проектирует функцию.
Для цикла, который вкладывается в другом цикле.
Для цикла, содержащего вложенный цикл, если фактор потоковой передачи не равен количеству итераций.