HDL Block Properties: Общий

Обзор

Блокируйтесь параметры реализации позволяют вам управлять деталями кода, сгенерированного для определенных реализаций блока. См. Модель HDL Набора и Представления и Параметры блоков, чтобы изучить, как выбрать реализации блока и параметры в графический интерфейсе пользователя или командной строке.

Имена свойства заданы как векторы символов. Тип данных значения свойства характерен для свойства. В этом разделе описываются синтаксис каждого параметра реализации блока и как параметр влияет на сгенерированный код.

Свойства блока HDL библиотечных блоков

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

Предположим, что библиотека содержит блок Subsystem с набором архитектуры HDL к Module. Когда вы инстанцируете этого блока в своей модели, экземпляр блока использует Module как архитектура HDL. Если вы изменяете архитектуру HDL блока Subsystem в библиотеке к BlackBox, существующие экземпляры того блока Subsystem в вашей модели все еще используют Module как архитектура HDL. Если вы теперь добавляете экземпляры блока Subsystem из библиотеки в вашей модели, новые экземпляры блока получают копию текущих свойств блока HDL, и поэтому используют BlackBox как архитектура HDL. Если вы хотите, чтобы архитектура HDL блока Subsystem в библиотеке синхронизировалась с ее экземплярами в модели, создаете подсистему обертки с архитектурой HDL, которую вы хотите в этом Subsystem.

AdaptivePipelining

AdaptivePipelining параметр подсистемы позволяет вам установить адаптивную конвейеризацию на подсистеме в модели.

Адаптивная установка конвейеризацииОписание
'inherit' (значение по умолчанию)

Используйте адаптивную установку конвейеризации родительской подсистемы. Если эта подсистема является подсистемой высшего уровня, используйте адаптивную установку конвейеризации для модели.

'on'

Вставьте адаптивные конвейеры для этой подсистемы.

'off'

Не вставляйте адаптивные конвейеры для этой подсистемы, даже если родительская подсистема имеет адаптивную включенную конвейеризацию.

Чтобы отключить адаптивную конвейеризацию для подсистемы в модели, установите адаптивный параметр конвейеризации, AdaptivePipelining, к 'off' для той подсистемы.

Чтобы изучить, как установить уровень модели адаптивная конвейеризация, смотрите Адаптивную конвейеризацию.

Установите адаптивную конвейеризацию для подсистемы

Установить адаптивную конвейеризацию для подсистемы от диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по подсистеме и выберите HDL Code> HDL Block Properties.

  2. Для AdaptivePipelining выберите inherit, on или off.

Чтобы установить адаптивную конвейеризацию для подсистемы из командной строки, использовать hdlset_param. Например, чтобы выключить адаптивную конвейеризацию для подсистемы, my_dut:

hdlset_param('my_dut', 'AdaptivePipelining', 'off')
См. также hdlset_param.

BalanceDelays

BalanceDelays параметр подсистемы позволяет вам установить задержку, балансирующуюся на подсистеме в модели.

Установка BalanceDelaysОписание
'inherit' (значение по умолчанию)

Используйте установку балансировки задержки родительской подсистемы. Если эта подсистема является подсистемой высшего уровня, используйте установку балансировки задержки для модели.

'on'Сбалансируйте задержки этой подсистемы.
'off'Не балансируйте задержки этой подсистемы, даже если родительская подсистема имеет включенную балансировку задержки.

Чтобы отключить задержку, балансирующуюся для любой подсистемы в модели, необходимо установить параметр балансировки задержки уровня модели, BalanceDelays, к 'off'. Когда балансировка задержки включена на модели, установка балансировки задержки на отдельных подсистемах проигнорирована.

Чтобы изучить, как установить балансировку задержки уровня модели, смотрите задержки Баланса.

Установите задержку, балансирующуюся для подсистемы

Установить задержку, балансирующуюся для подсистемы с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по подсистеме.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для BalanceDelays выберите inherit, on или off.

Чтобы установить задержку, балансирующуюся для подсистемы из командной строки, использовать hdlset_param. Например, к задержке при выключении, балансирующейся для подсистемы, my_dut:

hdlset_param('my_dut', 'BalanceDelays', 'off')
См. также hdlset_param.

ClockRatePipelining

ClockRatePipelining параметр подсистемы позволяет вам установить конвейеризацию тактовой частоты на подсистеме в модели.

Установка конвейеризации тактовой частотыОписание
'inherit' (значение по умолчанию)

Используйте установку конвейеризации тактовой частоты родительской подсистемы. Если эта подсистема является подсистемой высшего уровня, используйте установку конвейеризации тактовой частоты для модели.

'on'

Вставьте конвейеры тактовой частоты для этой подсистемы.

'off'

Не вставляйте конвейеры тактовой частоты для этой подсистемы, даже если родительская подсистема имеет включенную конвейеризацию тактовой частоты.

Чтобы отключить конвейеризацию тактовой частоты для подсистемы в модели, установите параметр конвейеризации тактовой частоты, ClockRatePipelining, к 'off' для той подсистемы.

Чтобы изучить, как установить конвейеризацию тактовой частоты уровня модели, смотрите, что Тактовая частота конвейерно обрабатывает.

Установите конвейеризацию тактовой частоты для подсистемы

Установить конвейеризацию тактовой частоты для подсистемы с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по подсистеме.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для ClockRatePipelining выберите inherit, on или off.

Чтобы установить конвейеризацию тактовой частоты для подсистемы из командной строки, использовать hdlset_param. Например, чтобы выключить конвейеризацию тактовой частоты для подсистемы, my_dut:

hdlset_param('my_dut', 'ClockRatePipelining', 'off')
См. также hdlset_param.

CodingStyle

Когда вы будете использовать блоки Multiport Switch, используйте CodingStyle параметр, чтобы задать, хотите ли вы сгенерировать HDL-код с если еще или операторы выбора. По умолчанию HDL Coder™ генерирует если еще операторы. Если у вас есть несколько блоков Multiport Switch в вашей модели, можно принять решение задать различный CodingStyle для каждого блока.

Установка CodingStyleОписание
'ifelse_stmt'(Значение по умолчанию)Сгенерируйте если еще операторы в коде Verilog или когда еще операторы в коде VHDL для блока Multiport Switch.
'case_stmt'Сгенерируйте операторы выбора в коде Verilog или случае - когда операторы в коде VHDL для блока Multiport Switch.

Установите CodingStyle для блока Multiport Switch

Установить CodingStyle для Multiport Switch с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по блоку Multiport Switch.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для CodingStyle выберите ifelse_stmt или case_stmt.

Видеть CodingStyle заданный для подсистемы из командной строки, использовать hdlget_param. Например, чтобы видеть настройки, заданные для блока Multiport Switch в подсистеме, my_dut:

hdlget_param('my_dut/Multiport Switch', 'CodingStyle')
ans =

    'case_stmt'
См. также hdlset_param.

ConstMultiplierOptimization

ConstMultiplierOptimization параметр реализации позволяет вам задать использование канонической цифры со знаком (CSD) или учтенную оптимизацию CSD для обработки содействующих операций множителя в сгенерированном коде.

Следующая таблица показывает ConstMultiplierOptimization значения параметров.

Установка ConstMultiplierOptimizationОписание
'none'
(Значение по умолчанию)
По умолчанию HDL Coder не выполняет CSD или оптимизацию FCSD. Код, сгенерированный для блока Gain, сохраняет операции множителя.
'CSD'Когда вы задаете эту опцию, сгенерированный код уменьшает область, используемую моделью при поддержании или увеличении тактовой частоты, использовании методов канонической цифры со знаком (CSD). CSD заменяет операции множителя на, добавляют и вычитают операции. CSD минимизирует количество операций сложения, требуемых для постоянного умножения путем представления двоичных чисел минимальным количеством ненулевых цифр.
'FCSD'Эта опция использует учтенный CSD (FCSD) методы, которые заменяют операции множителя на сдвиг и добавляют/вычитают операции на определенных факторах операндов. Эти факторы являются обычно главными, но могут также быть номером близко к степени 2, который способствует сокращению области. Эта опция позволяет вам достигнуть большего сокращения области, чем CSD, за счет уменьшения тактовой частоты.
'auto'

Когда вы задаете эту опцию, HDL Coder выбирает между CSD или оптимизацией FCSD. Кодер выбирает оптимизацию, которая дает к большей части эффективного внедрения области, на основе количества требуемых сумматоров. Когда вы задаете 'auto', кодер не использует множители, если условия не таковы, что CSD или оптимизация FCSD не возможны (например, если проект использует арифметику с плавающей точкой).

ConstMultiplierOptimization параметр доступен для следующих блоков:

  • Усиление

  • График Stateflow®

  • Таблица истинности

  • MATLAB Function

  • MATLAB System

ConstrainedOutputPipeline

Используйте ConstrainedOutputPipeline параметр, чтобы задать неотрицательное количество регистров, чтобы поместить в блоке выходные параметры.

HDL Coder перемещает существующие задержки в рамках вашего проекта, чтобы попытаться соответствовать вашему ограничению. Новые регистры не добавляются. Если существует меньше регистров, чем кодер должен удовлетворить вашему ограничению, кодер сообщает о различии между количеством желаемых и фактических выходных регистров. Можно добавить задержки с проектом с помощью конвейеризации ввода или вывода.

Распределенная конвейеризация не перераспределяет регистры, которые вы задаете с ограниченной выходной конвейеризацией.

Как задать ограниченную Выходную конвейеризацию

Задавать ограниченную выходную конвейеризацию для блока с помощью графический интерфейса пользователя:

  1. Щелкните правой кнопкой по блоку и выберите HDL Code> HDL Block Properties.

  2. Для ConstrainedOutputPipeline введите номер регистров, которые вы хотите в выходных портах.

Задавать ограниченную выходную конвейеризацию, в командной строке, введите:

hdlset_param(path_to_block,
             'ConstrainedOutputPipeline', number_of_output_registers)
Например, чтобы ограничить 6 регистров в выходных портах подсистемы, subsys, в вашей модели, mymodel, Введите:
hdlset_param('mymodel/subsys','ConstrainedOutputPipeline', 6)

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

DistributedPipelining

DistributedPipelining параметр включает конвейерное распределение регистра, оптимизацию скорости, которая позволяет вам увеличить свою тактовую частоту путем сокращения критического пути.

Следующая таблица показывает эффект DistributedPipelining и OutputPipeline параметры.

DistributedPipeliningOutputPipeline, nStagesРезультат
'off' (значение по умолчанию)Незаданный (nStages значения по умолчанию к 0)HDL Coder не вставляет конвейерные регистры.
nStages > 0Кодер вставляет nStages выведите регистры при выходе подсистемы, блока MATLAB Function или диаграммы Stateflow.
'on' Незаданный (nStages значения по умолчанию к 0)Кодер не вставляет конвейерные регистры.
DistributedPipelining не оказывает влияния.
nStages > 0Кодер распределяет nStages регистры в подсистеме, блоке MATLAB Function или диаграмме Stateflow, на основе анализа критического пути.

Чтобы достигнуть дальнейшей оптимизации кода, сгенерированного с распределенной конвейеризацией, выполните повторную синхронизацию во время синтеза RTL, если это возможно.

Совет

Выходные данные могут быть в недопустимом состоянии первоначально, если вы вставляете конвейерные регистры. Чтобы избежать ошибок испытательного стенда, следующих из начальных недопустимых выборок, отключите выходную проверку те выборки. Для получения дополнительной информации смотрите, Игнорируют проверку выходных данных (количество выборок).

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

DotProductStrategy

Если вы используете блок Product для умножения матриц в вашем проекте, используйте DotProductStrategy задавать, как вы хотите реализовать умножение матриц.

DotProductStrategy опции перечислены в следующей таблице.

Значение DotProductStrategyОписание
'Fully Parallel' (значение по умолчанию)

Расширяет операцию умножения матриц во множители и сумматоры. Например, если вы умножаетесь два 2x2 матрицы, реализация использует восемь множителей и четыре сумматора, чтобы вычислить результат.

Примечание

DotProductStrategy должен быть установлен в 'Fully Parallel' когда вы используете Native Floating Point режим.

'Serial Multiply-Accumulate'

Использует архитектуру Serial блока Multiply-Accumulate, чтобы реализовать умножение матриц.

В этой архитектуре тактовая частота должна быть быстрее, чем тактовая частота, которую вы задаете с архитектурой Parallel. Вы видите тактовую частоту в информации о Сводных данных Часов отчета Генерации кода.

'Parallel Multiply-Accumulate'

Использует архитектуру Parallel блока Multiply-Accumulate, чтобы реализовать умножение матриц.

DSPStyle

DSPStyle позволяет вам сгенерировать код, который включает атрибуты синтеза для отображения множителя в вашем проекте. Можно выбрать, сопоставить ли множители конкретного блока с DSPS или логикой в оборудовании.

Для целей Xilinx® сгенерированный код использует use_dsp атрибут. Для целей Altera® сгенерированный код использует multstyle атрибут.

DSPStyle опции перечислены в следующей таблице.

Значение DSPStyleОписание
'none' (значение по умолчанию)

Не вставляйте DSP, сопоставляющий атрибут синтеза.

'on'

Вставьте атрибут синтеза, который направляет инструмент синтеза, чтобы сопоставить с DSPS в оборудовании.

'off'

Вставьте атрибут синтеза, который направляет инструмент синтеза, чтобы сопоставить с логикой в оборудовании.

DSPStyle параметр доступен для следующих блоков:

  • Gain

  • Product

  • Product of Elements с набором Архитектуры к Дереву

  • Subsystem

  • Atomic Subsystem

  • Variant Subsystem

  • Enabled Subsystem

  • Triggered Subsystem

  • Model с набором Архитектуры к ModelReference

Поведение выравнивания иерархии

Если вы задаете иерархию, сглаживающуюся для подсистемы, которая также имеет DSPStyle не по умолчанию установка, HDL Coder распространяет DSPStyle установка на родительскую подсистему.

Если сглаженная подсистема содержит Gain, Product или блоки Product of Elements, кодер сохраняет их DSPStyle не по умолчанию настройки и значение по умолчанию замен DSPStyle настройки со сглаженной подсистемой DSPStyle установка.

Атрибуты синтеза в сгенерированном коде

Сгенерированный код для атрибутов синтеза зависит от:

  • Выходной язык

  • DSPStyle значение

  • SynthesisTool значение

Следующая таблица показывает примеры атрибутов синтеза в сгенерированном коде.

Значение DSPStyleЗначение TargetLanguageЗначение SynthesisTool
'Altera Quartus II''Xilinx ISE'
'Xilinx Vivado'
'none''Verilog'

wire signed [32:0] m4_out1;

wire signed [32:0] m4_out1;

'VHDL'

m4_out1 : signal;

m4_out1 : signal;

'on''Verilog'

(* multstyle = "dsp" *) wire signed [32:0] m4_out1;

(* use_dsp = "yes" *) wire signed [32:0] m4_out1;

'VHDL'

attribute multstyle : string ;

attribute multstyle of m4_out1 : signal is "dsp" ;

attribute use_dsp : string ;

attribute use_dsp of m4_out1 : signal is "yes" ;

'off''Verilog'

(* multstyle = "logic" *) wire signed [32:0] m4_out1;

(* use_dsp = "no" *) wire signed [32:0] m4_out1;

'VHDL'

attribute multstyle : string ;

attribute multstyle of m4_out1 : signal is "logic" ;

attribute use_dsp : string ;

attribute use_dsp of m4_out1 : signal is "no" ;

Требование для спецификации атрибута синтеза

Необходимо задать инструмент синтеза при помощи SynthesisTool свойство.

Как задать атрибут синтеза

Задавать атрибут синтеза с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по блоку.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для DSPStyle выберите on, off или none.

Чтобы задать атрибут синтеза из командной строки, использовать hdlset_param. Например, предположите, что у вас есть модель, my_model, с подсистемой DUT, my_dut, это содержит a. Получите блок, my_multiplier. Вставить атрибут синтеза, чтобы сопоставить my_multiplier к DSP, введите:

hdlset_param('my_model/my_dut/my_multiplier', 'DSPStyle', 'on')
См. также hdlset_param.

Ограничения для спецификации атрибута синтеза

  • Когда вы задаете DSPStyle не по умолчанию блокируйте свойство, ConstMultiplierOptimization свойство должно быть установлено в 'none'.

  • Входные параметры к компонентам множителя не могут использовать double тип данных.

  • Постоянный Gain не может быть степенью 2.

FlattenHierarchy

FlattenHierarchy позволяет вам удалить иерархию подсистемы из HDL-кода, сгенерированного из вашего проекта.

Установка FlattenHierarchyОписание
'inherit' (значение по умолчанию)Используйте установку выравнивания иерархии родительской подсистемы. Если эта подсистема является подсистемой высшего уровня, не сглаживаться.
'on'Сгладьте эту подсистему.
'off'Не сглаживайте эту подсистему, даже если родительская подсистема сглажена.

Чтобы сгладить иерархию, у вас должен также быть MaskParameterAsGeneric глобальный набор свойств к 'off'. Для получения дополнительной информации смотрите, Генерируют параметрированный HDL-код от подсистемы маскированной.

Как сгладить иерархию

Установить выравнивание иерархии с помощью диалогового окна HDL Block Properties:

  • Во вкладке Apps выберите HDL Coder. Вкладка HDL Code появляется. Выберите Subsystem и затем нажмите HDL Block Properties. Для FlattenHierarchy выберите on, off или inherit.

  • Щелкните правой кнопкой по Subsystem и выберите HDL Code> HDL Block Properties. Для FlattenHierarchy выберите on, off или inherit.

Чтобы установить иерархию, сглаживающуюся из командной строки, использовать hdlset_param. Например, чтобы включить иерархию, сглаживающуюся для подсистемы, my_dut:

hdlset_param('my_dut', 'FlattenHierarchy', 'on')
См. также hdlset_param.

Ограничения для выравнивания иерархии

Подсистема не может быть сглажена, если подсистема:

  • Synchronous Subsystem или использование блок State Control в Synchronous режим.

  • Реализация модели - ссылки.

  • Триггируемая подсистема, когда триггерный сигнал Использования, когда часы включены.

  • Подсистема маскированная, которая содержит любое следующее:

    • Шина.

    • Перечислимый тип данных.

    • Блоки интерполяционной таблицы: 1-D Lookup Table, 2-D Lookup Table, Cosine HDL Optimized, Direct LookupTable (n-D), Prelookup, Sine HDL Optimized, n-D Lookup Table.

    • Блок MATLAB System.

    • Блоки Stateflow: Chart, State Transition Table, Sequence Viewer.

    • Блоки с передачей или никакой-op реализацией. Смотрите Проходят, Никакой HDL и Каскадные Реализации.

Примечание

Эта опция удаляет контуры подсистемы перед генерацией кода. Это не обязательно генерирует HDL-код с абсолютно плоской иерархией.

InputPipeline

InputPipeline позволяет вам задать реализацию с входной конвейеризацией для выбранных блоков. Значение параметров задает количество входных настроек канала связи (конвейерная глубина) в сгенерированном коде.

Следующий код задает входную конвейерную глубину двух этапов для каждого блока Sum в модели:

sblocks = find_system(gcb, 'BlockType', 'Sum');
for ii=1:length(sblocks),hdlset_param(sblocks{ii},'InputPipeline', 2), end;

Примечание

InputPipeline установка не оказывает влияния на блоки, которые не имеют входного порта.

При генерации кода для конвейерных регистров HDL Coder добавляет постфиксную строку к именам конвейерных регистров ввода или вывода. Постфиксной строкой по умолчанию является _pipe. Чтобы настроить постфиксную строку, используйте опцию Pipeline postfix в панели Global Settings / General в панели HDL Code Generation диалогового окна Configuration Parameters. В качестве альтернативы можно передать желаемый постфикс как вектор символов в makehdl свойство PipelinePostfix. Для примера смотрите Конвейерный постфикс.

InstantiateFunctions

Для блока MATLAB function можно использовать параметр InstantiateFunctions, чтобы сгенерировать VHDL® entity или Verilog® module для каждой функции. HDL Coder генерирует код для каждого entity или module в отдельном файле.

Опции InstantiateFunctions для блока MATLAB Function перечислены в следующей таблице.

Установка InstantiateFunctionsОписание
'off' (значение по умолчанию)

Сгенерируйте код для встроенных функций.

'on'

Сгенерируйте VHDL entity или Verilog module для каждой функции, и сохраняют каждый module или entity в отдельном файле.

Как сгенерировать код Instantiable для функций

Устанавливать параметр InstantiateFunctions с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по блоку MATLAB Function.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для InstantiateFunctions выберите on.

Чтобы установить параметр InstantiateFunctions из командной строки, использовать hdlset_param. Например, чтобы сгенерировать instantiable код для функций в блоке MATLAB Function, myMatlabFcn, в вашей подсистеме DUT, myDUT, Введите:

hdlset_param('my_DUT/my_MATLABFcnBlk', 'InstantiateFunctions', 'on')

Сгенерируйте код, встроенный для определенных функций

Если вы хотите сгенерировать instantiable код для некоторых функций, но не других, позвольте опции сгенерировать instantiable код для функций и использование coder.inline. Смотрите coder.inline для деталей.

Ограничения для генерации кода Instantiable для функций

Программное обеспечение генерирует код, встроенный когда:

  • Вызовы функции в рамках условного кода или for циклы.

  • Любая функция вызвана с непостоянным struct входной параметр.

  • Функция имеет состояние, такое как персистентная переменная, и вызвана многократно.

  • Существует перечисление где угодно в функции проекта.

InstantiateStages

Для Cascade архитектура, можно использовать параметр InstantiateStages, чтобы сгенерировать VHDL entity или Verilog module для каждого этапа расчета. HDL Coder генерирует код для каждого entity или module в отдельном файле.

Установка InstantiateStagesОписание
'off' (значение по умолчанию)

Сгенерируйте каскадные этапы в одном VHDL entity или Verilog module.

'on'

Сгенерируйте VHDL entity или Verilog module для каждого каскадного этапа, и сохраняют каждый module или entity в отдельном файле.

LoopOptimization

LoopOptimization позволяет вам передать потоком или развернуть циклы в коде, сгенерированном от блока MATLAB Function. Потоковая передача цикла оптимизирует для области; развертывание цикла оптимизирует для скорости.

Примечание

Если вы задаете MATLAB Datapath архитектура блока MATLAB Function, можно только развернуть циклы. К потоковым циклам можно использовать оптимизацию потоковой передачи путем определения StreamingFactor. Смотрите Оптимизацию HDL Через Контур блока MATLAB function Используя Архитектуру MATLAB Datapath.

Установка LoopOptimizationОписание
'none' (значение по умолчанию)Не оптимизируйте циклы.
'Unrolling'Разверните циклы.
'Streaming'Потоковые циклы.

Как оптимизировать циклы for блока MATLAB Function

Выбрать оптимизацию цикла с помощью диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по блоку MATLAB Function.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для LoopOptimization выберите none, Unrolling, или Streaming.

Чтобы выбрать оптимизацию цикла из командной строки, использовать hdlset_param. Например, чтобы включить потоковую передачу цикла для блока MATLAB Function, my_mlfn:

hdlset_param('my_mlfn', 'LoopOptimization', 'Streaming')
См. также hdlset_param.

Ограничения для оптимизации цикла блока MATLAB Function

HDL Coder не может передать цикл потоком если:

  • Индекс цикла считает в обратном порядке. Индекс цикла должен увеличиться на 1 на каждой итерации.

  • Существует 2 или больше вложенных цикла на том же уровне иерархии в другом цикле.

  • Какая-то конкретная персистентная переменная обновляется и внутри и снаружи цикла.

HDL Coder может передать цикл потоком, когда персистентная переменная:

  • Обновленный в цикле и читают вне цикла.

  • Читайте в цикле и обновленный вне цикла.

LUTRegisterResetType

Используйте LUTRegisterResetType параметры блоков, чтобы управлять синтезом LUT в структуру ROM на FPGA.

Значение LUTRegisterResetTypeОписание
default

LUT регистр выхода имеет логику сброса по умолчанию. Когда вы сгенерируете HDL, LUT будет синтезироваться как регистры.

none

LUT регистр выхода не имеет никакой логики сброса. Когда вы сгенерируете HDL, LUT будет синтезироваться как ROM.

Можно задать LUTRegisterResetType для следующих блоков:

  • Gamma Correction

  • Lookup Table

Блок NCO HDL Optimized игнорирует этот параметр.

MapPersistentVarsToRAM

С MapPersistentVarsToRAM параметр реализации, можно использовать основанное на RAM отображение для персистентных массивов блока MATLAB Function вместо того, чтобы сопоставить с регистрами.

Установка MapPersistentVarsToRAMОтображение поведения

off

Персистентные массивы сопоставляют с регистрами в сгенерированном HDL-коде.

on

Персистентные переменные типа массив сопоставляют с RAM. Для ограничений смотрите, что RAM Сопоставляет Ограничения.

Ограничения отображения RAM

Когда вы включаете отображение RAM, персистентный массив или пользовательская Система object™ частная собственность сопоставляют с блоком RAM, когда все следующие условия верны:

  • Каждый доступ для чтения или доступ для записи для одного элемента только. Например, доступ к субматрице и копии массивов не позволены.

  • Логика расчета адреса не зависима чтением. Например, расчет чтения или адреса записи с помощью данных, считанных из массива, не позволен.

  • Персистентные переменные или пользовательские частные свойства Системного объекта инициализируются к 0, если у них есть циклическая зависимость. Например, если у вас есть две персистентных переменные, A и B, у вас есть циклическая зависимость, если A зависит от B, и B зависит от A.

  • Если доступ в условном операторе, условный оператор использует только простые логические выражения (&&, ||, ~) или операторы отношения. Например, в следующем коде, r1 не сопоставляет с RAM:

    if (mod(i,2) > 0)
        a = r1(u);
    else
        r1(i) = u;
    end 

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

    temp = mod(i,2);
    if (temp > 0)
        a = r1(u);
    else
        r1(i) = u;
    end 

  • Персистентный массив или пользовательское значение частной собственности Системного объекта зависят от внешних входных параметров.

    Например, в следующем коде, bigarray не сопоставляет с RAM, потому что он не зависит от u:

    function z = foo(u)
    
    persistent cnt bigarray
    if isempty(cnt)
        cnt = fi(0,1,16,10,hdlfimath);
        bigarray = uint8(zeros(1024,1));
    end
    z = u + cnt;
    idx = uint8(cnt);
    temp = bigarray(idx+1);
    cnt(:) = cnt + fi(1,1,16,0,hdlfimath) + temp;
    bigarray(idx+1) = idx; 

  • RAMSize больше или равен RAMMappingThreshold значение. RAMSize продукт NumElements * WordLength * Complexity.

    • NumElements число элементов в массиве.

    • WordLength количество битов, которые представляют тип данных массива.

    • Complexity 2 для массивов с комплексным базовым типом; 1 в противном случае.

Если какое-либо из вышеупомянутых условий является ложным, персистентный массив или пользовательская частная собственность Системного объекта сопоставляют с регистром в HDL-коде.

RAMMappingThreshold

Значение по умолчанию RAMMappingThreshold 256. Чтобы изменить порог, использовать hdlset_param. Например, следующая команда изменяет порог отображения для sfir_fixed модель к 128 битам:

hdlset_param('sfir_fixed', 'RAMMappingThreshold', 128);

Можно также изменить порог отображения RAM в диалоговом окне Configuration Parameters. Для получения дополнительной информации смотрите, что RAM сопоставляет порог (биты) раздел в Параметрах Отображения RAM.

Пример

Для примера, который показывает, как сопоставить персистентные переменные типа массив с RAM в блоке MATLAB Function, смотрите, что RAM Сопоставляет С блоком MATLAB function.

OutputPipeline

OutputPipeline позволяет вам задать реализацию с выходной конвейеризацией для выбранных блоков. Значение параметров задает количество выходных настроек канала связи (конвейерная глубина) в сгенерированном коде.

Следующий код задает выходную конвейерную глубину двух этапов для каждого блока Sum в модели:

sblocks = find_system(gcb, 'BlockType', 'Sum');
for ii=1:length(sblocks),hdlset_param(sblocks{ii},'OutputPipeline', 2), end;

Примечание

OutputPipeline установка не оказывает влияния на блоки, которые не имеют выходного порта.

При генерации кода для конвейерных регистров HDL Coder добавляет постфиксную строку к именам конвейерных регистров ввода или вывода. Постфиксной строкой по умолчанию является _pipe. Чтобы настроить постфиксную строку, используйте опцию Pipeline postfix в диалоговом окне Configuration Parameters во вкладке HDL Code Generation > Global Settings > General. В качестве альтернативы можно использовать PipelinePostfix свойство с makehdl. Для примера смотрите Конвейерный постфикс.

См. также Распределенную Конвейерную Вставку для блоков MATLAB function.

RAMDirective

RAMDirective позволяет вам задать, хотите ли вы сопоставить блоки RAM в своей модели Simulink к распределенным RAM, блок RAM или Ультраоперативную память. Когда вы выбираете значение для этой установки, HDL Coder генерирует ramstyle припишите в HDL-коде. Этот атрибут задает тип модуля Оперативной памяти, который вы хотите, чтобы инструмент синтеза использовал при выведении блоков RAM в проекте.

Значение RAMDirectiveОписание
none (значение по умолчанию)

Не генерируйте ramstyle припишите в HDL-коде. Инструмент синтеза определяет тип выведенного RAM для отображения блоков RAM в вашей модели.

distributed

Сгенерируйте атрибут HDL для отображения блоков RAM в вашей модели к распределенным RAM. Распределенные RAM создаются с LUT. Эти RAM быстрее, но занимают большее число срезов LUT на FPGA.

Этот код VHDL показывает ramstyle припишите набор distributed:

 attribute ram_style: string;
 attribute ram_style of ram : signal is "distributed";

Этот код Verilog показывает ramstyle припишите набор distributed:

(* ram_style = "distributed" *)

block

Сгенерируйте атрибут HDL для отображения блоков RAM в вашей модели с блоком RAM. Блок RAM является специализированным блоком памяти на устройстве FPGA. Количество доступного блока RAM зависит от устройства FPGA, в которое вы развертываете HDL-код. Размерами блока RAM может быть 4kb, 8kb, 16kb, и 32kb.

Сопоставлять ваши блоки RAM с блоком RAM:

  • Задайте инструмент синтеза. Необходимо предназначаться для устройства Xilinx, которое содержит ресурсы блока RAM.

    Примечание

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

  • Введите целевую частоту, больше, чем нуль.

Этот код VHDL показывает ramstyle припишите набор block:

 attribute ram_style: string;
 attribute ram_style of ram : signal is "block";

Этот код Verilog показывает ramstyle припишите набор block:

(* ram_style = "block" *)

ultra

Сгенерируйте атрибут HDL для отображения блоков RAM в вашей модели к Ультраоперативной памяти. UltraRAM является специализированным блоком памяти на целевом FPGA. Количество доступных модулей Ультраоперативной памяти зависит от устройства FPGA, в которое вы развертываете HDL-код. Модули UltraRAM являются больше, чем блок RAM и могут быть столь же большими как 500Mb в размере.

Сопоставлять ваши блоки RAM с UltraRAM:

  • Задайте Xilinx Vivado® как инструмент синтеза. Необходимо предназначаться для устройства Xilinx, которое содержит ресурсы UltraRAM, такие как Virtex® UltraScale +™.

    Примечание

    Если целевое устройство не содержит Ультраоперативную память, инструмент синтеза игнорирует этот атрибут и может вывести RAM как распределенные RAM или срезы LUT. Чтобы сопоставить блоки RAM с блоком RAM вместо этого, установите RAMDirective на block.

  • Введите целевую частоту, больше, чем нуль.

  • Блоки RAM в вашем проекте должны следовать за фиксировано считанным поведением и иметь один интерфейс часов. В библиотеке HDL RAMs, за исключением Dual Port RAM и блоков Dual Rate Dual Port RAM, можно сопоставить все другие блоки RAM с UltraRAM.

  • Блокам RAM нельзя было задавать начальное значение. Когда вы используете Системные блоки RAM, такие как Single Port RAM System, Specify the RAM initial value должен быть установлен в 0. На сбросе устройства все ячейки памяти в UltraRAM инициализируются, чтобы обнулить.

Этот код VHDL показывает ramstyle припишите набор ultra:

 attribute ram_style: string;
 attribute ram_style of ram : signal is "ultra";

Этот код Verilog показывает ramstyle припишите набор ultra:

(* ram_style = "ultra" *)

Установите RAMDirective для блоков RAM

В библиотеке HDL RAMs, за исключением Dual Rate Dual Port RAM, можно задать RAMDirective свойство для всех других блоков RAM.

Установить RAMDirective для блока RAM из диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по блоку RAM.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для RAMDirective выберите none, distributed, block или ultra.

    Примечание

    Для блока Dual Port RAM вы не можете задать ultra как RAMDirective потому что блок не имеет фиксированного поведения чтения.

Установить RAMDirective для блока из командной строки использовать hdlset_param. Например, чтобы установить RAMDirective к ultra для блока Single Port RAM в подсистеме, my_dut:

hdlset_param('my_dut/Single Port RAM', 'RAMDirective', 'ultra');
См. также hdlset_param.

ResetType

Используйте ResetType параметры блоков, чтобы подавить генерацию логики сброса.

Значение ResetTypeОписание
default

Сгенерируйте логику сброса.

none

Не генерируйте логику сброса.

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

Чтобы избежать ошибок испытательного стенда во время начальной фазы, определите количество выборок, требуемых полностью загружать регистры. Затем установите опцию Ignore output data checking (number of samples) соответственно. См. также Ignore output data checking (number of samples) в Стимуле Испытательного стенда и Выходных параметрах.

Можно задать ResetType для следующих блоков:

  • Chart

  • Convolutional Deinterleaver

  • Convolutional Interleaver

  • Delay

  • Delay (DSP System Toolbox™)

  • General Multiplexed Deinterleaver

  • General Multiplexed Interleaver

  • MATLAB Function

  • MATLAB System

  • Memory

  • Tapped Delay

  • Truth Table

  • Unit Delay Enabled

  • Unit Delay

Сбросьте логику для оптимизации в блоке MATLAB function

Когда вы устанавливаете ResetType на none для блока MATLAB Function HDL Coder не генерирует логику сброса для персистентных переменных в коде MATLAB®.

Однако, если вы задаете другую оптимизацию для блока, кодер может вставить регистры та логика сброса использования. Кодер не подавляет генерацию логики сброса для этих регистров. Поэтому, если вы устанавливаете ResetType на none наряду с другой оптимизацией блока, ваш сгенерированный код может иметь порт сброса в верхнем уровне.

Как подавить генерацию логики сброса

Подавить генерацию логики сброса для блока с помощью пользовательского интерфейса:

  1. Щелкните правой кнопкой по блоку и выберите HDL Code> HDL Block Properties.

  2. Для ResetType выберите none.

Подавить генерацию логики сброса, на командной строке, введите:

hdlset_param(path_to_block,'ResetType','none')

Например, чтобы подавить генерацию логики сброса для блока Unit Delay, UnitDelay1, в подсистеме, mySubsys, на командной строке, введите:

hdlset_param('mySubsys/UnitDelay1','ResetType','none');

Задайте синхронный или асинхронный сброс

Чтобы задать синхронный или асинхронный сброс, используйте ResetType параметр уровня модели. Для получения дополнительной информации смотрите тип Сброса в Настройках Сброса и Параметрах.

SerialPartition

Используйте этот параметр на блоках Min/Max, чтобы задать разделы для последовательной каскадной архитектуры. Настройка по умолчанию использует минимальное количество разделов.

Сгенерировать это
Архитектура...
Установите SerialPartition на...
Каскадно-последовательный с явным образом заданным разделением[p1 p2 p3...pN]: вектор из N целые числа, где N количество последовательных разделов. Каждый элемент вектора задает длину соответствующего раздела. Сумма векторных элементов должна быть равна длине вектора входных данных. Значения векторных элементов должны быть в порядке убывания, кроме последних двух элементов может быть равным. Например, для входа 8 элементов, разделы [5 3] или [4 2 2] законны, но разделы [2 2 2 2] или [3 2 3] повысьте ошибку во время генерации кода.
Каскадно-последовательный с автоматически оптимизированным разделением0

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

SharingFactor

Используйте SharingFactor задавать количество функционально эквивалентных ресурсов, чтобы сопоставить с одним совместно используемым ресурсом. Значением по умолчанию является 0. Смотрите Разделение ресурсов.

SoftReset

Используйте SoftReset параметры блоков, чтобы задать, сгенерировать ли благоприятную для оборудования синхронную логику сброса или локальную логику сброса, которая совпадает с поведением симуляции Simulink. Это свойство доступно для блока Unit Delay Resettable или блока Unit Delay Enabled Resettable.

Значение SoftResetОписание
off (значение по умолчанию)

Сгенерируйте локальную логику сброса, которая совпадает с поведением симуляции Simulink.

on

Сгенерируйте синхронную логику сброса для блока. Эта опция генерирует код, который более эффективен для синтеза, но не совпадает с поведением симуляции Simulink.

Когда SoftReset установите на 'off', следующий код сгенерирован для блока Unit Delay Resettable:

always @(posedge clk or posedge reset)
  begin : Unit_Delay_Resettable_process
    if (reset == 1'b1) begin
      Unit_Delay_Resettable_zero_delay <= 1'b1;
      Unit_Delay_Resettable_switch_delay <= 2'b00;
    end
    else begin
      if (enb) begin
        Unit_Delay_Resettable_zero_delay <= 1'b0;
        if (UDR_reset == 1'b1) begin
          Unit_Delay_Resettable_switch_delay <= 2'b00;
        end
        else begin
          Unit_Delay_Resettable_switch_delay <= In1;
        end
      end
    end
  end

assign Unit_Delay_Resettable_1 = 
            (UDR_reset || 
             Unit_Delay_Resettable_zero_delay ? 1'b1 : 1'b0);
assign out0 = (Unit_Delay_Resettable_1 == 1'b1 ? 2'b00 :
            Unit_Delay_Resettable_switch_delay);

Когда SoftReset установите на 'on', следующий код сгенерирован для блока Unit Delay Resettable:

always @(posedge clk or posedge reset)
  begin : Unit_Delay_Resettable_process
    if (reset == 1'b1) begin
      Unit_Delay_Resettable_reg <= 2'b00;
    end
    else begin
      if (enb) begin
        if (UDR_reset != 1'b0) begin
          Unit_Delay_Resettable_reg <= 2'b00;
        end
        else begin
          Unit_Delay_Resettable_reg <= In1;
        end
      end
    end
  end

assign out0 = Unit_Delay_Resettable_reg;

StreamingFactor

Количество параллельных информационных каналов или векторы, чтобы преобразовать в последовательные, скалярные информационные каналы мультиплексирующими время последовательными путями данных и совместным использованием аппаратных ресурсов. Значение по умолчанию 0, который реализует полностью параллельные информационные каналы. См. также Потоковую передачу.

UsePipelines

Можно использовать этот режим с блоками Product в режимах Divide и Reciprocal. Это свойство становится доступным, когда вы устанавливаете архитектуру HDL для блоков к ShiftAdd. Эта архитектура использует алгоритм деления невосстановления, который выполняет, несколько переключают и добавляют операции, чтобы вычислить частное. ShiftAdd архитектура обеспечивает улучшенную точность по сравнению с методом приближения Ньютона-Raphson.

Когда вы используете ShiftAdd архитектура, можно использовать UsePipelines параметр реализации, чтобы задать, использовать ли конвейерную или неконвейерную реализацию деления невосстановления.

Установка UsePipelinesОтображение поведения

on (значение по умолчанию)

Используйте конвейерную реализацию невосстановления, переключают и добавляют операцию для блоков Reciprocal и Divide. Эта установка добавляет больше задержек с вашим проектом, но достигает более высокой максимальной тактовой частоты на целевом устройстве FPGA. Количество конвейеров вставило, совпадает с количеством итераций, которых алгоритм требует, чтобы вычислить частное или обратную величину.

off

Используйте неконвейерную реализацию невосстановления, переключают и добавляют операцию для блоков Reciprocal и Divide. Эта установка не добавляет задержки с вашим проектом. Когда деление и обратная величина являются ресурсоемкими операциями, чтобы достигнуть более высоких тактовых частот на целевом FPGA, установить UsePipelines на on.

Установите UsePipelines для деления и взаимных блоков

Установить UsePipelines для подсистемы от диалогового окна HDL Block Properties:

  1. Щелкните правой кнопкой по подсистеме.

  2. Выберите HDL Code> HDL Block Properties.

  3. Для UsePipelines выберите on или off.

Установить UsePipelines для блока из командной строки использовать hdlset_param. Например, чтобы выключить UsePipelines для блока Divide в подсистеме, my_dut:

hdlset_param('my_dut/divide', 'UsePipelines', 'off');
См. также hdlset_param.

UseRAM

UseRAM параметр реализации позволяет использовать основанное на RAM отображение для блока вместо того, чтобы сопоставить со сдвиговым регистром.

Установка UseRAMОтображение поведения

off

Задержка сопоставляет со сдвиговым регистром в сгенерированном HDL-коде, кроме одного случая. Для получения дополнительной информации смотрите Эффекты Потоковой передачи и Распределенной Конвейеризации.

on

Задержка сопоставляет с двухпортовым блоком RAM, когда следующие условия верны:

  • Начальное значение задержки является нулем.

  • Блок Delay не имеет внешнего сброса или включает порт.

  • Delay length> 4.

  • Задержка имеет один из следующего набора атрибутов типа данных и числовых:

    • (a) Действительный скаляр с типом данных нес плавающей точкой (таким как целое число со знаком, беззнаковое целое, фиксированная точка или булевская переменная)

    • (b) Объедините скаляр с действительными и мнимыми частями, которые используют тип данных нес плавающей точкой

    • (c) Вектор, где каждый элемент или (a) или (b)

  • RAMSize больше или равен RAMMappingThreshold значение. RAMSize продукт DelayLength * WordLength * ComplexLength.

    • DelayLength количество задержек, которые задает блок Delay.

    • WordLength количество битов, которые представляют тип данных задержки.

    • ComplexLength 2 для комплексных сигналов; 1 в противном случае.

Если какое-либо условие является ложным, задержка сопоставляет со сдвиговым регистром в HDL-коде, если это не объединяет с другими задержками, чтобы сопоставить с одним RAM. Для получения дополнительной информации смотрите Отображение Нескольких Задержек с RAM.

Этот параметр реализации доступен для блока Delay в библиотеке Simulink Discrete и блока Delay (DSP System Toolbox) в библиотеке DSP System Toolbox Signal Operations.

Отображение нескольких задержек с RAM

HDL Coder может также объединить несколько задержек равной длины в одну задержку и затем сопоставить объединенную задержку с одним RAM. Эта оптимизация предоставляет следующие преимущества:

  • Увеличенное заполнение на одном RAM

  • Совместное использование логики генерации адресов, которая минимизирует дублирование идентичного HDL-кода

  • Отображение задержек с RAM, когда отдельные задержки не удовлетворяют порогу

Следующие правила управляют, могут ли несколько задержек объединить в одну задержку:

  • Задержки должны:

    • Будьте на том же уровне иерархии подсистемы.

    • Используйте тот же скомпилированный шаг расчета.

    • Имейте UseRAM установите на on, или быть сгенерированным путем потоковой передачи или разделение ресурсов.

    • Имейте тот же ResetType установка, которая не может быть none.

  • Общий размер слова объединенной задержки не может превысить 128 битов.

  • RAMSize из объединенной задержки больше или равен RAMMappingThreshold значение. RAMSize продукт DelayLength * WordLength * VectorLength * ComplexLength.

    • DelayLength общее количество задержек.

    • WordLength количество битов, которые представляют тип данных объединенной задержки.

    • VectorLength число элементов в векторной задержке. VectorLength 1 для скалярной задержки.

    • ComplexLength 2 для комплексных задержек; 1 в противном случае.

Пример нескольких отображения задержек с блоком RAM

RAMMappingThreshold поскольку следующая модель составляет 100 битов.

Задержка и Delay1 блокируют слияние и карту к двухпортовому RAM в сгенерированном HDL-коде путем удовлетворения следующим условиям:

  • Оба блока задержки:

    • На том же уровне иерархии.

    • Используйте тот же скомпилированный шаг расчета.

    • Установите UseRAM на on в диалоговом окне свойств блока HDL.

    • Имейте ту же установку ResetType default.

  • Общий размер слова объединенной задержки составляет 28 битов, который является ниже 128-битного предела.

  • RAMSize из объединенной задержки 112 битов (4 задержки * 28-битный размер слова), который больше порога отображения 100 битов.

Когда вы генерируете HDL-код для этой модели, HDL Coder генерирует дополнительные файлы, чтобы задать отображение RAM. Кодер хранит эти файлы в том же исходном месте как другие сгенерированные файлы HDL, например, hdlsrc папка.

Эффекты потоковой передачи и распределенной конвейеризации

Когда UseRAM off для блока Delay HDL Coder сопоставляет задержку со сдвиговым регистром по умолчанию. Однако кодер изменяет UseRAM установка на on и попытки сопоставить задержку с RAM при следующих условиях:

  • Потоковая передача включена для подсистемы с блоком Delay.

  • Распределенная конвейеризация отключена для подсистемы с блоком Delay.

Предположим, что распределенная конвейеризация включена для подсистемы с блоком Delay.

  • Когда UseRAM off, блок Delay участвует в повторной синхронизации.

  • Когда UseRAM on, блок Delay не участвует в повторной синхронизации. HDL Coder не разбивает задержку, отмеченную для отображения RAM.

    Рассмотрите подсистему с двумя блоками Delay, тремя блоками Constant и тремя блоками Product:

    Когда UseRAM on для блока Delay справа, та задержка не участвует в повторной синхронизации.

Следующие сводные данные описывают, пытается ли HDL Coder сопоставить задержку с RAM вместо сдвигового регистра.

UseRAM Установка для блока задержкиОптимизация, Enabled для подсистемы с блоком задержки
Распределенная конвейеризация толькоПотоковая передача толькоОбе распределенных конвейеризации и потоковая передача
OnДаДаДа
OffНетДа, потому что отображение с RAM вместо сдвигового регистра может предоставить эффективный областью проект.Нет

VariablesToPipeline

Предупреждение

VariablesToPipeline не рекомендуется. Использование coder.hdl.pipeline вместо этого.

Параметр VariablesToPipeline позволяет вам вставить конвейерный регистр при выходе одной или нескольких переменных MATLAB. Задайте список переменных как вектор символов с пробелами, разделяющими переменные.

См. также Конвейер Выражения MATLAB.

Для просмотра документации необходимо авторизоваться на сайте