HLS. Часть 0.
HLS часть 1 . AXIS.
HLS часть 2. BRAM.
HLS (High Level Synthesis) – применяется для создания цифровых устройств с применением языков высокого уровня. Основной целью продуктов HLS является упрощение процесса проектирования FPGA для разработчика, знакомого с программированием на языках высокого уровня, таких как C++, Rust и др. Практическое применение FPGA часто вызывает трудности для дотнетчиков, джавистов и др., которые сталкиваются с целым рядом не типичных задач: появляется необходимость понимать, как и каким образом происходит формировании тактовых сигналов, учитывать латентность, а также вообще понимать, что операторы языков описания аппаратуры не вполне эквивалентны операторам языков программирования высокого уровня. Например, математические операторы, естественный для программиста, в распространенных языках описания аппаратуры (HDL) требует иного подхода использования, речь про языки VHDL/Verilog/SystemVerilog. Разные схемотехнические решения будут получены для случая, когда сложные вычисления или сложные выражения выполняется в виде оператора непрерывного присваивания и внутри синхронного процесса. В то же время, цифровая схемотехника по мере уменьшения норм технологического процесса все больше использует синхронные схемы при проектировании. В результате как оказалось, собственно что большое количество усилий при проектировании на базе FPGA тратится на разработку управляющего автомата, активирующего прибора в нужные моменты времени.
HLS очень много в современном мире и каждый год появляются новые HLS, многие инженеры которые занимаются Xilinx FPGA знакомы с Vivado HLS, но речь сегодня будет не про Vivado HLS. Я хотел бы рассказать какие HLS есть вообще, и из чего родился HLS.
Начнем с того, а сколько вообще HLS в мире:
Статус |
Название компилятора |
Создатель или владелец |
Язык написания |
Язык генерируемого кода |
---|---|---|---|---|
Используется |
AUGH | TIMA Lab. | C subset | VHDL |
eXCite | Y Explorations | C | VHDL/Verilog | |
Bambu | PoliMi | C | VHDL/Verilog | |
Bluespec | BlueSpec Inc. | BSV | SystemVerilog | |
CHC | Altium | C subset | VHDL/Verilog | |
CoDeveloper | Impulse Accelerated | Impulse-C | VHDL | |
Stratus | Cadence | C/C++ SystemC | RTL | |
CyberWorkbench | NEC | BDL, SystemC | VHDL/Verilog | |
Catapult | Mentor (Siemens business) |
C, C++, SystemC | VHDL/Verilog | |
DWARV | TU. Delft | C subset | VHDL | |
GAUT | U. Bretagne | C/C++ | VHDL | |
Hastlayer | Lombiq Technologies | C#/C++/F#… (.NET) |
VHDL | |
Instant SoC | FPGA Cores | C/C++ | VHDL/Verilog | |
Intel High Level Synthesis Compiler | Intel FPGA (Formerly Altera) | C/C++ | Verilog | |
LegUp HLS | LegUp Computing | C | Verilog | |
LegUp | U. Toronto | C | Verilog | |
MaxCompiler | Maxeler | MaxJ | RTL | |
ROCCC | Jacquard Comp. | C subset | VHDL | |
Synphony C | Synopsys | C/C++ | VHDL/Verilog/ SystemC |
|
VivadoHLS (formerly AutoPilot from AutoESL) |
Xilinx | C/C++/SystemC | VHDL/Verilog/ SystemC |
|
Kiwi | U. Cambridge | C# | Verilog | |
CHiMPS | U. Washington | C | VHDL | |
gcc2verilog | U. Korea | C | Verilog | |
HercuLeS | Ajax Compilers | C/NAC | VHDL | |
Shang | ? | C | Verilog | |
Статус не ясен | Los Alamos NL | Academic | VHDL | 2007 |
Заброшенные |
AccelDSP | Xilinx | MATLAB | VHDL/Verilog |
C2H | Altera | C | VHDL/Verilog | |
CtoVerilog | U. Haifa | C | Verilog | |
DEFACTO | U. South Cailf. | C | RTL | |
Garp | U. Berkeley | C subset | bitstream | |
MATCH | U. Northwest | MATLAB | VHDL | |
Napa-C | Sarnoff Corp. | C subset | VHDL/Verilog | |
PipeRench | U.Carnegie M. | DIL | bistream | |
SA-C | U. Colorado | SA-C | VHDL | |
SeaCucumber | U. Brigham Y. | Java | EDIF | |
SPARK | U. Cal. Irvine | C | VHDL |
- MATLAB HDL Coder – Mathworks
- HLS-QSP – CircuitSutra Technologies
- C-to-Silicon – Cadence Design Systems
- Concurrent Acceleration – Concurrent EDA
- Synphony C Compiler – Synopsys
- QuickPlay – PLDA
- PowerOpt – ChipVision
- Cynthesizer – Forte Design Systems, приобретенный Cadence Design Systems
- Catapult C – Calypto Design Systems, часть Mentor Graphics
- CyberWorkBench – NEС
- Mega Hardware
- C2R – CebaTech
- CoDeveloper – Impulse Accelerated Technologies
- HercuLeS – Nikolaos Kavvadias
- PICO – Synfora, приобретенный Synopsys
- xPilot – University of California, Los Angeles
- Vsyn – vsyn.ru
- ngDesign – SynFlow
Ранняя академическая работа по HLS выделяла этап планирования, распределения и привязки в качестве основных шагов для синтеза высокого уровня. Планирование разбивает алгоритм на этапы управления, которые используются для определения состояний в конечном автомате. Каждый шаг управления содержит один небольшой раздел алгоритма, который может быть выполнен за один такт в железе. Распределение и привязка отображают инструкции и переменные для аппаратных компонентов, мультиплексоров, регистров, линий и шин передачи данных.
Поведенческий синтез первого поколения HLS был представлен Synopsys в 1994 году в качестве поведенческого компилятора и использовал Verilog или VHDL в качестве входных языков. Используемый уровень абстракции был частично синхронизирован с аппаратными процессами. Инструменты основывались на особенностях Verilog или VHDL, инструменты не были широко приняты отчасти потому, что ни языки, ни частично синхронизированная абстракция не были хорошо приспособлены для моделирования поведения на высоком уровне. 10 лет спустя, в начале 2004 года, Synopsys объявил о конце жизненного цикла компилятора.
В 2004 году появился ряд коммерческих продуктов синтеза высокого уровня следующего поколения (также называемых поведенческим синтезом или алгоритмическим синтезом в то время), которые обеспечивали синтез схем, определенных на языке C, в спецификации уровня передачи регистров (RTL). Синтез из популярного языка С для железа предложил накопленную абстракцию, выразительную силу и гибкость кодирования, связываясь с существующими потоками и действующими моделями. Этот языковой сдвиг в сочетании с другими техническими достижениями стал ключевым фактором успешного промышленного использования. Инструменты синтеза высокого уровня используются для интегрированного проектирования для ASIC и FPGA.
Синтез высокого уровня был в основном принят в Японии и Европе в первые годы становления HLS. По состоянию на конец 2008 года в США наметился процесс использования HLS.
Наиболее распространенные исходные языки для синтеза высокого уровня основаны на стандартных языках, таких как ANSI C/C++, SystemC и MATLAB.
Высокоуровневый синтез обычно также включает в себя битовую исполняемую спецификацию для точности в качестве входных данных, поскольку для получения эффективной аппаратной реализации требуется дополнительная информация о том, что является приемлемой среднеквадратичной ошибкой или частотой битовых ошибок и т. д. например, если инженер начинает с КИХ-фильтра, написанного с использованием плавающего типа “double”, прежде чем он или она сможет получить эффективную аппаратную реализацию, ему нужно выполнить численное уточнение, чтобы получить реализацию с фиксированной точкой. Уточнение требует дополнительной информации о допустимом уровне шума квантования, допустимых диапазонах входных сигналов и т.д. Эта точность для битах спецификации делает спецификацию источника синтеза высокого уровня функционально завершенной. Обычно инструменты генерируют из кода высокого уровня конечный автомат и путь к данным, которые реализуют арифметические операции.
Современная реализация HLS делается с помощью LLVM. Так 24 октября 2003 года появился на свет первый выпуск LLVM, разработчики увидели в этом инструменте лучший вариант для себя, как инфраструктуру для создания HLS. LLVM — проект инфраструктуры для создания компиляторов и сопутствующих утилит. Состоит из набора компиляторов из языков высокого уровня (так называемых «фронтендов»), системы оптимизации, интерпретации и компиляции в машинный код. В основе инфраструктуры используется RISC-подобная платформонезависимая система кодирования машинных инструкций (байткод LLVM IR), которая представляет собой высокоуровневый ассемблер, с которым работают различные преобразования. LLVM представляют следующим образом.
На входе у нас фронтенд, привычным нам язык программирования C++, Rust и др. Фронтенд отвечает за перевод программы ввода из текста, написанного человеком. Этот этап осуществляется посредством лексического, синтаксического и семантического анализа. Формат вывода фронтенда является IR-код инфраструктуры LLVM, IR — это полностью полный набор виртуальных команд, который имеет операции, подобные архитектурам RISC; однако он полностью типизирован, использует представление статического одиночного назначения (SSA) и имеет неограниченное количество виртуальных регистров. Он достаточно низок, так что его можно легко связать с аппаратными операциями, но он также включает в себя достаточно высокоуровневый поток управления и информацию о данных, чтобы обеспечить сложный анализ и оптимизацию. Все из этих характеристик IR LLVM прибавляет на очень эффективный, машино-независимый оптимизатор.
Оптимизатор отвечает за перевод IR с выходных данных фронтенда в эквивалентную, но оптимизированную программу в IR. Хотя на этом этапе выполняется основная часть оптимизаций; оптимизация может и должна быть завершена на каждом этапе компиляции. Пользователи могут оптимизировать код при его написании до того, как он достигнет фронтенда, а бэкенд может оптимизировать код специально для целевой архитектуры и оборудования.
В целом, есть две основные цели этапа оптимизации: увеличить скорость выполнения целевой программы и уменьшить размер кода целевой программы. Для достижения этих целей оптимизации обычно выполняются в несколько проходов по IR, где каждый проход имеет конкретную цель меньшей области. Один из простых способов организации IR, чтобы помочь в оптимизации через форму SSA. Эта форма гарантирует, что каждая переменная определяется ровно один раз, что упрощает многие оптимизации, такие как устранение мертвого кода, устранение ребер, построение цикла и многое другое.
Бэкенд отвечает за перевод программы из IR в машинный код (обычно код сборки или машины). По этой причине этот этап также обычно называют генератором кода. Наиболее сложные задачи, которые решаются на этом этапе — это выбор инструкций и распределение регистров.
Конечная цель компилятора – создать целевой код (у HLS это HDL языки) или код сборки, который можно преобразовать в объектный код и выполнить на реальном оборудовании. Чтобы сгенерировать ассемблерный код, компилятору необходимо знать различные аспекты архитектуры целевого компьютера – регистры, набор команд, соглашение о вызовах, конвейер и т. д. На этом этапе также можно выполнить множество оптимизаций.
LLVM имеет свой собственный способ определения целевой машины. Он использует tablegen для указания целевых регистров, инструкций, соглашения о вызовах и так далее. Функция tablegen облегчает то, как мы описываем большой набор свойств архитектуры программным способом.
LLVM имеет структуру конвейера для бэкэнда, где инструкции проходят через такие фазы; из IR LLVM в SelectionDAG, затем в MachineDAG, затем в MachineInstr и, наконец, в MCInst.
IR преобразуется в SelectionDAG (DAG обозначает направленный ациклический график). Затем происходит легализация (оформление) SelectionDAG, где на разрешенных операциях, разрешенных целевой машиной, отображаются недопустимые инструкции. После этого этапа SelectionDAG преобразуется в MachineDAG, который в основном является выбор инструкций, поддерживаемых бэкэндом.
Процессоры выполняют линейную последовательность инструкций. Целью этапа планирования является линеаризация DAG путем назначения с целью его деятельности. Генератор кода LLVM использует умную эвристику (такую как снижение давления в регистре), чтобы попытаться создать планирование, которое приведет к более быстрому коду. Политики распределения регистров также играют важную роль в создании лучшего кода LLVM.
HLS в LLVM это будет бэкенд. Я хочу предложить посмотреть на проект LegUp, посмотреть как реализуется бэкенд HLS там.
Язык высокого уровня c помощью LegUp преобразуется в HDL код понятный для FPGA.
Bitstream можно загружать на специализированные Amazon сервера. Инстансы F1 предлагают различные среды разработки и подойдут как для разработки низкоуровневого оборудования, так и для разработки программного обеспечения на C/C ++ и OpenCL. После завершения разработки кода для FPGA его можно зарегистрировать как образ Amazon FPGA Image (AFI) и выполнить развертывание на инстансе F1 за несколько щелчков мышью. Образы AFI можно использовать неограниченное количество раз на всех инстансах F1. Плата за программные средства разработки при использовании FPGA Developer AMI не начисляется, при этом программирование FPGA на инстансах F1 можно выполнять неограниченное количество раз без дополнительной платы.
По умолчанию LegUp принимает C/C++ в качестве входных языков программирования. Однако есть возможность ввести промежуточное представление LLVM непосредственно в LegUp. Поток IR LLVM в LegUp синтезирует промежуточный код представления LLVM в аппаратную схему. Вы можете скомпилировать IR LLVM в аппаратную схему, указав файл IR LLVM (файл .ll или .bc), используя переменную INPUT_BITCODE внутри make-файла вашего проекта. Немного обучающего видео по LegUp.
Итого, плюсы HLS:
1. Время выхода на рынок ниже чем при стандартном проектировании FPGA.
2. Более простая возможность модификации кода.
3. Поиск ошибок в коде проще.
4. Быстрое освоение пространства решений для железа.
5. Делает FPGA HW доступным для программистов ПО использующие языки высокого уровня.
6. Скорость разработки конечного решения выше.
7. Отлично подходит для задач математических вычислений, обработки изображений и другой информации и для иных задач.
8. Отладка ПО легче и проще.
Минусы HLS:
1. Так как используется SSA, появляется много избыточно кода.
2. Чаще всего больше ресурсов FPGA используется для утилизации.
3. Не подходит для задач реализации общих интерфейсов.