AXI-интеграция CSS-ускорителя¶
Учебный 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 ошибка кадра |
0x10–0x2C |
RESULT0–RESULT7 |
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.