Создание видео чипов - дома ?
Полноценный «GPU с нуля» — это проект уровня корпорации, но реально сделать специализированный ML‑акселератор («видео‑чип» под ИИ‑инференс) и пройти путь FPGA → маленький ASIC (130 нм) → более сложный ASIC. Ниже — пошаговая дорожная карта с конкретными инструментами и контрольными точками.
Куда целимся (за 5 минут до старта)
-
Сценарий: начните с инференса (а не обучения) — свёрточные сети/трансформер‑блоки, INT8/INT4.
-
Метрики: целевая производительность (TOPS/ватт), латентность, ограничение по мощности/площади, объём on‑chip SRAM.
-
Стек: PyTorch → ONNX → компилятор/планировщик (TVM/собственный) → RTL/FPGA → ASIC.
Этап A — Быстрый прототип на FPGA (получить работающий ускоритель)
Цель: зафиксировать конвейер, формат чисел, обмен с хостом и доказать выигрыш над CPU.
Шаги:
-
Выбор базы (любой из вариантов):
- Готовый «DPU» на FPGA: AMD Vitis AI (семейство DPU IP под Zynq/Alveo). Позволяет быстро поднять рабочий ускоритель и померить бенчмарки. AMD Documentation+1
- Открытый стек TVM+VTA: VTA — настраиваемый тензорный ускоритель с полным компиляторным стеком TVM (хорош для обучения связки «компилятор ↔ железо»). tvm.apache.org+1
- Открытая архитектура NVDLA: эталонный открытый акселератор от NVIDIA для инференса (для симуляции/исследования и/или больших FPGA). nvdla.org+1
- RISC‑V + Gemmini: систолический массив (INT8/INT16) в экосистеме Chipyard — удобно как учебно‑исследовательская платформа «CPU+акселератор». chipyard.readthedocs.io+1
-
Подготовка модели: экспорт в ONNX, пост‑тренд. квантизация или QAT до INT8/INT4. Для VTA/DPU есть готовые пути компиляции. tvm.apache.org+1
-
Поднять ускоритель и пайплайн: собрать битстрим/прошивку, прогнать демо‑модель (ResNet/MobileNet/на ваш датасет), снять метрики (FPS/латентность/загрузка шины). xilinx.github.io
-
Верификация и профилинг: использовать Verilator для быстрой симуляции RTL‑ядра и cocotb для написания тестов на Python (удобно строить референс на NumPy). GitHub+2verilator.org+2
Контрольные точки (go/no‑go):
-
Ускоритель стабильно выполняет 1–2 эталонные сети.
-
Есть измеренные профили пропускной способности памяти и «узкие места» (обычно — SRAM/DDR и DMA).
Этап B — Свой микроархитектурный блок (систолический массив + SRAM + DMA)
Цель: перейти от «коробочного» IP к собственному ядру, которое вы сможете перенести в ASIC.
Шаги:
-
Определите архитектуру вычислений:
- Систолический массив N×NN×NN×N INT8 с накоплением в INT32 (или BF16/FP8 для трансформеров).
- Выбор dataflow: output‑stationary или weight‑stationary (в Gemmini поддерживаются оба) — это определяет размеры/банковку SRAM и граф планирования. Buddy Compiler
-
Память и движение данных:
- Спроектируйте scratchpad‑SRAM (двойная буферизация, банковка), минимизируйте обращения во внешнюю память.
- Планируйте тильность (MxK, KxN), чтобы данные повторно использовались в массиве.
-
Интерфейсы:
- AXI4‑Stream/AXI4‑Lite к контроллеру/хосту; DMA для переливов host↔SRAM.
-
Компиляторная связка:
- Минимум — собственный планировщик (tile‑план, порядок слоёв, квант. параметры).
- Опционально — TVM (tensorize под ваш ISA/микро‑API) или интеграция в Chipyard (RoCC/TileLink) как в Gemmini. chipyard.readthedocs.io+1
-
Верификация:
- cocotb для тестов (рандомизация/покрытие), Verilator для быстрой симуляции на С++. docs.cocotb.org+1
Этап C — Маленький ASIC на SKY130 (реальный «чип в руках»)
Цель: зафиксировать физический дизайн, тактирование, тайминги и IO на открытом техпроцессе SkyWater SKY130 с открытым PDK.
Что используем:
-
SkyWater SKY130 open PDK (бесплатно, открыто). GitHub+1
-
OpenROAD/OpenLane — полностью открытый RTL→GDSII поток. openroad.readthedocs.io+1
-
Caravel — готовый SoC‑«каркас» с RISC‑V управлением и выделенной user project area (около 2.92 мм × 3.52 мм, 38 GPIO), идеально для MPW от Efabless. caravel-harness.readthedocs.io+1
-
TinyTapeout — сверхдешёвый вход в мир ASIC (маленькие цифровые «плитки») на SKY130. tinytapeout.com+1
Шаги:
-
Подготовьте RTL‑ядро (урезанная версия вашего массива и SRAM‑контроллера) и обвяжите его в Caravel‑интерфейс (Wishbone/GPIO/лог. анализатор). GitHub
-
SRAM‑макросы: сгенерируйте OpenRAM‑память под SKY130 (например, 1–64 КБ блоки), получите LEF/LIB/GDS. OpenRAM
-
Запустите OpenLane/OpenROAD: синтез (Yosys) → размещение/трассировка → STA/DRC/LVS → GDSII. yosyshq.readthedocs.io+1
-
MPW‑шаттл: подайте проект через Efabless (Google‑спонсируемые Open‑MPW шансы периодически объявляются). Skywater Technology+1
-
Приёмка и bring‑up: изготовление → корпус → плата → прошивка менеджмент‑ядра Caravel → тесты по GPIO/Wishbone/JTAG. caravel-harness.readthedocs.io
Примечание: SKY130 — «толстый» техпроцесс. Это учебный/прототипный чип: подтвердить архитектуру, верификацию, интерфейсы и toolflow. Производительность/энергоэффективность тут вторична. Skywater Technology
Этап D — На вырост: более сложный ASIC
Когда стек обкатан:
-
Переезд на более тонкий узел (например, открытый SKY90‑FD‑SOI, где тоже есть open‑PDK/MPW), а дальше — коммерческие узлы через договоры с фабриками. Google Open Source Blog
-
Увеличение массива, грамотная иерархия SRAM (много банков, prefetch), поддержка attention/SDP, компрессия весов и sparsity.
Что выбрать как стартовую «дорожку» (3 реальные траектории)
-
Самый быстрый результат → Vitis AI DPU на FPGA → понять узкие места → затем писать своё ядро. AMD Documentation+1
-
Открытый сквозной стек → TVM+VTA (или Gemmini) → учитесь интеграции компилятора и «железа». tvm.apache.org+1
-
Готовая «референсная» архитектура → изучить NVDLA (модульная структура, поддерживаемые слои, софт/документация), взять идеи для своего RTL. nvdla.org
Минимальная спецификация первого собственного ядра (реалистично для SKY130)
-
Вычисления: систолический массив 8×8 INT8, накопление INT32, ReLU/clip.
-
Память: scratchpad ≥ 32–64 КБ (несколько банков OpenRAM), DMA «хост↔SRAM». OpenRAM
-
Интерфейсы: AXI‑Lite (управление), AXI‑Stream (данные) к шине Caravel/Wishbone мостом. caravel-harness.readthedocs.io
-
Компилятор: простая утилита, которая режет матрицы на тайлы, выбирает dataflow и генерирует последовательность команд для ядра; опционально — бэкенд на TVM с кастомными intrinsics. tvm.apache.org
Инструменты, которые «встанут в один клик»
-
Компилятор/мидлэнд: Apache TVM/VTA (энд‑ту‑энд стек). tvm.apache.org
-
Быстрый синтез/поток ASIC: OpenLane/OpenROAD + Yosys (RTL→GDSII). openroad.readthedocs.io+1
-
Верификация RTL: Verilator (симуляция) + cocotb (тестбенчи на Python). verilator.org+1
-
Память: OpenRAM (генерация SRAM‑макросов под SKY130). OpenRAM
-
Шасси для MPW: Caravel и шаблон caravel_user_project. GitHub+1
-
«Дешёвый» tape‑out: TinyTapeout на SKY130. tinytapeout.com
Что может пойти не так (и как подстраховаться)
-
Бутылочное горлышко — память и движение данных. Планируйте банковку SRAM, двойную буферизацию и расписание DMA прежде, чем увеличивать массив. (Gemmini/VTA — хорошие образцы dataflow.) Buddy Compiler+1
-
Несовпадение компилятора и ISA ядра. Сначала «приколоть» минимальную последовательность команд, покрывающую GEMM/CONV, и только потом добавлять слои/фичи. tvm.apache.org
-
Физический дизайн: тайминги/DRC/LVS. Держите частоту умеренной на SKY130, используйте OpenLane «рецепты» и Caravel‑best‑practices. woset-workshop+1
Если хотите «резко ускориться»
-
Возьмите готовую архитектуру и адаптируйте: NVDLA (ASIC‑ориентированная) или Gemmini (RISC‑V‑экосистема) — это десятки человеко‑месяцев экономии. nvdla.org+1
-
Для «улётной» скорости прототипа — Vitis AI DPU на подходящей плате (мгновенно даст бенчмарки и референс по пропускной способности памяти).
обещанный минимальный план работ, чек‑лист окружения (с Docker) и готовый скелет RTL‑ядра с тестбенчем. Я уже собрал вам структуру проекта и упаковал её в архив.
1) Минимальный план работ под ваш кейс (ML‑инференс)
Цель: прототип акселератора матричного умножения INT8→INT32 (база для CONV/GEMM в CNN/Transformer) с простым MMIO и верификацией на эталоне NumPy.
Шаги (по спринтам):
Спринт 1 — Рабочий «скелет» (вы уже получили):
-
Топ‑модуль
accel_top.svс:- регистрами
CTRL/CFG/STATUS/CYCLES, - буферами A/B (INT8), буфером C (INT32),
- FSM: тройной цикл i, j, k (по 1 MAC/такт).
- регистрами
-
Тестбенч
cocotb:- генерит случайные
A(8×K)иB(K×8), - заливает в буферы через MMIO,
- запускает ядро, ждёт
done, считываетC, - сверяет с
numpy(A @ B), выводит число тактов.
- генерит случайные
Спринт 2 — Ускорение 1 (микроархитектура):
-
Распараллелить по измерению
j(напр. 4–8 параллельных MAC) — 4–8× быстрее. -
Ввести двойную буферизацию C (или построчную запись) — сократить простоев.
-
Пройти линтер
verilator --lint-only, добавить покрытия в cocotb.
Спринт 3 — Ускорение 2 (систолика / dataflow):
-
Перейти на систолический массив NxN: поток
Aпо строкам,Bпо столбцам, output‑stationary. -
Разбить A/B на тайлы:
(M×K) · (K×N) → (M×N), параметризоватьK_t.
Спринт 4 — Память и интерфейсы:
-
Заменить простые массивы на банкованные SRAM (эмуляция + OpenRAM для SKY130).
-
Добавить DMA/AXI‑Stream заглушки (в тесте — «псевдо‑DMA» на cocotb).
Спринт 5 — Интеграция со стеком ML:
-
Утилита «компилятор» (Python): тильность, порядок свёрток/матриц, квантизация.
-
(Опционально) бэкенд для TVM (tensorize) под ваше микро‑ISA.
Спринт 6 — ASIC‑путь (POC):
-
Обвязать под Caravel/AXI‑Lite, собрать через OpenLane/OpenROAD (SKY130).
-
Мини‑план: тайминг на консервативной частоте, DRC/LVS «в ноль».
2) Чек‑лист окружения
Вариант A — на хосте (быстрее всего, только симуляция):
-
Установить:
verilator(≥4.2),python3,pip,make, пакетыcocotb,numpy,pytest. -
Команда:
sudo apt-get update && sudo apt-get install -y verilator make python3 python3-pip python3 -m pip install --upgrade pip python3 -m pip install cocotb numpy pytest cd sim && make
Вариант B — через Docker (внутри сразу есть OpenLane/OpenROAD):
-
Перейти в каталог
dockerпроекта. -
Собрать образ:
docker build -t ml-accel-openlane:latest . -
Запустить контейнер:
./docker/run.sh -
Внутри контейнера:
cd /workspace/sim make
Docker‑образ базируется на официальном OpenLane и добавляет
verilator,cocotb,numpy,pytest.
3) Что внутри архива (основные файлы)
-
rtl/accel_top.sv— топ ускорителя:- регистры:
0x0000 CTRL—start;0x0004 CFG—K(N фиксирован 8);0x0008 STATUS—busy/done;0x000C CYCLES— такты последнего запуска;
- буферы:
A_BASE=0x1000:A[i*MAX_K + k](байты),B_BASE=0x2000:B[k*N + j](байты),C_BASE=0x3000:C[(i*N + j)](слова 32‑бит).
- FSM:
IDLE → CLEAR → COMPUTE → DONE.
- регистры:
-
rtl/mac.sv— простой MACint8×int8→int32. -
rtl/scratchpad_dp_ram.sv— пример двухпортовой RAM (для дальнейших доработок). -
sim/test_matmul.py— cocotb‑тест:- готовит
A,B, пишет в буферы через MMIO‑порты, - запускает, ждёт
done, - читает
Cи сравнивает с NumPy.
- готовит
-
sim/Makefile— сборка Verilator+cocotb (makeзапускает тест). -
docker/Dockerfile— образ с OpenLane/OpenROAD + Verilator,cocotb,numpy. -
docker/run.sh— запуск контейнера с монтированием./..в/workspace. -
README.md— быстрый старт и карта адресов.
4) Как запустить тест прямо сейчас
-
Скачайте архив и распакуйте:
unzip ml-accel-skeleton.zip cd ml-accel-skeleton -
Без Docker (если установлен Verilator):
python3 -m pip install -U pip cocotb numpy pytest cd sim && makeВ логе должны появиться:
Cycles used: ...иPASS: C == A @ B. -
Через Docker (если хотите сразу иметь OpenLane/OpenROAD внутри):
cd docker docker build -t ml-accel-openlane:latest . ./run.sh # внутри контейнера: cd /workspace/sim && make
5) Что улучшать дальше (предлагаю ближайшие задачи)
-
Параллель по j: сделать 4/8 MAC‑каналов, чтобы за такт считать 4/8 частичных сумм.
-
Систолический массив: добавить регистровую «решётку» и потоковую подачу A/B.
-
OpenRAM: заменить массивы A/B на банкованные SRAM (эмуляция в симе, генерик под SKY130 для ASIC).
-
AXI‑Lite: заменить упрощённое MMIO на полноценный AXI‑Lite (готовые «slave» шаблоны).
-
TVM backend: простой планировщик тайлинга + генерация команд для вашего ядра.
Если хотите, могу добавить параллельный вариант (например, 4× ускорение) и «систолическую» версию с тем же MMIO‑протоколом — скажите, какой приоритет: скорость симуляции, простота кода или готовность к переносу в ASIC/Caravel.