Выделение достаточных задержек для операций с плавающей точкой

Проблема

Иногда, при генерации кода из алгоритма с плавающей точкой в Simulink®HDL Coder™ создает ошибку, что не может выделить достаточное количество задержек.

Причина

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

Если вы открываете этот пример модели RunningSum.slx, вы видите модель Simulink™, которая использует отдельные типы данных.

Чтобы сгенерировать HDL-код для CumSum_Sl Подсистема, щелкните правой кнопкой мыши подсистему и выберите HDL-код > Сгенерировать HDL для Подсистемы. Во время генерации кода HDL- Coder™ генерирует ошибку:

Unable to allocate delays to compensate for the 11 delays introduced by Add in
native floating-point mode. Consider either increasing the oversampling factor,
setting the 'Latency Strategy' to 'Zero', or adding the necessary output
pipelines via HDL block properties for other blocks in the model to accommodate
for the latency introduced by this block. 

Используя путь к блоку, упомянутому в сообщении об ошибке, перейдите к блоку Add в модели. Этот блок находится внутри цикла обратной связи.

Блок Add имеет задержку 11. При генерации кода HDL- Coder™ не могут выделить 11 задержек для блока, потому что он не может добавить соответствующие задержки к другим путям.

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

Решение

Стратегия 1: Глобальная избыточная дискретизация

Эта парадигма моделирования использует оптимизацию конвейеризации с тактовой частотой, чтобы переопределить ваш проект до тактовой частоты намного быстрее, чем частота дискретизации DUT. Чтобы включить эту оптимизацию, задайте глобальный коэффициент избыточной дискретизации для вашей модели Simulink. Задержки с плавающей точкой затем работают с более высокой тактовой частотой и могут быть успешно распределены. Для получения дополнительной информации смотрите Конвейеризацию тактовой частоты.

  1. Задайте коэффициент избыточной дискретизации, который равен или больше, чем задержка операторов с плавающей точкой, которые не могут выделить задержки. Для RunningSum модель, задайте коэффициент избыточной дискретизации, по крайней мере, равный 12. Чтобы узнать о значениях задержек операторов с плавающей точкой, смотрите Блоки Simulink, поддерживаемые собственной плавающей точкой.

    Чтобы задать коэффициент избыточной дискретизации:

    1. На вкладке Apps выберите HDL Coder. Появится вкладка HDL Code.

    2. Нажмите Settings. На вкладке HDL Code Generation > Global Settings установите Oversampling factor 12.

  2. Включите выравнивание иерархии в DUT и убедитесь, что подсистемы внутри DUT наследуют эту настройку. Для RunningSum модель, выберите CumSum_sl подсистема и нажатие кнопки HDL Block Properties на вкладке HDL Code, а затем установите FlattenHierarchy на on.

Стратегия 2: Локальная избыточная дискретизация

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

Если вы открываете RunningSum_OSmanual моделировать и перейти к блоку Add, он показывает, как можно увеличить частоту дискретизации блока Add и выделить задержки.

  • Блоки, которые находятся в контурах блоков Repeat и Zero Order Hold, работают с тактовой частотой, которая в 12 раз быстрее, чем частота дискретизации модели.

  • Подсистема имеет блок Delay длины 12 на выходе блока Add. При генерации кода блок Add поглощает этот блок Delay, который компенсирует задержку оператора. Чтобы сбалансировать задержки, подсистема содержит блоки Delay длины 12 в других путях.

Теперь можно сгенерировать HDL-код для CumSum_sl подсистема. Чтобы сгенерировать HDL-код для CumSum_Sl Подсистема, щелкните правой кнопкой мыши подсистему и выберите HDL-код > Сгенерировать HDL для Подсистемы.

Стратегия 3: Delay блоки

Используйте эту парадигму моделирования, чтобы смоделировать весь ваш проект со скоростью передачи данных Simulink. Для блоков, которые не могут вместить необходимое количество задержек, добавьте блок Delay с достаточной Delay length на выходе блоков. Задайте Delay length, которая равна задержке оператора с плавающей точкой. Убедитесь, что вы добавили соответствующие задержки в другие пути.

Для RunningSum можно добавить Delay блок длины 12 на выходе блока Add. При генерации кода Add блок поглощает эту задержку, потому что блок имеет задержку 12.

Для получения дополнительной информации см. «Факторы о задержках с собственной плавающей точкой».

Стратегия 4: Используйте пользовательскую задержку

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

  • Тактовая частота и потребление степени.

  • Коэффициент избыточного преобразования и частота дискретизации.

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

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

Чтобы увидеть, как использование пользовательской задержки может решить проблему выделения задержки, откройте модель RunningSum_Custom.slx.

Модель похожа на исходную RunningSum модель, но не имеет блока Enable. Использование блока Enable может помешать пользовательской стратегии задержки поглощать задержки. Задайте пользовательскую задержку для блока Add. Блок Add может затем поглощать Unit Delay рядом с блоком Add.

Теперь можно сгенерировать HDL-код для подсистемы CumSum_sl.

Стратегия 5: Нулевая задержка

Можно использовать параметр стратегии нулевой задержки для блоков в проекте, для которых собственная плавающая точка не может назначить задержки. По умолчанию блоки в проекте наследуют собственные настройки с плавающей точкой, которые вы задаете в диалоговом окне Параметры конфигурации (Configuration Parameters). Чтобы задать параметр стратегии нулевой задержки для блока, в диалоговом окне HDL Block Properties для этого блока на вкладке Native Floating Point задайте LatencyStrategy Zero.

Для RunningSum например, установите LatencyStrategy блока Add равной Zero. Чтобы выбрать собственную библиотеку с плавающей точкой и задать стратегию нулевого времени задержки, в командной строке введите:

fc = hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint');
hdlset_param('RunningSum/CumSum_sl/Subsystem/Add', ...
                                  'LatencyStrategy', 'Zero');

Примечание

Чтобы получить хорошую эффективность на целевом устройстве FPGA, не рекомендуется устанавливать Latency Strategy равной Zero из диалогового окна Параметры конфигурации.

См. также

Похожие примеры

Подробнее о