В этой статье хочу рассмотреть различные ПЛИС со стороны потребления ресурсов одного и того же проекта. Всем известно, что ПЛИС состоит из блоков (CLB), а вот содержимое этих блоков качественно меняется от поколения к поколению.
Прослеживается тенденция (и она очевидна), что сложность CLB повышается, сами примитивы становятся хитрее. От сюда вытекает вопрос, а на сколько эффективными становятся ячейки, и сколько ресурсов ПЛИС они экономят в сравнении с предыдущими поколениями?
Краткое пояснение
Эта статья не про оптимизацию и не описание внутреннего строения ПЛИС. Это МИНИ-статья, которая рассматривает конкретный аспект: сколько ресурсов потребляет один и тот же проект на разных ПЛИС.
Суть эксперимента
Я решил взять готовый код с гитхаба AES-128 написанный на Verilog, сделать ему минимальную обвязку и собрать.
Структура проекта получилась следующей:
Модуль UART на входе, для приема 16 байт ключа и 16 байт данных; так же условно добавил 1 байт в начале для определения передаваемых данных (ключ или данные), в первом байте также передается режим работы модуля: кодировать или декодировать. Таким образом функционал модуля задействован полностью и синтезатор не должен выкинуть лишнее.
Результат работы модуля AES-128 сохраняется в регистр, тоже 16-байтный и побайтно выводится через тот же UART.

Подопытные
Для данного эксперимента мне не нужно иметь физически ПЛИС на руках, достаточно выбрать целевой камень в проекте и сделать имплементацию. А это значит, что нужно определиться с выбором FPGA, которые будут участвовать.
Начну с самого маленького кристалла:
Spartan-3 (XC3S1000) – Я пробовал взять XC3S400, но проект в эту ПЛИС не влез.
Spartan-6 (XC6SLX16) – На таком кристалле есть пустые ��тладки на Aliexpress. У меня такая уже есть, поэтому решил взять именно ее, несмотря на то что в мире полно отладок и на XC6SLX9.
Artix-7 (xc7a100t) – У меня имеется отладка Nexys A7, на ней как раз стоит этот кристалл, поэтому выбор пал на нее как на представителей седьмого семейства.
Kintex UltraScale (xcku040) – c UltraScale я напрямую не сталкивался и не знаю какую ПЛИС удачнее выбрать, поэтому пошел на Aliexpress, вбил ключевые слова и нашел пару отладок, с них и взял название кристалла.
Наверняка все заметили, что в эксперименте участвуют ПЛИС фирмы Xilinx. Так сложилось, что на практике я сталкивался только с этой фирмой.
Ход эксперимента
Список я начал с самой маленькой ПЛИС, и эксперимент так же начну с самой маленькой.
Spartan-3.
Slice Registers | 2448 |
4 input LUTs | 10001 |
Slices | 6265 |
report utilization

Тут стоит отметить, что в Spartan-3 один слайс имеет 2 LUT и 2 регистра, примерно так и получается, что потребление LUT-ов примерно в 2 раза больше, чем слайсов (разумеется, численно). Далее будет видно, как потребление LUT будет уменьшаться.
Также хочу отметить, что при первой попытке сборки синтезатор использовал ROM память, чем увеличил частоту проекта и дополнительно увеличил потребление ресурсов. Чем это объяснить - не знаю.
Spartan 6.
Slice Registers | 2451 |
Slices LUTs | 5188 |
Slices | 1573 |
Для этой сборки пришлось обратно включить использование RAM и ROM, возможно потому, что некоторые ресурсы слайсов могут использоваться в качестве памяти. Поэтому в данном плане эксперимент в потреблении ресурсов в сравнении со Спартан 3 будет не чистым, но(!) при полученной сборке не пострадал использовался ни один ROM.
Итак, что имеем: количество использованных регистров осталось ± прежним. А вот использование LUT, значительно сократилось. Также сократилось использование слайсов. Это вызвано в первую очередь измененной архитектурой слайса. Каждый слайс стал иметь до четырех 6-входовых LUT и 8 регистров. За счет увеличения количества входов LUT синтезатору удается более эффективно собрать код, а за счет увеличенного числа ресурсов на слайс, число слайсов уменьшилось.
report utilization

Artix -7.
Slice Registers | 2460 |
Slices LUTs | 3412 |
Slices | 1214 |
F7 Muxes | 545 |
F8 Muxes | 140 |
Здесь стоит отметить, что я перешел в Vivado 2019.1.
В седьмом семействе ПЛИС уже на одну CLB полагается два слайса. В каждом слайсе 16 регистров, 8 лутов, и дополнительные функции - такие как: арифметические цепи и цепи переноса, распределё��ная память и сдвиговый регистр. Помимо того, значительно улучшена маршрутизация компонентов.
И аналогично видно, что потребление ресурсов снова снизилось, за счет более эффективных примитивов. Также видно, что добавились мультиплексоры, которые, кстати объединяют 2 LUT в один логический.
report utilization

Kintex UltraScale.
Slice Registers | 2462 |
Slices LUTs | 3409 |
CLB(вместо Slice) | 608 |
F7 Muxes | 545 |
F8 Muxes | 140 |
На данном этапе теория провалилась. Поколение изменило ступень, но значительного прироста не произошло, зато они изменили архитектуру - если в предыдущем поколении на один CLB приходилось 2 Slice, то в этом кристалле от слайсов отказались и все считают в CLB; и все ресурсы что были раньше из двух слайсов переместили в один CLB. Из-за чего можно отметить уменьшение числа CLB вместо слайсов в два раза. Кроме того в этом семействе появились F9 Muxes, что в перспективе должно улучшить сборку проектов.
report utilization

Итоговая таблица
Параметр | Spartan-3 | Spartan-6 | Artix-7 | Kintex UltraScale | Kintex UltraScale+ |
Slice Registers | 2448 | 2451 | 2460 | 2462 | 2462 |
LUTs | 10001 | 5188(-48%) | 3412(-34%) | 3409 | 3410 |
Slice/CLB | 6265 | 1573(-75%) | 1214(-23%) | 608(-0%) CLB | 673 CLB |
F7 Muxes | - | - | 545 | 545 | 545 |
F8 Muxes | - | - | 140 | 140 | 140 |
В таблице выше я свел все показатели в одну таблицу. В скобках указан процент того, сколько было сохранено ресурсов в сравнени�� с предыдущим поколением.
Из таблицы видно, что потребление регистров не сильно зависит от поколения ПЛИС.
Значимых улучшений для UltraScale не наблюдается, видимо это какой-то переходный этап у Xilinx. Также не удержался и сделал контрольную сборку, но для UltraScale+. Видно, что поднялось потребление CLB, но все остальное осталось прежним.
Заключение
Новое поколение ПЛИС это не только про повышение частоты и уменьшение нанометров, но также про более эффективное использование ресурсов. Разумеется, это связанно в первую очередь с изменением архитектуры ячеек и примитивов.
Использованная литература.
