В этой статье хочу рассмотреть различные ПЛИС со стороны потребления ресурсов одного и того же проекта. Всем известно, что ПЛИС состоит из блоков (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, но все остальное осталось прежним.
Заключение
Новое поколение ПЛИС это не только про повышение частоты и уменьшение нанометров, но также про более эффективное использование ресурсов. Разумеется, это связанно в первую очередь с изменением архитектуры ячеек и примитивов.
Использованная литература.
nerudo
Для полноты исследования интересно было бы сразу привести тактовую частоту, на которой это ядро сможет работать в каждом семействе. Без фанатизма, например с настройками компиляции по-умолчанию и на каком-нибудь среднем speed grade.