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

Лабораторная 11.5 — Задержка и джиттер конвейера AXI DMA

Цель

Смоделировать пропускную способность, задержку и джиттер на уровне пакетов для упрощённого runtime-конвейера Zynq:

  • входной этап DMA;
  • этап DSP на FPGA;
  • выходной этап DMA;
  • конечная глубина очередей и потери пакетов.

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

DSP-блок, корректный на бумаге, всё равно может отказать в работающей системе, потому что данные не успевают вовремя. Пакеты проходят DMA на входе, этап FPGA и DMA на выходе; каждый этап занимает переменное время, а у каждой передачи есть очередь конечной глубины. Если самый медленный этап не успевает за скоростью прихода, очереди заполняются и пакеты теряются; если успевает, цена: задержка и джиттер. Работа превращает это в числа, чтобы глубина очередей и размер пакета выбирались, а не угадывались.

Инженерный вопрос

Выдерживает ли конвейер целевую скорость пакетов при допустимых задержке и джиттере и какая глубина очередей для этого нужна?

Исполняемый файл

Файл Назначение
blocks/block_11_integrated_sdr_project/python/lab_11_5_axi_dma_latency_jitter.py симуляция задержки/джиттера с конечными буферами

Запуск из корня репозитория:

python blocks/block_11_integrated_sdr_project/python/lab_11_5_axi_dma_latency_jitter.py

Сгенерированные артефакты

docs/assets/lab115_axi_dma_latency_trace.png
docs/assets/lab115_axi_dma_latency_histogram.png
docs/assets/lab115_axi_dma_latency_metrics.json

Ключевые метрики

Метрика Смысл
drop_ratio потерянные пакеты / предложенные пакеты
mean_latency_us средняя сквозная задержка пакета
p95_latency_us, p99_latency_us показатели «хвоста» задержки
latency_jitter_std_us разброс задержки
throughput_msample_per_s эффективная пропускная способность

Чего ожидать

С моделью по умолчанию (800 пакетов по 4096 отсчётов при 2,4 МС/с, то есть один пакет каждые 1706,7 мкс; средние времена этапов 135 / 95 / 145 мкс с джиттером 22 / 14 / 24 мкс; очереди по 10 пакетов) корректный запуск печатает:

Processed/dropped packets: 800/0
Drop ratio: 0.0000
Latency mean/p95/p99 (us): 373.55/430.19/453.33
Latency jitter std (us): 33.81
Throughput (Msample/s): 2.402

Как читать:

  • Средняя задержка 373,6 мкс это по сути сумма трёх средних времён этапов (135 + 95 + 145 = 375): без очередей пакет просто проходит по этапам.
  • p99 равен 453 мкс, на 80 мкс выше среднего. В отчёте приводят «хвост» задержки, потому что дедлайн реального времени определяется худшими пакетами, а не средним.
  • Ноль потерь здесь: не открытие, а запас. Даже самому медленному этапу (145 мкс) нужно лишь около 8,5 % от периода пакета 1706,7 мкс, поэтому очереди никогда не заполняются, а их глубина (10) намного больше необходимой. Интересная область работы: заметно быстрее или заметно медленнее этой по умолчанию; см. упражнения.
  • Пропускная способность 2,402 МС/с равна предложенной скорости, как и должно быть, когда ничего не теряется.

Упражнения

  1. Самый медленный этап занимает 145 мкс. При какой частоте дискретизации период пакета падает до 145 мкс? Предскажите долю потерь чуть выше этой частоты, измените sample_rate_hz и проверьте.
  2. При скорости, близкой к насыщению конвейера, уменьшите обе глубины очередей с 10 до 1, затем до 2. Как изменятся потери и p99 задержки и почему глубина очереди не помогает по-настоящему перегруженному конвейеру?
  3. Уменьшите samples_per_packet вдвое. Задержка на пакет падает, но накладные расходы на пакет теперь важнее; набросайте, как вы выбирали бы размер пакета для собственного проекта.

Чек-лист отчёта

  • Указаны допущения о размере пакета и частоте дискретизации.
  • Приложены график задержки во времени и гистограмма.
  • Указаны средняя/p95/p99 задержки.
  • Указаны джиттер и доля потерь.
  • Дана рекомендация по глубине очереди для целевой пропускной способности.