Как разработчик FPGA, не каждое приложение, которое мы разрабатываем, может быть реализовано с использованием устройства с достаточными ресурсами.
Для некоторых приложений, как правило, чувствительных к стоимости, занимаемой площади или энергопотреблению, нам может понадобиться работать с устройствами меньшего размера. Мы также можем оказаться в этом положении, если станем жертвой ужасного ползучести масштаба.
Один из способов, которым мы можем лучше использовать ресурсы, доступные в нашем устройстве, когда речь идет об элементах DSP, — это использовать несколько данных с одной инструкцией или сокращенно SIMD.
При использовании FPGA или SoC функция SIMD, очень похожая на SIMD в мире SW, позволяет нам использовать один ресурс для одновременного вычисления нескольких результатов.
В этом случае для нашей серии 7 и конструкций UltraScale+ рассматриваемым ресурсом будет либо DSP48E1 (серия 7), либо DSP48E2 (UltraScale+). Оба они являются сложными элементами DSP, которые позволяют выполнять высокопроизводительные вычисления в наших FPGA или SoC.
Изучив оба DSP48E1 и DSP48E2, вы увидите, что входы A, B и C имеют одинаковую ширину — 30, 18 и 48 бит соответственно. В то время как выход P также одинаков при 48 битах.
Для операций SIMD мы можем использовать эти входы для параллельного выполнения нескольких операций сложения/суммирования/накопления. В зависимости от размера векторов, с которыми мы хотим работать, у нас может быть до четырех 12-битных операций или две 24-битных операции.
Разработать RTL, чтобы воспользоваться возможностями SIMD DSP48, несложно.
Мы можем сделать это в нашем RTL, установив атрибут для обнаружения инструмента синтеза таким образом, чтобы он мог вывести правильную функцию реализации DSP48 и режим / OPCODE.
В нашем исходном коде атрибуты определены, как показано ниже.
VHDL
атрибут use_dsp : строка;
атрибут use_dsp архитектуры arch : «simd»;
Верилог
(* ‹use_dsp› = «simd» *)
Если вы не знаете, как внедрить SIMD в свой RTL, самый простой способ перепроверить правильность — обратиться к языковым шаблонам, предоставленным Vivado.
Конечно, как только мы написали код и включили атрибут в наш дизайн, мы можем запустить синтез перед реализацией. После завершения синтеза, чтобы убедиться, что механизм синтеза правильно реализовал SIMD, нам нужно проверить отчет о синтезе.
В сводном отчете вы найдете предварительное сопоставление DSP, показывающее, как используются порты A, B и C.
Мы также должны проверить использование DSP в сводном отчете, чтобы убедиться, что оно соответствует нашим ожиданиям.
Когда мы используем DSP48 таким образом, по сравнению с реализацией функций сложения/суммирования/накопления в логике, это дает несколько преимуществ. Мы получаем не только сокращение площади, необходимой для реализации функциональности, но и более энергоэффективную реализацию.
Как указано во введении, использование SIMD дает нам возможность эффективно использовать ресурсы устройства, если мы сталкиваемся с проблемами, связанными с ресурсами или рассеянием энергии в нашем целевом устройстве.
Посмотрите мои проекты FPGA/SoC:Адам Тейлор на Hackster.io
Получите код:ATaylorCEngFIET (Адам Тейлор)
Дополнительную информацию о разработке Xilinx FPGA/SoC можно найти еженедельно на MicroZed Chronicles.