Перейти к содержанию

Проект 12.3 — Итоговый проект: DSP-блок для FPGA

Цель

Реализовать или расширить один DSP-блок для FPGA, проверить его самопроверяющимся testbench и сравнить с эталонной моделью.

Зачем это нужно

Фильтр, который симулируется, может написать каждый. Инженерное содержание блока FPGA в решениях, которые симуляция скрывает: сколько бит нужно каждому проводу, где происходят округление и насыщение, на сколько тактов запаздывает результат, что будет, если следующий блок не готов, и укладывается ли проект в тайминг после трассировки. Этот проект просит принять эти решения явно, защитить их числами и доказать, что RTL делает ровно то, что говорит модель.

Варианты блоков

Блок Рекомендуемые доказательства
FIR-фильтр таблица коэффициентов, fixed-point ошибка, PASS RTL
Микшер NCO настройки аккумулятора фазы, спектр, PASS RTL
Обёртка AXI-Stream тест backpressure, задержка, доказательства handshake
Дециматор АЧХ защиты от наложения, проверка выходной частоты

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

Минимальные результаты

  • эталонная модель;
  • спецификация fixed-point;
  • RTL-модуль или расширение RTL;
  • самопроверяющийся testbench;
  • waveform или лог PASS;
  • анализ ошибок;
  • итоговый отчёт.

Критерии успеха

Критерий Цель
Статус testbench PASS
Максимальная ошибка определяет студент
Задержка задокументирована обязательно
Fixed-point формат задокументирован обязательно

Зафиксируйте допуск на ошибку в предложении до симуляции. «Побитово совпадает с fixed-point моделью»: более сильная и полезная цель, чем «близко к float-модели»; укажите, какую из них вы заявляете и почему.

Заморозьте предложение

Поле Необходимое содержание
блок и назначение что он делает и где стоит в цепочке
эталонная модель Python/MATLAB, float и fixed-point, с точными правилами арифметики
числовые форматы вход, коэффициент, произведение, аккумулятор, выход; правило округления и насыщения
интерфейс порты, семантика valid/ready или AXI-Stream, поведение при сбросе
задержка и пропускная способность такты задержки, отсчётов за такт
порог приёмки числовой допуск и тестовые векторы, которые должны пройти
правило остановки когда блок закончен

Ворота верификации

  1. G0 это контракт: предложение, числовые форматы и интерфейс записаны и закоммичены.
  2. G1 это эталон: fixed-point модель совпадает с float-моделью в пределах заявленного допуска на импульсе, константе, тоне и случайных входах.
  3. G2 это векторы: детерминированные файлы входных и ожидаемых выходных векторов генерируются из модели, а не пишутся вручную.
  4. G3 это RTL: самопроверяющийся testbench сравнивает каждый выходной отсчёт с ожидаемым вектором и заканчивается однозначной строкой PASS; намеренно испорченный прогон падает.
  5. G4 это угловые случаи: у насыщения, сброса в середине потока и (для потоковых блоков) backpressure нижестоящего блока есть по направленному тесту.
  6. G5 это доказательства реализации: приведены ресурсы, задержка и, если инструмент доступен, разведённый тайминг; если Vivado вам недоступен, скажите об этом вместо оценки «на глаз».
  7. G6 это воспроизведение: чистый checkout выполняет описанные команды и получает тот же результат.

Ловушки проектирования, которые нужно проверить явно

Ловушка Симптом Тест, который её ловит
слишком узкий аккумулятор переполнение по кругу на входе полной шкалы синусоида полной шкалы и ступенчатые входы
расхождение в округлении модель и RTL различаются на 1 LSB на некоторых отсчётах случайные векторы с побитовым сравнением
задержка на единицу неверна выходы сдвинуты на один отсчёт импульсный вход; сравнить с ожидаемым положением
выход не удерживается при backpressure потерянные или продублированные отсчёты testbench, снимающий ready в неудобные моменты
сброс игнорируется в середине потока устаревшие данные после сброса сброс в середине пакета
testbench, который не может упасть всегда печатает PASS подставить неверное ожидаемое значение и убедиться, что получается FAIL

Пакет доказательств

project_12_3/
├── proposal.md
├── model.py               # float + fixed-point эталон
├── generate_vectors.py    # детерминированно пишет входные/ожидаемые векторы
├── rtl/
├── tb/
├── vectors/
├── reports/               # нормализованные сводки по ресурсам / таймингу
├── metrics.json
└── report.md

Отправная точка, безопасная для CI

В курсе уже есть каноническая HDL-проверка. Из корня репозитория:

python tools/run_block5_hdl_smoke.py --no-generate

Прежде чем проектировать свой блок, прочитайте один готовый от начала до конца: 4-коэффициентный FIR (Lab 5.2), обёртку AXI-Stream (Lab 5.4), 65-коэффициентный RRC FIR (Lab 5.6) и сравнение float/fixed/RTL (Lab 5.5). Не делайте пересборку Vivado единственным путём воспроизведения: коммитьте нормализованные отчёты по ресурсам и таймингу, чтобы рецензент без лицензионного инструмента мог прочитать ваш результат.

Итоговый чек-лист приёмки

  • Предложение, числовые форматы и допуск предшествуют финальной симуляции.
  • RTL сравнивается с моделью на закоммиченных сгенерированных векторах.
  • Testbench падает на намеренно неверном ожидании.
  • У насыщения, сброса и (для потоковых блоков) backpressure есть по направленному тесту.
  • Задержка и fixed-point форматы задокументированы.
  • Приведены ресурсы и тайминг, либо указано их отсутствие.
  • Команда на чистом checkout воспроизводит PASS.
  • Вывод говорит, готов ли блок к интеграции или нет, и почему.

Оцените работу по рубрике оценки итоговых проектов.

Шаблон вывода отчёта

DSP-блок FPGA реализует ______. Статус RTL testbench — ____, максимальная ошибка — ____.
Блок готов / не готов к интеграции, потому что ______.