Создание видео чипов - дома ?

Admin Admin 4 Октября 2025

Полноценный «GPU с нуля» — это проект уровня корпорации, но реально сделать специализированный ML‑акселератор («видео‑чип» под ИИ‑инференс) и пройти путь FPGA → маленький ASIC (130 нм) → более сложный ASIC. Ниже — пошаговая дорожная карта с конкретными инструментами и контрольными точками.


Куда целимся (за 5 минут до старта)

  1. Сценарий: начните с инференса (а не обучения) — свёрточные сети/трансформер‑блоки, INT8/INT4.

  2. Метрики: целевая производительность (TOPS/ватт), латентность, ограничение по мощности/площади, объём on‑chip SRAM.

  3. Стек: PyTorch → ONNX → компилятор/планировщик (TVM/собственный) → RTL/FPGA → ASIC.


Этап A — Быстрый прототип на FPGA (получить работающий ускоритель)

Цель: зафиксировать конвейер, формат чисел, обмен с хостом и доказать выигрыш над CPU.

Шаги:

  1. Выбор базы (любой из вариантов):

    • Готовый «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
  2. Подготовка модели: экспорт в ONNX, пост‑тренд. квантизация или QAT до INT8/INT4. Для VTA/DPU есть готовые пути компиляции. tvm.apache.org+1

  3. Поднять ускоритель и пайплайн: собрать битстрим/прошивку, прогнать демо‑модель (ResNet/MobileNet/на ваш датасет), снять метрики (FPS/латентность/загрузка шины). xilinx.github.io

  4. Верификация и профилинг: использовать Verilator для быстрой симуляции RTL‑ядра и cocotb для написания тестов на Python (удобно строить референс на NumPy). GitHub+2verilator.org+2

Контрольные точки (go/no‑go):

  • Ускоритель стабильно выполняет 1–2 эталонные сети.

  • Есть измеренные профили пропускной способности памяти и «узкие места» (обычно — SRAM/DDR и DMA).


Этап B — Свой микроархитектурный блок (систолический массив + SRAM + DMA)

Цель: перейти от «коробочного» IP к собственному ядру, которое вы сможете перенести в ASIC.

Шаги:

  1. Определите архитектуру вычислений:

    • Систолический массив N×NN×NN×N INT8 с накоплением в INT32 (или BF16/FP8 для трансформеров).
    • Выбор dataflow: output‑stationary или weight‑stationary (в Gemmini поддерживаются оба) — это определяет размеры/банковку SRAM и граф планирования. Buddy Compiler
  2. Память и движение данных:

    • Спроектируйте scratchpad‑SRAM (двойная буферизация, банковка), минимизируйте обращения во внешнюю память.
    • Планируйте тильность (MxK, KxN), чтобы данные повторно использовались в массиве.
  3. Интерфейсы:

    • AXI4‑Stream/AXI4‑Lite к контроллеру/хосту; DMA для переливов host↔SRAM.
  4. Компиляторная связка:

    • Минимум — собственный планировщик (tile‑план, порядок слоёв, квант. параметры).
    • Опционально — TVM (tensorize под ваш ISA/микро‑API) или интеграция в Chipyard (RoCC/TileLink) как в Gemmini. chipyard.readthedocs.io+1
  5. Верификация:

    • 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

Шаги:

  1. Подготовьте RTL‑ядро (урезанная версия вашего массива и SRAM‑контроллера) и обвяжите его в Caravel‑интерфейс (Wishbone/GPIO/лог. анализатор). GitHub

  2. SRAM‑макросы: сгенерируйте OpenRAM‑память под SKY130 (например, 1–64 КБ блоки), получите LEF/LIB/GDS. OpenRAM

  3. Запустите OpenLane/OpenROAD: синтез (Yosys) → размещение/трассировка → STA/DRC/LVS → GDSII. yosyshq.readthedocs.io+1

  4. MPW‑шаттл: подайте проект через Efabless (Google‑спонсируемые Open‑MPW шансы периодически объявляются). Skywater Technology+1

  5. Приёмка и 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 реальные траектории)

  1. Самый быстрый результат → Vitis AI DPU на FPGA → понять узкие места → затем писать своё ядро. AMD Documentation+1

  2. Открытый сквозной стек → TVM+VTA (или Gemmini) → учитесь интеграции компилятора и «железа». tvm.apache.org+1

  3. Готовая «референсная» архитектура → изучить 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):

  1. Перейти в каталог docker проекта.

  2. Собрать образ:

     docker build -t ml-accel-openlane:latest .
  3. Запустить контейнер:

     ./docker/run.sh
  4. Внутри контейнера:

     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 — простой MAC int8×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) Как запустить тест прямо сейчас

  1. Скачайте архив и распакуйте:

     unzip ml-accel-skeleton.zip
     cd ml-accel-skeleton
  2. Без Docker (если установлен Verilator):

     python3 -m pip install -U pip cocotb numpy pytest
     cd sim && make

    В логе должны появиться: Cycles used: ... и PASS: C == A @ B.

  3. Через 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.

Вы
Для ответа вы можете авторизоваться