Каждому аргументу функции назначен как минимум один порт. И два аргумента функции могут иметь общий порт. На следующем рисунке показана блок-схема HLS функции свертки. Есть три порта (справа) для аргументов указателя ввода, вывода и маски. Слева есть общий порт для скалярных аргументов n, m, p и q.

Помимо аргументов, возвращаемое значение функции и весь функциональный блок имеют связанный порт, который обычно используется совместно со скалярными аргументами. Роль порта функционального блока заключается в отправке команды для запуска выполнения функции и определения времени окончания, а также о том, находится ли соответствующее оборудование в режиме ожидания. Порт функционального блока обычно используется системой времени выполнения и недоступен на уровне программирования в платформе Xilinx Vitis OpenCL.

Помимо этих портов, аппаратному модулю требуется несколько сигналов, таких как часы, сброс и сигналы прерывания , которые обычно скрыты от программистов.

Проектирование цифровых систем с синтезом высокого уровня для ПЛИС: Комбинационные схемы

Интерфейсы

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

Директивы компилятора с помощью прагмы определяют интерфейсы. Например, следующие строки определяют главные интерфейсы (т. Е. m_axi) для аргументов input, output и mask. которые определяют массивы данных.

#pragma HLS INTERFACE m_axi port=input  bundle=gmem0
#pragma HLS INTERFACE m_axi port=output bundle=gmem1
#pragma HLS INTERFACE m_axi port=mask   bundle=gmem2

Подчиненный интерфейс (т. Е. s_axilite) должен быть определен для n, m, p и q аргументы следующим образом. Обратите внимание, что при использовании одного и того же имени пакета один порт используется всеми аргументами.

#pragma HLS INTERFACE s_axilite port=n bundle=control
#pragma HLS INTERFACE s_axilite port=m bundle=control
#pragma HLS INTERFACE s_axilite port=p bundle=control
#pragma HLS INTERFACE s_axilite port=q bundle=control

Следующая строка определяет подчиненный интерфейс для возврата функции и функционального блока.

#pragma HLS INTERFACE s_axilite port=return  bundle=control

На следующем рисунке показаны сигналы, связанные с подчиненным портом. Сигналы имеют прямую аппаратную реализацию и могут иметь различную разрядность.

Протоколы

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

Таким образом, программист, который собирается использовать FPGA в качестве аппаратного ускорителя, может напрямую запустить ядро ​​C / C ++ / OpenCL на FPGA, если оно следует нескольким правилам и стилям кодирования. Эти правила делятся на две группы: коммуникация и вычисление. Порты, интерфейсы и протоколы - это три ключевых понятия, которые определяют, как аппаратный ускоритель взаимодействует с памятью и функциями программного обеспечения. Это два простых правила для присвоения интерфейса аргументу функции:

Если аргумент функции является массивом, используйте главный интерфейс

Если аргумент функции обращается к одной переменной, используйте подчиненный интерфейс

Примечание. Полный исходный код 2D-свертки можно найти здесь.