Иногда, при генерации кода из алгоритма с плавающей точкой в 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 задержек для блока, потому что он не может добавить соответствующие задержки к другим путям.
Эта модель служит примером, чтобы проиллюстрировать различные стратегии для решения этой задачи.
Эта парадигма моделирования использует оптимизацию конвейеризации с тактовой частотой, чтобы переопределить ваш проект до тактовой частоты намного быстрее, чем частота дискретизации DUT. Чтобы включить эту оптимизацию, задайте глобальный коэффициент избыточной дискретизации для вашей модели Simulink. Задержки с плавающей точкой затем работают с более высокой тактовой частотой и могут быть успешно распределены. Для получения дополнительной информации смотрите Конвейеризацию тактовой частоты.
Задайте коэффициент избыточной дискретизации, который равен или больше, чем задержка операторов с плавающей точкой, которые не могут выделить задержки. Для RunningSum
модель, задайте коэффициент избыточной дискретизации, по крайней мере, равный 12
. Чтобы узнать о значениях задержек операторов с плавающей точкой, смотрите Блоки Simulink, поддерживаемые собственной плавающей точкой.
Чтобы задать коэффициент избыточной дискретизации:
На вкладке Apps выберите HDL Coder. Появится вкладка HDL Code.
Нажмите Settings. На вкладке HDL Code Generation > Global Settings установите Oversampling factor 12
.
Включите выравнивание иерархии в DUT и убедитесь, что подсистемы внутри DUT наследуют эту настройку. Для RunningSum
модель, выберите CumSum_sl
подсистема и нажатие кнопки HDL Block Properties на вкладке HDL Code, а затем установите FlattenHierarchy на on
.
Чтобы смоделировать свой проект со скоростью передачи данных и выборочно увеличить частоту дискретизации блоков, для которых 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 для Подсистемы.
Используйте эту парадигму моделирования, чтобы смоделировать весь ваш проект со скоростью передачи данных Simulink. Для блоков, которые не могут вместить необходимое количество задержек, добавьте блок Delay с достаточной Delay length на выходе блоков. Задайте Delay length, которая равна задержке оператора с плавающей точкой. Убедитесь, что вы добавили соответствующие задержки в другие пути.
Для RunningSum
можно добавить Delay блок длины 12 на выходе блока Add. При генерации кода Add блок поглощает эту задержку, потому что блок имеет задержку 12.
Для получения дополнительной информации см. «Факторы о задержках с собственной плавающей точкой».
Можно использовать стратегию задержки для различных блоков, чтобы задать пользовательское значение задержки и абсорбировать дополнительные задержки. Использование этой стратегии может оптимизировать ваш проект для компромиссов между:
Тактовая частота и потребление степени.
Коэффициент избыточного преобразования и частота дискретизации.
Дополнительные сведения о компромиссах и блоках, для которых можно задать пользовательскую задержку, см. в разделе LatencyStrategy.
Примечание.При использовании пользовательской стратегии задержки убедитесь, что Подсистема, содержащая блок, для которого собственная плавающая точка не может назначить задержки, не является условной подсистемой. То есть Подсистема не должна содержать триггер, сброс или порты включения.
Чтобы увидеть, как использование пользовательской задержки может решить проблему выделения задержки, откройте модель RunningSum_Custom.slx
.
Модель похожа на исходную RunningSum
модель, но не имеет блока Enable. Использование блока Enable может помешать пользовательской стратегии задержки поглощать задержки. Задайте пользовательскую задержку для блока Add. Блок Add может затем поглощать Unit Delay рядом с блоком Add.
Теперь можно сгенерировать HDL-код для подсистемы CumSum_sl.
Можно использовать параметр стратегии нулевой задержки для блоков в проекте, для которых собственная плавающая точка не может назначить задержки. По умолчанию блоки в проекте наследуют собственные настройки с плавающей точкой, которые вы задаете в диалоговом окне Параметры конфигурации (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
из диалогового окна Параметры конфигурации.
createFloatingPointTargetConfig