Блок 11: разборы случаев отладки¶
Около половины лабораторных блока 11: не упражнения, а запись того, как модем заставляли работать на реальном оборудовании. Каждая фиксирует один отказ, эксперименты, которые его сузили, и в итоге причину. Читайте их после основного пути как разобранные примеры отладки, а не как процедуры для повторения.
Чему учат эти случаи, одним списком¶
- Счётчик внутри FPGA: не доказательство излучённого сигнала. Это может сказать только независимый приёмник (случай 3).
- Успешный тест соседнего пути ничего не говорит о сломанном. Исправный DDS-тон скрыл отключённый путь данных (случай 3).
- Сначала проверьте, что именно собрано, и только потом: что оно делает. Устаревший block design обесценил недели результатов (случай 4).
- Знайте, где стоит ваш щуп. Пять лабораторных измеряли здоровый сигнал на один блок раньше того блока, который его портил (случай 7).
- Разделите популяцию отказов, прежде чем усреднять. «Пол BER» оказался двумя разными дефектами (случай 8).
- Один эксперимент это одна гипотеза. Отрицательный результат это тоже результат: каждый исключённый подозреваемый сужал поиск (случай 2).
- Симуляция и закрытие тайминга необходимы, но не достаточны. Право вето у живого A/B-теста (случаи 5 и 6).
Случаи¶
| № | Лабораторные | Симптом | Чем это оказалось | Урок |
|---|---|---|---|---|
| 1 | 11.8–11.11 | Первый пакет PL BPSK не возвращает бит; захват IIO на хосте, идущий одновременно с управлением пакетом, падает с Bus error или тайм-аутом refill. |
Проблема интеграции вокруг живого PL-дизайна, а не настройки: отключение входа clock-monitor у axi_gpreg убрало Bus error при перекрытии. Сначала оверлей урезали до минимального безопасного при загрузке пути управления. |
Когда отказ зависит от того, что ещё работает одновременно, перестаньте подбирать усиления и смотрите на структуру. Держите заведомо рабочую базу и меняйте по одному параметру. |
| 2 | 11.13–11.19 | После горячей загрузки runtime-оверлея tx_valid_count > 0, но rx_valid_count = 0, а захват RX на хосте падает по тайм-ауту (errno 110). |
Не повторная инициализация RX common (11.16), не start_offset 0–127 (11.17), не состояние сессии хоста (11.18), не время прогрева TX (11.19). Позже Лабораторная 11.26 выяснила, что развёрнутый битстрим был собран из устаревшего block design. |
Каждая лабораторная исключила одного подозреваемого и прямо это зафиксировала. Именно эта запись позволила найти настоящую причину. |
| 3 | 11.20–11.25 | Внешний RTL-SDR декодирует BPSK стокового shell с BER 0 и видит DDS-тон в обоих режимах, но записи runtime-PL остаются на BER ≈ 0,35 без корреляции преамбулы. | Сначала страницы заключили «TX исправен, сломан RX». Данные говорили другое: пакета PL в эфире не было. После перезагрузки оверлея ЦАП работает в режиме DDS-only и игнорирует поток PL (выяснено в 11.26). DDS-тон работал, потому что этот поток не использовал. | tx_valid_count > 0 доказывает, что отсчёты созданы, а не переданы. Лабораторные 11.22–11.25 теперь содержат исправление. |
| 4 | 11.26 | На оборудовании BER держится около 40–50 %, хотя все симуляции проходят. | Шесть дефектов, найденных по одному: ЦАП в режиме DDS-only; устаревший block design, у которого карта регистров не совпадала с хостом (кэш out-of-context синтеза к тому же прятал исправления RTL); сэмплер тайминга, сбрасываемый один раз, из-за чего каждый кадр после первого ничего не восстанавливал; неверный формат отсчётов; пузырь рукопожатия в один такт на символ, опустошавший FIFO ЦАП и искажавший время; и 4-битное окно захвата преамбулы, совпадавшее и с ведущими нулями. После последнего исправления: BER 0 на кристалле. | У пола BER в 50 % много возможных причин. Исправьте одну, закрепите её регрессионным тестом, измерьте снова. |
| 5 | 11.33 | Новый выборщик тайминга проходит replay и RTL-тесты и закрывает тайминг. | Живой A/B на двух платах оказался хуже принятого приёмника (10–35 % чистых попыток против 67,5 %). Кандидат удалён. | Прохождение симуляции и закрытие тайминга необходимы; решает физический A/B. |
| 6 | 11.35 | Петля Гарднера помогает захвату, но не чистым кадрам, и разваливается при нулевом CFO. | Дешёвый детектор ошибки использовал независимые знаки по I и Q, поэтому его усиление зависело от поворота созвездия. CFO прокручивает созвездие и маскировал дефект; при нулевом CFO он проявился. Форма через скалярное произведение исправила инвариантность. | Тестируйте в условии, которое убирает маскирующую переменную, и давайте парные результаты с доверительными интервалами. |
| 7 | 11.41 | Один бит полезной нагрузки неверен в каждом отмеченном кадре, хотя все измерения сигнала на этом символе в порядке. | Точка захвата записывает вход приёмной цепочки; DC-блокер: первый блок после неё, и он следил за данными. Пять лабораторных измеряли правильную величину не в том месте. | Знайте, где стоит щуп. Когда измерение и симптом расходятся, подозреваемой становится и схема между ними. |
| 8 | 11.42 | После исправления DC-блокера около 8 % кадров всё ещё грязные. | Две популяции: одиночные шумовые ошибки и кадры примерно с половиной неверных бит начиная с бита 0, то есть весь пакет декодирован в неверном повороте из-за ложного захвата кадровой синхронизации. | Не усредняйте бимодальный отказ в один BER; разделите его и идите за той популяцией, которая несёт сигнал. |
Остальные лабораторные блока 11 вне основного пути (11.9, 11.10, 11.15–11.18, 11.21, 11.23, 11.24): отдельные эксперименты внутри этих случаев.