Лабораторная 11.29 — Кампания надёжности BER при холодной загрузке¶
Цель¶
Превратить «модем декодирует» в число с доверительным интервалом. Одно 10/10 ничего не говорит о «хвостах»; здесь плата многократно перезагружается, каждый раз bitstream загружается из чистого состояния, а кадры считаются через детерминированный loopback fabric PL, так что серия без ошибок становится ограниченным BER, а не необоснованным «BER = 0».
Что измеряется¶
Каждый запуск:
- холодно загружает плату (по умолчанию мягкая перезагрузка: Linux + повторная инициализация AD9361 + перезагрузка overlay из stock; либо настоящее выключение питания, см. ниже);
- перезагружает наш bitstream и проверяет идентификатор ядра gpreg
0x4250534B: детектор сбоя загрузки; - пропускает
--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. Ничего не излучается.