Проект 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, поведение при сбросе |
| задержка и пропускная способность | такты задержки, отсчётов за такт |
| порог приёмки | числовой допуск и тестовые векторы, которые должны пройти |
| правило остановки | когда блок закончен |
Ворота верификации¶
- G0 это контракт: предложение, числовые форматы и интерфейс записаны и закоммичены.
- G1 это эталон: fixed-point модель совпадает с float-моделью в пределах заявленного допуска на импульсе, константе, тоне и случайных входах.
- G2 это векторы: детерминированные файлы входных и ожидаемых выходных векторов генерируются из модели, а не пишутся вручную.
- G3 это RTL: самопроверяющийся testbench сравнивает каждый выходной отсчёт с ожидаемым вектором и заканчивается однозначной строкой
PASS; намеренно испорченный прогон падает. - G4 это угловые случаи: у насыщения, сброса в середине потока и (для потоковых блоков) backpressure нижестоящего блока есть по направленному тесту.
- G5 это доказательства реализации: приведены ресурсы, задержка и, если инструмент доступен, разведённый тайминг; если Vivado вам недоступен, скажите об этом вместо оценки «на глаз».
- 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 — ____, максимальная ошибка — ____.
Блок готов / не готов к интеграции, потому что ______.