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

Лабораторная 11.29 — Кампания надёжности BER при холодной загрузке

Цель

Превратить «модем декодирует» в число с доверительным интервалом. Одно 10/10 ничего не говорит о «хвостах»; здесь плата многократно перезагружается, каждый раз bitstream загружается из чистого состояния, а кадры считаются через детерминированный loopback fabric PL, так что серия без ошибок становится ограниченным BER, а не необоснованным «BER = 0».

Что измеряется

Каждый запуск:

  1. холодно загружает плату (по умолчанию мягкая перезагрузка: Linux + повторная инициализация AD9361 + перезагрузка overlay из stock; либо настоящее выключение питания, см. ниже);
  2. перезагружает наш bitstream и проверяет идентификатор ядра gpreg 0x4250534B: детектор сбоя загрузки;
  3. пропускает --frames кадров через loopback fabric (gp_ctrl[6]: TX замкнут на RX внутри PL, без AD9361, без RF, побитово детерминированно) для BPSK (281 бит/кадр) и QPSK (280 бит/кадр), считая принятые кадры, чистые кадры и битовые ошибки.

Loopback fabric это метрика корректности PL: он прогоняет весь синтезированный тракт маппер → upsampler → RRC → сэмплер → решение → frame-sync → счётчик BER через настоящую плоскость gpreg/CDC. Поскольку он безошибочен, каждый чистый кадр добавляет к большому детерминированному числу бит.

Статистика (без сторонних зависимостей)

  • Доли запусков (загрузилось, всё чисто): доверительный интервал Уилсона, а также Клоппера–Пирсона, если импортируется scipy.
  • BER при нуле ошибок на m битах: односторонняя верхняя граница 1 − 0,05^(1/m) ≈ 3/m (правило трёх). Сообщается как BER < X, но не как BER = 0.
  • FER (кадры с ≥1 ошибкой / возвращённые кадры): интервал Уилсона.

Итоговый JSON перезаписывается после каждого запуска, поэтому остановленная или прерванная кампания всё равно оставляет полный и честный частичный результат.

Запуск

python blocks/block_11_integrated_sdr_project/python/lab_11_29_cold_boot_ber_campaign.py \
  --runs 50 --frames 200

--runs от 30 до 100 даёт полезную ширину интервала. По умолчанию --bit: tmp/bridge_txrx_mux.qpsk.wordswap.bit.bin. В конце плата перезагружается в stock.

Настоящее выключение питания

«Холодная загрузка» по умолчанию: мягкая перезагрузка, то, что можно автоматизировать без управляемого питания. С управляемым источником передайте команду, циклически включающую питание платы; кампания выполнит её вместо мягкой перезагрузки, а затем дождётся возвращения платы:

python blocks/block_11_integrated_sdr_project/python/lab_11_29_cold_boot_ber_campaign.py --runs 50 \
  --power-cycle-cmd "your-smart-plug-cli --off && sleep 3 && your-smart-plug-cli --on"

Результат (2026-07-11, 50 мягких холодных загрузок, 200 кадров на режим)

загружено всё чисто бит ошибок BER (верхняя граница 95 %)
BPSK fabric - - 2 810 000 0 < 1,07 × 10⁻⁶
QPSK fabric - - 2 800 000 0 < 1,07 × 10⁻⁶
вместе 50/50 50/50 5 610 000 0 < 5,34 × 10⁻⁷
  • Доля чистых запусков 50/50, Уилсон 95 % [0,929; 1,0]; ноль сбоев загрузки.
  • FER 0 для обеих модуляций, Уилсон 95 % [0; 3,84 × 10⁻⁴]; гистограмма ошибок {0: 10000} в каждом случае.

Итак, синтезированный модем PL поднимается и декодирует при каждой холодной загрузке с субмикросекундной границей BER на 5,6 млн детерминированных бит.

Надёжность закрытия тайминга

Сопутствующий инструмент tools/timing_directive_sweep.tcl проверяет, является ли поставляемое закрытие тайминга свойством проекта или одной удачной трассировки. У Vivado 2021.1 нет числового seed размещения, поэтому перебирается директива размещения (более сильная проверка это меняется сам алгоритм):

/g/Xilinx/Vivado/2021.1/bin/vivado.bat -mode batch -notrace -source tools/timing_directive_sweep.tcl

Результат, ROBUST, все пять стратегий уложились в тайминг:

директива WNS (нс) TNS
Default +0,087 0
Explore (поставляемая) +0,123 0
WLDrivenBlockPlacement +0,017 0
ExtraNetDelay_high +0,171 0
ExtraPostPlacementOpt +0,122 0

Худший результат среди действительно разных размещений это +0,017 нс (WLDriven): положительный и именно тот запас, за которым надо следить по мере роста RTL. Развёртка оставляет impl_1 на последней директиве; чтобы вернуть поставляемое размещение Explore, запустите обычную сборку заново.

RF-безопасность

Loopback fabric никогда не настраивает и не повышает TX: плата всё время остаётся на стоковых −89,75 дБ, а в конце кампания перезагружает её в stock. Ничего не излучается.