Every PDB reading came back NA, and the cause was a base error. The four
ADPM12200 bricks put each measurement on its own PMBus PAGE, written
before the read. The bring-up spreadsheet listed those page numbers in
decimal but with an 0x prefix:
Vin PAGE 9 -> it said 0x00 (0x09)
Iin PAGE 10 -> it said 0x10 (0x0A)
Vout PAGE 2 -> it said 0x02 correct by luck
Iout PAGE 14 -> it said 0x14 (0x0E)
Temp PAGE 18 -> it said 0x18 (0x12)
Only Vout worked, because 2 reads the same in either base. Hence Iin and
Iout answering 0xFFFF, Temp answering 0x0000, and a Vin scale factor
having to be invented to make 50 V appear out of a page-0 register.
pwr_brick.sh reads all five bricks with the right pages and the
datasheet's DIRECT equation, X = (1/m)(Y x 10^-R - b): voltage Y x 8 mV,
current Y x 0.04 A, temperature Y x 0.01 C. Cross-checked rather than
assumed - READ_VOUT 0x05D4 decodes to 11936 mV, exactly what
'show platform voltage' reports for that rail through a separate sensor
path. The datasheet is committed alongside so the numbers are checkable.
Left flagged: Table 3 does not list READ_VIN or READ_IIN. They borrow the
voltage and current coefficients here, which is consistent with a ~50 V
input but is not something the datasheet states.
Each value is re-read until it passes three checks: not 0xFFFF, not
0x0000, and inside a plausibility window. The window is the one that
matters - this bus corrupts the HIGH BYTE only, which turns 11.98 V into
32.00 V. Positive, plausible in magnitude, and invisible to any all-ones
filter. 0x0000 is rejected for the mirror-image reason: on the
temperature register it decodes to a believable 0 C.
Adds comboA/comboB margin profiles per board. comboB is comboA with every
direction flipped, so the pair covers each rail high and low while its
neighbours sit the other way. NC channels stay nominal in both - there is
nothing to margin on an unused rail.
Script C re-enables the BMC USB journalctl dump, which had been commented
out, so that service log now reaches the master log.
Script A -> V1.1.6.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
27 KiB
CLAUDE.md — Blanton TTL Script
專案簡介
Blanton(Project Helios)交換器平台的系統層可靠性測試自動化腳本組。
Windows 端用 Tera Term TTL macro 透過 COM console 驅動 DUT 的 SONiC,
A / B / C 三支腳本分別跑「基線 → 壓力 soak → 收工判定」,全程存 log。
DUT 端的取數能力由一組 bash 工具庫 提供(CB FPGA pcimem → FPGA I2C/VI2C → VRM / 溫感 / LTC2980)。
完整架構見 ARCHITECTURE.md。
目前狀態(2026-09-02):Script A 為 V1.1.6(A 集中記錄所有 TTL 的變更)。涵蓋
PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin(9 顆 LTC2980)/ SWB loopback 線速流量 /
10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 bgctl。
switch unit 數量由 config.ttl 的 SWB_UNIT0 / SWB_UNIT1 宣告,風扇轉速由 FAN_SPEED 指定
(預設 100 = 全速;soak 是熱測試,散熱不該是變因)。
測試 job log 收在 DUT 的 /host/hw-eval/jobs/,Script C 結束時掛好 USB 再帶時戳複製到 /mnt/usb/。
100G PRBS(port_prbs_monitor.sh)已隨包交付,但 A/B/C 的呼叫仍註解掉,還在 bring-up。
Script B 的 soak 迴圈每輪印 bgctl list + jobs,並 pause 60(V1.0.10 之前完全沒有 pause)。
V1.1.0 新增全機 SerDes BER 掃描(blanton_ber.sh,Script C 已接,依 SWB_UNIT 分支)、
TR518 負載(blanton_tr518.sh,TTL 尚未接)、SWB 軌功耗(TH6_SWB{0,1}_power_readback.sh),
線速流量也納入 100G ce0(VLAN 138,靠 ingress mirror 維持循環)。
Script A 開頭會先收掉前一輪殘留(hw-test-session finish + bgctl reset/stop --all),
再 bgctl list 確認沒有 job 留著佔資源。
NFC tag 讀取由 nfc_polling.sh 背景輪詢(A 做基線、B 起、C 停並 report)。
另有 4_Blanton_Script_thermal_safety.ttl(熱 / 安規,獨立跑不接 A→B→C,滿載後每分鐘
取 PMON + 兩片 SWB 的軌功耗;沒有收尾段,中斷後要手動 blanton_tr518.sh stop)。
流程圖:docs/Blanton_Test_Flow.drawio。
最後一次發布是 V1.1.5;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。
margin 的 VNOM 已於 2026-08-30 改為 Blanton 實測中位數(144 條軌中 86 條上調 0.8~2.5%)。
交付用 ./publish/publish.sh 打包。
技術棧
- Host:Tera Term 5.x TTL macro(
.ttl),Windows - DUT:SONiC(Debian-based),bash + busybox/mawk,
root@sonic:~# - 暫存器存取:
pcimem(mmap PCI sysfsresource0+ BAR 相對 offset,一律 32-bit word) - I2C/PMBus:CB FPGA F3 I2C master(Ch0
Ch17,base 0x300 stride 0x20)、 CB F3 VI2C proxy → ICB/PDB(Ch0Ch4,base 0x780)、CPU 原生 bus(i2cset/i2cget) - Margin:LTC2980(= 2 × LTC2977)over PMBus,LINEAR16
- 資料面流量:
bcmcmd(Broadcom drivshell)SWB loopback,VLAN 30..137 成對cdN/cdN+32,tx 100 length=512;判定讀 ASICMIB_TPOK/MIB_RPOK做 per-pair 雙向交叉比對 - BMC:host 端
bmc-manager run "<cmd>",不需對 BMC 開 SSH(繞開其 busybox 工具鏈) - 背景工作:平台的
bgctl run/list/stop --all/reset;長時間 ping 用systemd-run --unit=掛 transient unit - 管理網路:iproute2(
ip link set/address replace/route replace ... metric)+ping -I - 風扇:max31790 driver rebind +
fan-speed-control.sh <%>(轉速讀config.ttl的FAN_SPEED) - 判定資料源:PCIe AER sysfs(
aer_dev_*)、EDAC sysfs(dimm_{ce,ue}_count)、SONiCshow platform * - 無編譯步驟:TTL 與 bash 都直譯執行
常用指令
# ── 部署 bash 工具庫到 DUT ──────────────────────────
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT_IP>:~/
# ── DUT 上載入工具(Script A 也是做這六件事)─────────
source ~/Blanton_Script/blanton_fpga_pcimem.sh # ← 會自己印出偵測到的 CB FPGA BDF
source ~/Blanton_Script/blanton_cb_i2c.sh
source ~/Blanton_Script/blanton_icb_vi2c.sh
source ~/Blanton_Script/blanton_pwr_data.sh
source ~/Blanton_Script/blanton_traffic_linespeed.sh
source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh
# ── FPGA BDF:自動偵測,不用改檔;必要時手動釘 ───────
fpga_rescan # 換 DUT / 重新列舉後重測
FPGA_BDF=0000:05:00 fpga_rescan # 偵測到多顆或選錯時,指定 domain:bus:dev(不含 .fn)
echo $FPGA_BDF_ACTIVE # 目前生效的 BDF
# ── 煙霧測試 ────────────────────────────────────────
cb_fpga 0 0xD90 # RST_CAUSE_REG,讀得到 = BAR 通了
cb_i2c_init 11 && cb_i2c_scan 11 # Ch11 風扇控制器,應看到 0x20
vi2c_scan_all # ICB/PDB 五個通道
temp_all # CB + ICB 溫感
pwr_data # SWB VRM 全軌
margin_init Blanton_CB_CONN13 && margin_status
# ── 電壓 margin 寫 NVM(⚠️ 永久,測試中絕不執行)─────
margin_save # 只寫當前 margin_init 載入的那顆(2 個 LTC2977)
margin_save all # settings/ 全部 9 顆;跑完自動切回原本載入的那顆
margin_save blanton # Blanton SONiC 捷徑:18 顆全走原生 i2c,不用 margin_init
# 0x15 是 send-byte,不帶 data byte:i2cset -f -y <bus> <addr> 0x15
# bus = FPGA F3 通道 + 7 → Ch6=13, Ch7=14, Ch8=15, Ch9=16(CB 本來就是 bus 4)
# ⚠️ 沒裝滿的機器:改 margin.sh 頂端的 MARGIN_BLANTON_STORE,把沒有的板子註解掉
# ── SWB loopback 流量(bcmcmd,unit 0/1)─────────────
# 不帶 -u 就是預設 TL_UNITS="0 1",兩塊 switch board 都做(TTL 三支腳本即如此)
blanton_traffic_linespeed ps # 對照線的 link/speed
blanton_traffic_linespeed init # VLAN 30..137,cdN <-> cdN+32
blanton_traffic_linespeed clear # clear c
blanton_traffic_linespeed start -tx 100 -length 512
blanton_traffic_linespeed stop # 移除 VLAN 成員(--destroy 連 VLAN 一起砍)
blanton_traffic_linespeed report # per-pair TX/RX + PASS/FAIL(exit 2 = 有 FAIL/NA)
blanton_traffic_linespeed run # ps → init → clear → start → report 一條龍
blanton_traffic_linespeed init -u 0 # 只做單一 unit 時才需要 -u
blanton_traffic_linespeed init -n # -n dry-run:只印要下的 bcmcmd,不碰 DUT
blanton_traffic_linespeed report -f <log> # 離線重解一份存下來的 console log
# 離線版報表(開發機上跑,選項更多)
python3 tools/bcm_mibpair_report_V1.1.0.py <drivshell.log> -a
# ── 管理網路 ping 監控(需先 chmod +x!)──────────────
chmod +x ~/Blanton_Script/*.sh # 佈署後必做一次
~/Blanton_Script/mgmt_ping_monitor.sh fg # 前景試一輪(約 30 秒),確認 IP/對端/網卡
~/Blanton_Script/mgmt_ping_monitor.sh start # 背景,log/mgmt_ping.log(start 會先清空)
~/Blanton_Script/mgmt_ping_monitor.sh status
~/Blanton_Script/mgmt_ping_monitor.sh stop
~/Blanton_Script/mgmt_ping_monitor.sh summary # 只看每段的 RESULT 行
# ⚠️ tail 子命令是 tail -f,會卡住不返回;TTL 裡要倒 log 請用 cat
# bmc_monitor.sh start/stop # free -m + BMC I2C 寫入/讀回圖樣測試,log/bmc_poll.log
# ⚠️ bmc_monitor_ddr.sh 已停用(DDR 壓力改走 bgctl + bmc-manager),檔案仍在
# ── 100G PRBS(目前 TTL 未啟用,手動測用)────────────
bash ~/Blanton_Script/port_prbs_monitor.sh start # 兩個 port 同時
bash ~/Blanton_Script/port_prbs_monitor.sh start a # 只跑 Ethernet513
bash ~/Blanton_Script/port_prbs_monitor.sh start b # 只跑 Ethernet514
bash ~/Blanton_Script/port_prbs_monitor.sh report # PASS/FAIL 統計(沒跑的顯示 SKIP)
bash ~/Blanton_Script/port_prbs_monitor.sh stop # 收尾會跑 prbsstat STOp + prbs clear
# ⚠️ PRBS 打起來時 link 會顯示 down,這是正常的 —— 所以 start 刻意不印 port status
# ── PDB / CPB power brick 讀值 ──────────────────────
./Blanton_Script/pwr_brick.sh show # Vin/Iin/Vout/Iout/Temp × 5 顆
./Blanton_Script/pwr_brick.sh show -r # 多印 raw word
# 四顆 ADPM12200 每個量各一個 PMBus PAGE:Vin 9 / Iin 10 / Vout 2 / Iout 14 / Temp 18
# CPB.PU37 (0x26) 是不同零件:不寫 PAGE,自己一套換算
# PB_TRIES=1 ... show -r 可看未經重試的原始行為
# ── 多相 VRM margin(原生 i2c,38 條軌)──────────────
./Blanton_Script/blanton_multiphase_margin.sh high3 # 全部 +3%
./Blanton_Script/blanton_multiphase_margin.sh low3 # 全部 -3%
./Blanton_Script/blanton_multiphase_margin.sh comboA # 混合,組合 A
./Blanton_Script/blanton_multiphase_margin.sh comboB # 混合,組合 B
./Blanton_Script/blanton_multiphase_margin.sh save # ⚠️ 永久寫 NVM
# -u 0 / -u 1 單邊(SWB0=i2c-13/15,SWB1=i2c-14/16);-n 只印指令
# 逐條印 SWB0_0V9_ANLG0 - 0.930V Configure Done;save 只印 Multiphase Save All
# ⚠️ 這不是 margin.sh 管的 LTC2980,兩支摸同一批軌,不要同時用
# ── 全機 SerDes BER(PRBS,期間 link 會顯示 DOWN)────
./Blanton_Script/blanton_ber.sh init # prbs set p=3 + prbs get(檢查每條 lane 鎖定)
./Blanton_Script/blanton_ber.sh start # prbsstat STArt Interval=30
sleep 30 # 至少等一個 interval 再 report
./Blanton_Script/blanton_ber.sh report # 每 lane 一列,BER < 1e-6 才 PASS,最後 summary
./Blanton_Script/blanton_ber.sh stop # prbsstat STOp
./Blanton_Script/blanton_ber.sh clear # prbs clear(會解除 PRBS,要重測得再 init)
# -u 0 / -u 1 單邊;-c 1e-9 換門檻;-F 只列失敗;-f <log> 離線重解
# ⚠️ 不能跟 blanton_traffic_linespeed / blanton_tr518 同時跑(都會接管同一批 port)
# ── TR518 負載 + 量功耗(TTL 尚未接)─────────────────
./Blanton_Script/blanton_tr518.sh start # 兩 unit,跑完 settle 120s
./Blanton_Script/TH6_SWB0_power_readback.sh # 19 條軌 V×I + TOTAL POWER
./Blanton_Script/TH6_SWB1_power_readback.sh
./Blanton_Script/blanton_tr518.sh stop # 只送 port cd lb=none
# ⚠️ stop 不還原 l2 learn / test mode(TR_RESTORE_LEARN=1 / _TESTMODE=1 才會)
# ── NFC tag 輪詢 ────────────────────────────────────
~/Blanton_Script/nfc_polling.sh start # 背景,start 會先清空 log
~/Blanton_Script/nfc_polling.sh status # pid、已跑幾輪、最後一筆結果
~/Blanton_Script/nfc_polling.sh report # PASS/FAIL/ERROR 統計,polling 中也能跑
~/Blanton_Script/nfc_polling.sh tail 50 # 最後 50 行(不 follow,不會卡住)
~/Blanton_Script/nfc_polling.sh stop
# log: ~/Blanton_Script/log/nfc_poll.log
# ERROR = 工具沒印出 [PASS]/[FAIL](或逾時),跟「tag 讀不到」分開算
# NFC_INTERVAL_SEC / NFC_TIMEOUT_SEC / NFC_ARGS 可調(要每個子指令都帶)
# ── USB 目標偵測 ────────────────────────────────────
bash ~/Blanton_Script/usb_target.sh -o dev # /dev/sdX1
bash ~/Blanton_Script/usb_target.sh -o mnt # 掛好並回傳掛載點
# ── 背景壓力(平台工具)──────────────────────────────
bgctl run /usr/sbin/memtester 1G 100
bgctl list
bgctl stop --all ; bgctl reset --yes
# ── 通道對照表(開發機上跑,改完 settings/*.conf 一定要重產)──
./tools/gen_channel_map.sh # → docs/LTC2980_channel_map.csv(144 列)
./tools/gen_channel_map.sh - # 只印到 stdout
# ⚠️ 需要 gawk(用到 3 參數的 match());mawk 會直接擋下並提示
# ── 各工具的 help ───────────────────────────────────
blanton_fpga_help ; blanton_cb_i2c_help ; vi2c_help
temp_sensor_help ; pwr_data_help ; blanton_traffic_linespeed_help
打包交付(在開發機上):
./publish/publish.sh # 版號讀 Script A 檔頭 → publish/Script_ABC_Blanton_V1.0.3/
./publish/publish.sh -z # 另出 zip
./publish/publish.sh -n # dry run
要出新版先改 Script A 檔頭的 ; Version :,publish 才會用新版號建資料夾。
Host 端跑一輪測試:
Tera Term 連 COM port (115200-8-N-1)
→ Control → Macro → 1_Blanton_Script_A.ttl (基線,跑完出 messagebox)
→ 手動跑 2_Blanton_Script_B.ttl (壓力 soak,while 1 迴圈,泡到時間到停掉)
→ 手動跑 3_Blanton_Script_C.ttl (kill + 收工快照 + 判定)
→ 檢查 Logs\Blanton_Margin_<ts>.log
開發慣例
- 執行單位:
src/Script_ABC_Blanton/整包給測試員(Tera Term 工作目錄); 其中Blanton_Script/是 scp 到 DUT~/的單位 - TTL 分層:
config.ttl放設定 → 三支主腳本編排流程 →utils/*.ttl是可 include 的無狀態片段 (只做wait prompt_sonic_root+sendln,不設變數、不 logopen) - 新增取數項目 = 新增一支
utils/show_xxx.ttl,再在主腳本include,不要往主腳本塞指令 - bash 命名:公開函數
cb_i2c_* / vi2c_* / temp_* / pwr_* / margin_*,內部 helper 一律底線開頭 (_cbi2c_* / _vr / _ts_* / _pwr_*) - 版本紀錄:
.sh每支檔頭都有Version History區塊,改動時在檔頭補一行 (V1.0.2 YYYY-MM-DD <做了什麼>),不要只改版號。 TTL 這邊 2026-08-17 起改為集中制:1_Blanton_Script_A.ttl的 History 記錄 A/B/C 三支的 所有變更,B 與 C 的檔頭版本區塊已移除。⚠️ 這是待確認的慣例變更 —— 若要回到「每支各自記錄」,B/C 的 History 需要補回去 - Commit:Conventional Commits,英文。scope 用
ttl/fpga/i2c/vi2c/margin/pwr/temp/docs - 換行符:由
.gitattributes管理 ——*.sh*.conf*.py*.txt*.md釘 LF (要在 SONiC 上跑/被 source),*.ttl維持 CRLF(Tera Term 只在 Windows 跑)。 編輯.ttl時要保留 CRLF,別讓整檔變成 LF 產生假 diff - 打包:
./publish/publish.sh,版號讀 Script A 檔頭不是參數 —— 先改檔頭再打包 - Status 表:
docs/TTL_Script_Blanton_Status_*.xlsx是逐項進度的正本(OK / On-Going + Owner), 完成一項就同步更新,別讓文件跟腳本脫節
注意事項
- 🔒 NDA:本 repo 只推
nas+gitea,絕不推 GitHub。docs/內含客戶 FPGA 規格。 - 🔒 DUT 帳密不進 git。
1_Blanton_Script_A.ttl的sendln "YourPaSsWoRd"是 placeholder, 實際值放secret/config_secret.ttl(gitignored)。任何 commit 前先 grep 一次確認沒帶到真密碼。 - ⚠️ PCIe BDF 是 per-unit 的 —— bash 端已自動化,TTL 端還沒。
blanton_fpga_pcimem.shV1.5.0(2026-08-17)起 source 時自動偵測(sysfs vendor0x1590→lspci→FPGA_BDF_FALLBACK),不用再每台改檔;印一行[INFO] CB FPGA BDF = ..., 可用fpga_rescan重測、FPGA_BDF=... fpga_rescan手動釘住。 但utils/show_pcie_error_reg_*.ttl裡的 7 組 BDF 仍是寫死的,換 DUT 還是要人工校對 —— 不校就會讀到別的裝置,或整段No such file or directory。 - ⚠️ AER 判定看差值不看絕對值:Script A 抓基線、Script C 抓結果,相減才是本輪錯誤。 Endpoint 與上游 Root Port 兩邊都要讀,錯誤可能只記在 RP。
- ⚠️ ICB/PDB 一律走 VI2C(
blanton_icb_vi2c.sh),不要走 VSPI:VSPI ~18 ms/reg 會讓 I2C byte 相間隔拉到 ~50 ms,踩中 SMBus 25–35 ms timeout,裝置直接 NACK。實測全掃 9.4 s vs 34.0 s。 - ⚠️ I2C 讀一律 Repeated START(不是 STOP + START),否則 PMBus/SMBus 裝置(VRM、EFUSE)不理。
- ⚠️ VI2C 這條路的壞法是「只壞高位元組」,不是整包壞掉。
11.98 V會變成32.00 V—— 正的、數量級也不誇張,擋全一/全零的過濾完全攔不到。寫任何 VI2C 讀值工具都要有 合理範圍檢查 + 重讀,光靠PDB_REJECT_FFFF那種是不夠的(pwr_brick.sh的教訓) - ⚠️ PMBus 的 PAGE 不是只有 VRM 通道在用:ADPM12200 把每個量測放在不同 PAGE
(Vin 9 / Iin 10 / Vout 2 / Iout 14 / Temp 18),沒寫 PAGE 就讀,回的是
0xFFFF或0x0000。blanton_pwr_data.sh的 PDB 表 page 是-,這就是它整張表 NA 的原因 - ⚠️
--runtime 86400是 24 小時上限:超過一天的 soak,SSD / USB 壓力會安靜結束, 剩下的時間那兩項閒置。bgctl list的數量變少是唯一的線索,不會報警 - ⚠️ 多相 VRM 與 LTC2980 是同一批軌的兩條路:
blanton_multiphase_margin.sh(原生 i2c) 和margin.sh(LTC2980 PMBus)都假設自己是唯一寫入者,沒有互斥檢查,只靠人記得 - ⚠️ traffic 的計數器基準在 v0.7.0 變了:
tx 100 length=512→tx 200 length=324, 每 burst 的位元組數 +27%。PASS/FAIL 是成對交叉比對不受影響,但絕對值不能跟舊 log 比 - ⚠️ Script 4(thermal/safety)沒有收尾:
while 1之後就是檔尾。中斷後 DUT 停在port cd lb=mac/l2 learn off/test mode nr=yes,mlucas-avx2也還在背景。 下一個測試會在被污染的狀態上開始,而且show interfaces status看不出來。 收尾:blanton_tr518.sh stop+kill $(jobs -p) - ⚠️ Script 4 與 Script B 不能共用同一台 DUT:兩者都會接管
port cd的 loopback - ⚠️
settings/*.conf的VNOM是實測中位數,不是規格值(2026-08-30 起)。它同時是margin_status偏差 % 的分母、也是margin_set推算 high/low/OV/UV 的基準,所以改它會 同時移動「看到的數字」和「實際打出去的電壓」。跨這個日期的 margin log 不能直接互比。 - ⚠️ SWB 的 margin profile 是 per-CONN 的:
combo_SWB_CONN13~16_{high,low}各自的百分比 對應該片板子的軌。套到別的 CONN 會 margin 到錯的軌,而且不會報錯。CB 沒有專屬 profile, 用通用的combo_high3/combo_low3 - ⚠️
margin_save/STORE_USER_ALL會永久寫 NVM,斷電保留 → 測試流程中絕不執行, 以免覆蓋客戶出廠 config。margin.sh的 auto-enable(ON_OFF_CONFIG=0x1a)只改 RAM,斷電復原。 v2.7.0 新增的margin_save all/margin_save blanton一次寫 18 個 LTC2977, 同一個警告放大 9 倍;另外0x15現在送 send-byte,不再帶多餘的0x00data byte。 - ⚠️ SWB 的 LTC2977 有兩條路可以到:
cb_pmbus_*(CB FPGA F3 Ch6/7/8/9 → pcimem)與 原生 i2c bus(i2cset -f -y 13/14/15/16,Ch+7 = bus)。margin_save blanton走後者, 其餘功能走前者。同一顆晶片,不要同時用兩條路。 - ⚠️ 改電壓會弄壞 DUT:套 profile 前確認該軌 OV/UV limit,且 servo DAC 注入電阻有 populate (本板部分 margin 電阻標 PROTO,沒 populate 的軌電壓不會動,不是腳本壞掉)。
- ⚠️
ARB_LOST≠ 有裝置:vi2c_scan只看RX_ACK,仲裁失敗會被誤報成裝置存在。blanton_pwr_data.sh已加 retry + plausibility window,寧可印NA也不要印看起來像數據的錯值。 - ⚠️ A → B → C 必須同一個 Tera Term session:B 的背景 job 與 C 的
kill $(jobs -p)綁在同一個 shell;log 也只有 A 會logopen,B/C 是續寫。中途關掉 window 就得手動收程序、log 也斷了。 - ⚠️ MP29816 的 Vout 解析度不是固定值,由
MFR_VOUT_SCALE_LOOP(0x29)bit[12:10] 決定,blanton_pwr_data.sh執行期從晶片讀;xlsx 上寫的/5mV與 MP2985B 的+49offset 都是錯的。 - ⚠️
bcmcmd就算失敗也 exit 0(VLAN: ERROR: Entry exists/Failed to execute the diagnostic command都照樣回 0),所以blanton_traffic_linespeed.sh是比對輸出而非看 exit code。另外bcmcmd一律要</dev/null—— 否則它會吃掉 while 迴圈的 stdin,只有第一個 VLAN 被設定(V0.3.1 修過的 bug,很難看出來)。 - ⚠️
stress_hhmd.py/stress_pcie.py已於 2026-08-17 由 KC 移除(Status 表 ScriptB #5/#7)。 Script B 現在是 8 個背景 job(1 mlucas + 5 mem + ssd + usb),不是 10 個。 I2C/PCIe 的持續讀取壓力目前沒有替代品。 - ⚠️ soak 迴圈沒有
pause:取樣間隔不是 Status 表寫的 10 分鐘,而是取決於指令執行時間。 (-u 0已於491e807移除,A/B/C 現在都跑兩個 switch unit。) - 🔒
.sh/.conf一定要 LF。CRLF 的 shell script 在 SONiC 上直接掛($'\r': command not found);settings/*.conf更陰險 —— 它們是被source的,CB_I2C_CH=6會變成"6\r",安靜地壞掉。.gitattributes已擋住 git 這條路徑,但不會回頭重寫既有工作區檔案:早於它 clone 的目錄要git rm --cached -r . && git reset --hard才會生效,而且git status乾淨不代表磁碟上是 LF (--renormalize只在進 index 的路上轉換)。驗證要看 byte:grep -rlU $'\r' <dir> - ⚠️ TTL 的
timeout是全域的:timeout = N之後每一個wait都被限制在 N 秒。逾時的wait直接返回而沒吃到 prompt,下一個指令就在前一個還沒跑完時送出,之後整輪錯開一拍。設了一定要 配一個timeout = 0還原(wait_init.ttl60→0;Script B 的 cdc_ncm 探測 15→0 在:skip_ping) - ⚠️ 兩張管理網卡同網段會 ARP flux:
mgmt_ping_monitor.sh讓 eth0/eth1 同時 up,同一個 /24 下 對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張。ARP_STRICT=1擋掉;判讀時看RESULT行的nic_tx/nic_rx(該卡自己的 packet delta)—— ping 成功但nic_tx接近 0 = 封包從另一張卡出去的 - ⚠️ PRBS 跑起來時
show interfaces status會顯示 DOWN,那是 link 離開正常運作模式,不是故障。port_prbs_monitor.sh的start因此刻意不印 port status(避免測試員誤判),只在prbs clear之後的報表裡印 - ⚠️
ip -s link的欄位順序是bytes packets errors ...,要 packet 數取的是第 2 欄不是第 1 欄 - ⚠️
mgmt_ping_monitor.sh/bmc_monitor*.sh需要 exec bit,且不是改用bash x.sh start就能繞過 ——do_start內部是setsid "$SCRIPT_PATH" __daemon,直接執行該路徑。git 記錄是100644, Windows → 隨身碟 → DUT 也帶不動權限位元,所以佈署後要chmod +x ~/Blanton_Script/bmc_monitor*.sh。 沒做的話 start 會 Permission denied、後面的cat撲空,而且不會報錯,只會得到一份全空的 log - ⚠️ 這幾支 monitor 的
tail子命令是tail -n 50 -f,永遠不返回。TTL 裡絕對不要呼叫它 (Script C 曾因此卡死,18ce7a1改成直接cat log/*.log) - ⚠️ 背景 monitor 的
start只等 1 秒就返回,不是跑完一輪。Script A 要做一輪基線的話,start和stop中間必須pause(目前是 45 秒,一輪約 30 秒)—— 少了它 log 只會有 START banner - ⚠️ 風扇那段設完會
wait "Set all configured fan channels to"等確認提示再送y。該提示沒出現 (版本改了、字串換了)就會永遠卡住且不報錯 —— 現場看起來像 Script A 當掉 - ⚠️
show_dmesg.ttl結尾會dmesg -C清空 kernel ring buffer。這是刻意的(讓 Script C 只看到 soak 期間新產生的訊息),但代表事後在 DUT 上dmesg撈不到舊訊息 —— 內容只存在 master log 裡 - ⚠️
bcmcmd的輸出是 CRLF。show c的計數器後面還跟著 delta,所以「砍掉第一個空白之後」 順便把 CR 砍掉了;但prbsstat Ber的 BER 是整行最後一個 token,CR 直接黏在數字上 —— 數字驗證會失敗(全變 NA),而且印出來時 CR 把游標拉回行首,後面的欄位會覆蓋掉前面的欄位。 寫新的 awk 解析器時,第一件事就是{ gsub(/\r/, "") }(blanton_ber.shV1.0.1 的教訓) - ⚠️
bcmcmd的 exit code 兩邊都不能信:BCM shell 拒絕指令時它回 0 (blanton_traffic_linespeed.shV0.3.1),而tr 518這種跑很久的指令會讓它 poll 逾時而回 非 0,但指令其實已經在跑(polling socket timeout: Success)。可靠的作法是找成功的證據 ——例如tr 518印出TR 518 TEST PARAMETERS才算收下(blanton_tr518.shV1.0.1) - ⚠️ 交換晶片不會把封包從進來的那個 port 送回去(source-port knockout)。所以單一 port 的
VLAN 打不出持續流量:
tx 100就是一趟來回然後結束。ce0靠 ingress mirror 打回自己繞過 這個限制(鏡像複本不經過 egress filter),且不 stop 就不會自己停 - ⚠️ DUT 的 awk 對
%d會夾到 INT32(2147483647)。線速流量的計數器是 ~10¹² 量級, 所以 awk 裡輸出大數一律用%.0f(double 域,精確到 2⁵³)。blanton_traffic_linespeed.shV0.4.1 已修;寫新的 awk 報表時要記得同一件事
資料夾說明
src/Script_ABC_Blanton/— 可執行內容(Tera Term 工作目錄;內含要 scp 到 DUT 的Blanton_Script/)docs/— 客戶 FPGA 規格、AER/EDAC 檢查依據、逐項 Status 表(最新為*_20260817.xlsx)、LTC2980_channel_map.csv(9 個settings/*.conf合併成 Board,CONN,Ch,NetName,Vnom 144 列, 查 net 對應哪片哪個 channel 用;改.conf後要重跑產生)tools/— Host / 離線端:bcm_mibpair_report_V1.1.0.py(drivshell log → per-pair 報表)、traffic_loopback_*.txt(bcmcmd 原始指令表,blanton_traffic_linespeed.sh是其 bash 版, 改 loopback 線路時兩邊要同步)、100G_PRBS.txt/TR518.txt/fan_ctrl.txt(上機手貼用的原始指令;PRBS 已有.sh,TR518 尚未腳本化)publish/—publish.sh(打包工具,進 git)+Script_ABC_Blanton_<Ver>/產出(gitignored)secret/— 🚫 gitignored(除README.md與*.example):DUT 帳密、per-unit BDF 覆寫、COM 設定For_AI/— 🚫 gitignored:AI 協作素材(波形截圖、草稿筆記)