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

AXI-интеграция CSS-ускорителя

English version

Учебный CSS-детектор получил общую для PS/PL границу с единым тактовым доменом:

AXI4-Stream, 32-битные Q:I-отсчёты
  -> css_sf7_axis_detector
  -> css_sf7_sequential_detector
  -> один 256-битный пакет решения AXI4-Stream
                         |
                         +-> статус/снимок результата AXI4-Lite + IRQ

Интеграционный top-level — css_sf7_axi_accelerator.v. Все AXI-интерфейсы работают от aclk и синхронного активного-низкого aresetn; переход между тактовыми доменами должен выполняться вне этого модуля.

Отчёт о реализации AXI top-level в Vivado содержит полностью маршрутизированные OOC-результаты на 100 МГц.

Потоковый контракт

Вход передаётся при s_axis_tvalid && s_axis_tready. s_axis_tdata[15:0] содержит знаковый I в Q1.15, [31:16] — знаковый Q в Q1.15. Один символ состоит ровно из 128 принятых beat. s_axis_tlast должен подниматься только на beat 127. Несовпадение устанавливает бит ошибки кадра в результате, но не меняет фиксированную группировку по 128 beat и не выполняет повторную синхронизацию потока.

Ускоритель выдаёт один beat результата на символ и удерживает m_axis_tvalid, m_axis_tdata и m_axis_tlast, пока результат не принят через m_axis_tready. Новый символ не принимается, пока предыдущий результат не забран.

Биты результата Значение
[6:0] бин максимума
[7] резерв, ноль
[14:8] бин второго максимума
[15] ошибка входного TLAST/кадра
[31:16] количество насыщений dechirp
[95:32] квадрат магнитуды максимума
[159:96] квадрат магнитуды второго максимума
[255:160] резерв, ноль

Однословный пакет результата всегда поднимает m_axis_tlast.

Карта регистров AXI-Lite

Все регистры 32-битные. Неопределённые адреса читаются как ноль, запись по ним не имеет эффекта.

Смещение Имя Доступ Значение
0x00 ID RO 0x43535337 (CSS7)
0x04 VERSION RO 0x00010000
0x08 CONTROL RW/W1P бит 0 разрешает IRQ; биты 8/9 очищают sticky-флаги done/ошибки кадра; бит 10 очищает счётчики
0x0C STATUS RO биты 0–4: busy, готовность входа, ожидающий результат, sticky done, sticky ошибка кадра
0x100x2C RESULT0RESULT7 RO последний 256-битный результат, начиная с младшего слова
0x30 COMPLETED_COUNT RO количество завершённых результатов
0x34 FRAME_ERROR_COUNT RO результаты с ошибкой TLAST

irq активен, когда одновременно разрешён IRQ и установлен sticky done. Новый результат имеет приоритет над одновременной программной очисткой, поэтому событие не теряется.

Проверка

Icarus запускается внутри WSL:

python3 tools/run_block8_css_rtl.py --test tb_css_sf7_axis_detector
python3 tools/run_block8_css_rtl.py --test tb_css_sf7_axi_accelerator

Потоковый тест проверяет backpressure результата, стабильное удержание payload, упаковку и обнаружение неправильного TLAST. Интеграционный тест проверяет ID/version, status, полный снимок результата, счётчики, sticky-флаги, IRQ, W1P-очистку и неопределённый адрес регистра.

Утилита первичного запуска со стороны PS

tools/css_axi_bringup.py даёт небольшой программный интерфейс к окну регистров AXI-Lite. Она умеет работать с реальным отображением /dev/mem в Linux на Zynq и с JSON-backed mock для разработки и CI без платы.

На плате необходимо использовать физический базовый адрес, который реально назначен ускорителю в Vivado Address Editor; адрес из примера нельзя считать готовым адресом проекта. Первые проверки выглядят так:

sudo python3 tools/css_axi_bringup.py --base 0x<assigned-base> probe
sudo python3 tools/css_axi_bringup.py --base 0x<assigned-base> status
sudo python3 tools/css_axi_bringup.py --base 0x<assigned-base> result
sudo python3 tools/css_axi_bringup.py --base 0x<assigned-base> irq on
sudo python3 tools/css_axi_bringup.py --base 0x<assigned-base> clear all

probe отклоняет неожиданное значение ID ядра. result декодирует основной и второй бин, количество насыщений, ошибку кадра и оба 64-битных квадрата магнитуды. Поскольку 256-битный снимок читается через восемь 32-битных регистров, утилита читает COMPLETED_COUNT до и после RESULT0...RESULT7 и повторяет операцию, если счётчик изменился. Это не позволяет принять «рваный» программный снимок, если новый RTL-результат появился прямо во время чтения.

Для offline smoke test можно создать, например, файл:

{
  "0x00": "0x43535337",
  "0x04": "0x00010000",
  "0x0c": "0x00000002",
  "0x30": 0
}

и выполнить:

python3 tools/css_axi_bringup.py --mock-json css-registers.json probe
python3 tools/css_axi_bringup.py --mock-json css-registers.json status

Утилита охватывает только первичный запуск AXI-Lite control/status/result. Она не настраивает PS7, AXI DMA, тактирование/сброс и входной или выходной AXI4-Stream тракт.

Оставшаяся работа с платой

Обвязка проверена на уровне RTL и закрывает OOC routed timing на 100 МГц, но ещё не включена в block design с PS7. Следующий шаг — подключить входной и выходной потоки через DMA или подходящую потоковую инфраструктуру, отобразить AXI-Lite в адресное пространство PS, повторить implementation timing полного проекта и выполнить аппаратный smoke test. Для 256-битного потока результата более узкому DMA/interconnect может понадобиться AXI data-width converter.