Files
Blanton_TTL_Script/ARCHITECTURE.md
T
etwenandClaude Opus 5 15ea776b82 feat(soak): Show the background jobs each round, and stop the loop spinning
Script B's monitoring loop had no pause at all - each round started the
instant the last one ended, so an overnight soak filled the log with
near-identical samples taken seconds apart. The section was even labelled
"Get data every 10mins" while running with no delay whatsoever.

The loop now ends each round with pause 60 and prints both job lists:
bgctl list for the platform job runner, jobs for anything the macro
backgrounded in that shell. A stress job that dies mid-soak shows up as a
shorter list on the next round instead of going unnoticed until the end.

60s is still hard-coded and the Status sheet asks for 10 minutes, so the
Phase 3 item stays open - this makes the loop sane, it does not close it.

Also adds docs/LTC2980_channel_map.csv: the nine settings/*.conf flattened
into one Board,CONN,Ch,NetName,Vnom sheet, generated by
tools/gen_channel_map.sh. The CSV is output, not source. NC channels are
kept as NC/- because the channel number is also the PMBus page - dropping
the gaps would shift every channel after them.

Two things the merged table makes visible: SWB0 and SWB1 carry identical
net names and voltages (only the bus and CB_I2C_CH differ), so those are
two copies that can drift apart silently; and there are exactly 8 NC
channels, all on CONN14/CONN15.

tools/100G_PRBS.txt, TR518.txt and fan_ctrl.txt join the existing
traffic_loopback_*.txt references. TR518 is not scripted yet and cannot
share the hardware with blanton_traffic_linespeed - both drive port
loopback and L2 learning.

Script A -> V1.0.10.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-27 14:29:47 +08:00

55 KiB
Raw Permalink Blame History

ARCHITECTURE — Blanton TTL Script

Overview

Blanton_TTL_Script 是 BlantonProject Helios)交換器平台的系統層可靠性測試自動化腳本組。 測試工程師在 Windows 端用 Tera Term (TTL macro) 透過 COM port 連上 DUT 的 SONiC console 由 A / B / C 三支腳本依序驅動一整輪 stress + margin + error-counter 測試,全程自動存 log。

三支腳本的分工就是一輪測試的三個階段:

Script 階段 做什麼
1_Blanton_Script_A.ttl Pre-test / Baseline 登入、對時、載入 shell 工具、清 PCIe AER、抓 PCIe tree / margin / PMON / dmesg 基線
2_Blanton_Script_B.ttl Stress / Soak 開 CPU / DDR / SSD / USB 壓力程序 + 啟動 SWB loopback 線速流量,之後進無限迴圈每輪抓完整 PMON / margin
3_Blanton_Script_C.ttl Post-test / Verdict 殺掉壓力程序、停流量並出 per-pair TX/RX 報表、再抓一次 PMON / dmesg / PCIe AER,比對 stress log 判定

DUT 端的實際取數能力則來自一組 bash 工具庫Blanton_Script/),這一層才是真正碰硬體的地方: CB FPGA 的 PCIe BARpcimem)→ FPGA 內建 I2C / VI2C master → 板上 VRM、溫度感測器、 LTC2980 margin 控制器。TTL 只負責「按順序 sendln 並把畫面收進 log」,硬體語意全在 bash 這層。

使用者:硬體 / 系統驗證工程師(ETWen、KC、Alan)。 核心價值:把一輪要跑數小時、跨 PCIe / DDR / I2C / 電源多個子系統的 reliability run 壓縮成「開 Tera Term → 跑 A → 跑 B 泡著 → 跑 C 收工」三個動作,且每一筆數據都有 log 可回溯。


Tech Stack

Layer Technology
測試控制端(Host Tera Term 5.x TTL macro.ttl),Windows
Host ↔ DUT 通道 RS-232 / USB-Serial COM portSONiC console
DUT OS SONiCDebian-based network OS),bash + busybox/mawk
DUT 端工具語言 Bash Shell Script
暫存器存取後端 pcimemmmap PCI sysfs resource0 + BAR 相對 offset
I2C / PMBus 路徑 CB FPGA F3 OpenCores I2C master、CB FPGA F3 VI2C proxy、CPU 原生 busi2cset/i2cget
電源 margin LTC2980= 2 × LTC2977over PMBusLINEAR16 編碼
錯誤計數來源 Linux PCIe AER sysfsaer_dev_*)、EDAC sysfsdimm_ce/ue_count
平台監控 SONiC show platform *pmon container,含 leak status / leak channels
BMC 存取 host 端 bmc-manager run "<cmd>"(不需對 BMC 開 SSH,繞開其 busybox 工具鏈);bmc-first-enroll / bmc-manager version|status
背景工作管理 bgctl run/list/stop --all/reset(平台工具);長時間 ping 用 systemd-run --unit= 掛成 transient unit
管理網路 iproute2ip link set / ip address replace / ip route replace ... metric+ ping -I
測試 session hw-test-session start|log|status|finishjob log 收在 /host/hw-eval/jobs/
風扇控制 max31790 driver rebind/sys/bus/i2c/drivers/max31790/{bind,unbind}+ fan-speed-control.sh <%>
100G PRBS bcmcmd -n <unit> -c 'dsh -c "phy diag <phy> prbs …"'set / prbsstat STArt / get / Ber / STOp / clear
壓力測試 mlucas-avx2AMD CPU)、bgctl run 排程的 memtester / qfx5252-stress-ssd / qfx5252-stress-usb
資料面流量 bcmcmdBroadcom drivshellVLAN loopback + tx burstswitch unit 0 / 1
流量報表 DUT 上 awkblanton_traffic_linespeed report);離線 python3 tools/bcm_mibpair_report_V1.1.0.py
版本控制 GitNAS + Gitea 私有 remote不推 GitHub,含客戶 NDA 資料

⚠️ 無編譯步驟。 TTL 與 bash 都是直譯執行,「build」等同「把 src/Script_ABC_Blanton/ 複製到 Tera Term 工作目錄,並把 Blanton_Script/ scp 到 DUT 的 ~/」。


Architecture Diagram

┌──────────────────────────────────────────────────────────────┐
│  Windows Host — Tera Term 5.x                                │
│                                                              │
│   1_Blanton_Script_A.ttl ──┐                                 │
│   2_Blanton_Script_B.ttl ──┼─→ include "config.ttl"          │
│   3_Blanton_Script_C.ttl ──┘   (prompt / EN_* 旗標)          │
│            │                                                 │
│            └─→ include "utils/*.ttl"  (可重用取數片段)        │
│                                                              │
│   logopen → Logs/Blanton_Margin_<ts>.log  (整段 console 存檔) │
└───────────────────────┬──────────────────────────────────────┘
                        │ COM portsendln "<cmd>" / wait "<prompt>"
                        ▼
┌──────────────────────────────────────────────────────────────┐
│  DUT — SONiC console (root@sonic:~#)                         │
│                                                              │
│  ~/Blanton_Script/  (source 進 shell 後成為一組函數)          │
│   ├ blanton_fpga_pcimem.sh   cb_fpga / pmc_fpga / swb0_fpga  │
│   ├ blanton_cb_i2c.sh        cb_i2c_* / cb_pmbus_*           │
│   ├ blanton_icb_vi2c.sh      vi2c_* (ICB/PDB proxy)          │
│   ├ blanton_temp_sensor.sh   temp_cb / temp_icb / temp_all   │
│   ├ blanton_pwr_data.sh      pwr_data / pwr_data_pdb         │
│   ├ blanton_traffic_linespeed.sh                             │
│   │        init/clear/show/start/stop/ps/report (bcmcmd)     │
│   └ LTC2980_Margin_Script/   margin_init / margin_status ... │
│                                                              │
│  ~/hammer/tools/     壓力程序(mlucas-avx2, stress_*.py     │
│  bcmcmd -n 0|1       Broadcom drivshellVLAN loopback / tx │
│  SONiC CLI           show platform fan/temperature/leak/...  │
│  Linux sysfs         aer_dev_* / edac mc0/rank*              │
└───────────────────────┬──────────────────────────────────────┘
                        │ pcimem /sys/bus/pci/devices/0000:03:00.<fn>/resource0
                        ▼
┌──────────────────────────────────────────────────────────────┐
│  CB FPGA (PCIe EP4 個 FunctionBDF 於 source 時自動偵測)   │
│   F0  local regsRST_CAUSE_REG 0xD90 / SWB 0xD94,0xD98      │
│   F3  I2C master  Ch0..Ch17  (base 0x300, stride 0x20)       │
│   F3  VI2C→ICB    Ch0..Ch4   (base 0x780, stride 0x20)       │
│   F2  VSPI 橋接 PMC/ICB/SWB(慢,~18ms/reg,本專案不走)      │
└───────────────────────┬──────────────────────────────────────┘
                        │ I2C / PMBus
                        ▼
   TCA9546/9543 mux · MP29816/MP2985B VRM · TMP75/TMP432 溫感
   MAX31790 風扇 · LTC2980 margin (CONN13~16 × CB/SWB0/SWB1)
   PDBHotswap / Power brick / EFUSE(走 VI2C ch3/ch4

Project Structure

Blanton_TTL_Script/
│
├── CLAUDE.md                          # 專案記憶 & 給 Claude 的指令
├── ARCHITECTURE.md                    # 本架構文件
├── .gitignore                         # secret/ + For_AI/ + logs + publish 產出
├── .gitattributes                     # 換行符政策:.sh/.conf 釘 LF、.ttl 保持 CRLF
│
├── docs/                              # 規格與狀態文件(客戶提供 / 專案產出)
│   ├── Blantons_FPGA_Registers.md         # FPGA 暫存器規格(markdown 正本,查 offset 用)
│   ├── Blantons_FPGA_Registers_draft.docx # 同上,客戶原始 docx
│   ├── Blantons_FPGA_Registers_Map_draft.xlsx
│   ├── Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf  # AER / EDAC 檢查點依據
│   ├── LTC2980_channel_map.csv            # 9 個 settings/*.conf 合併:Board,CONN,Ch,NetName,Vnom144 列)
│   ├── TTL_Script_Blanton_Status_20260814.xlsx
│   └── TTL_Script_Blanton_Status_20260817.xlsx    # ⭐ 最新:三支腳本逐項 StatusOK / On-Going + Owner
│
├── tools/                             # Host / 離線端輔助腳本
│   ├── bcm_mibpair_report_V1.1.0.py       # 離線解析 drivshell log → per-pair TX/RX + PASS/FAIL
│   ├── traffic_loopback_vlan_setting.txt  # bcmcmd VLAN 30..137 建立 + 成對 pbmcdN <-> cdN+32
│   ├── traffic_loopback_start.txt         # bcmcmd tx 100 length=512 VLantag=<vid>
│   ├── traffic_loopback_vlan_remove.txt   # bcmcmd vlan remove <vid> pbm=...
│   │                                      # ↑ 三份為手動貼上用的原始指令表,
│   │                                      #   blanton_traffic_linespeed.sh 是其 bash 版
│   ├── 100G_PRBS.txt                      # 100G PRBS 原始指令(port_prbs_monitor.sh 的來源)
│   ├── TR518.txt                          # 內建封包測試 tr 518Scenario=6 Profile=2)— 尚未腳本化
│   ├── fan_ctrl.txt                       # MAX31790 unbind/bind + fan-speed-control.sh 30
│   └── gen_channel_map.sh                 # settings/*.conf → docs/LTC2980_channel_map.csv(需 gawk
│
├── secret/                            # 🚫 gitignored — DUT 密碼、per-unit BDF、COM 設定
│   ├── README.md                      # ✅ committed — 用途索引
│   ├── config_secret.ttl.example      # ✅ committed — 帳密範本(__CHANGE_ME__
│   └── config_secret.ttl              # 🚫 實際帳密,由 config.ttl include
│
├── For_AI/                            # 🚫 gitignored — AI 協作素材(波形截圖、草稿)
│
├── publish/
│   ├── publish.sh                     # ✅ committed — 打包工具(版號讀 Script A 檔頭)
│   └── Script_ABC_Blanton_<Ver>/      # 🚫 產出,gitignored-z 另出同名 .zip
│
└── src/
    └── Script_ABC_Blanton/            # ← Tera Term 的工作目錄(整包給測試員)
        │
        ├── config.ttl                 # 全域設定:testcase 名、EN_Margin / EN_log、三個 prompt 字串
        ├── 1_Blanton_Script_A.ttl     # Pre-test:登入 → 對時 → source 工具 → 清 AER → 抓基線
        ├── 2_Blanton_Script_B.ttl     # Stress:開壓力程序 → while 1 每輪抓 fan/temp/margin
        ├── 3_Blanton_Script_C.ttl     # Post-testkill → 再抓一次 → 比對 stress log
        │
        ├── utils/                     # 可 include 的取數片段(TTL,無狀態、只 wait+sendln
        │   ├── pcie_bus.ttl               # lspci -tvvv / -vv
        │   ├── setup_pmon.ttl             # show platform summary/fan/temperature/psustatus/voltage/
        │   │                              #   current/ssdhealth/leak status/leak channels + TPM11 項)
        │   ├── show_dmesg.ttl             # dmesg -T 合併 error 正則 + i2c 過濾 + dmesg -C 清空
        │   ├── show_margin_status.ttl     # source margin_status_all.sh(掃 9 顆 LTC2980
        │   ├── kill_all_process.ttl       # kill $(jobs -p)
        │   ├── wait_init.ttl              # 輪詢 show platform temperature 直到 pmon 起來
        │   ├── show_pcie_error_reg.ttl        # 舊的合併版(已被下列 per-device 版取代)
        │   ├── show_pcie_error_reg_TH6_SWB0.ttl   # EP 01:00.0 + RP 00:01.1
        │   ├── show_pcie_error_reg_TH6_SWB1.ttl   # EP 02:00.0 + RP 00:01.2
        │   ├── show_pcie_error_reg_FPGA.ttl       # RP 00:01.5(共用上游)
        │   ├── show_pcie_error_reg_BMC.ttl        # EP 03:00.0 + RP 00:01.4
        │   ├── show_pcie_error_reg_I210.ttl       # EP 07:00.0 + RP 00:02.4
        │   ├── show_pcie_error_reg_SSD.ttl        # EP 06:00.0 + RP 00:02.1
        │   └── show_pcie_error_reg_DDR.ttl        # EDAC mc0 rank0~3 CE/UE
        │
        ├── logs/                      # Tera Term logopen 輸出(*.log gitignored
        │
        └── Blanton_Script/            # ← scp 到 DUT ~/ 的單位(bash 工具庫)
            ├── blanton_fpga_pcimem.sh     # pcimem 後端:cb_fpga/pmc_fpga/icb_fpga/swb0_fpga/swb1_fpga
            ├── blanton_cb_i2c.sh          # CB FPGA F3 I2C masterCh0~Ch17+ PMBus helper
            ├── blanton_icb_vi2c.sh        # CB F3 VI2C proxy → ICB/PDBCh0~Ch4
            ├── blanton_temp_sensor.sh     # TMP75 / TMP432 讀溫(CB Ch10 mux + ICB VI2C Ch2
            ├── blanton_pwr_data.sh        # SWB VRM + PDB brick 的 Vin/Vout/Iout/Temp 表
            ├── blanton_traffic_linespeed.sh  # SWB loopback 線速流量(bcmcmd unit 0/1
            │                                 #   init/clear/show/start/stop/ps/report/run
            ├── mgmt_ping_monitor.sh       # 10G/1G 管理網路 ping 監控(iproute2
            │                              #   eth0→TARGET_10G、eth1→TARGET_1G,兩張卡同時持續 ping
            ├── port_prbs_monitor.sh       # 100G uplink PRBS 測試(bcmcmd phy diag
            │                              #   ⚠️ 已納入交付,但 A/B/C 的呼叫仍註解掉(bring-up 中)
            ├── usb_target.sh              # 偵測 USB 裝置節點/掛載點(排除系統碟)
            ├── bmc_monitor.sh             # BMC 監控:free -m + I2C 寫入/讀回圖樣測試
            ├── bmc_monitor_ddr.sh         # ⚠️ 已停用:B/C 內呼叫處已註解,DDR 壓力改走 bgctl + bmc-manager
            │                              #   ↑ 三支都要 chmod +x 才能跑(見 Key Constraints
            └── LTC2980_Margin_Script/     # 電壓 margin 子專案(另有獨立 repo)
                ├── margin.sh              # margin_init/status/set/apply_profile/save
                ├── settings/*.conf        # 一個 .conf = 一顆 LTC2980CB + SWB0/1 × CONN13~16
                ├── profiles/*.conf        # 16-ch 批次組合(comboA/B、high3/5、low3/5、normal、off
                ├── script/*_all.sh        # 跨 9 顆 LTC2980 的批次 status / apply / save
                ├── Ref/margin_command_trace.md  # 指令追蹤參考(SWB 章節已標過期,見文件內警告)
                └── logs/                  # margin 操作 log
                #  註:v2.6.0 起不再內含 blanton_cb_i2c.sh / blanton_fpga_pcimem.sh 的複本,
                #      改由 _swb_find_backend 往上層 Blanton_Script/ 找共用版

Data Models

本專案沒有資料庫,「資料模型」是設定檔格式暫存器 / sysfs 語意

1. config.ttl — 全域測試參數(TTL 變數)

project_name  = "Blanton"       ; 專案名,進 log 檔名
strTestcase   = "ENV"           ; 測項名(ENV/EMC/Margin...),進 log 檔名
EN_Margin     = 0               ; 1=跑 margin 掃描, 0=跳過
EN_log        = 1               ; 1=logopen 存檔, 0=不存
FAN_SPEED     = 30              ; 傳給 fan-speed-control.sh 的風扇轉速 (%)
SWB_UNIT0     = 1               ; 這台有 switch unit 0(流量與 wait_init 都依此)
SWB_UNIT1     = 1               ; 這台有 switch unit 1
prompt_login      = "sonic login:"
prompt_sonic      = "admin@sonic:~$"
prompt_sonic_root = "root@sonic:~#"

SWB_UNIT0 / SWB_UNIT1 兩個都是 0 時,wait_init.ttl 直接 bypass、A/B/C 的流量段整段跳過。

Log 檔名規則:<mdir>\Logs\<project_name>_<strTestcase>_<YYYYmmdd-HHMMSS>.log

2. settings/<board>.conf — 一顆 LTC298016 channel

欄位 型別 說明
TRANSPORT string ""/"i2c" = CPU 原生 busi2cset);"swb" = 走 CB FPGA F3 I2C
CB_I2C_CH int TRANSPORT="swb" 時的 FPGA I2C 通道(6/7/8/9
CHIPS[] string[2] "bus:addr"index 0 → CH07、index 1 → CH815
CHIP_PRE_CMD[] / CHIP_POST_CMD[] string[1] mux 切換等前後置指令,; 分隔多筆
CH<n>_VNOM string 標稱電壓("-" = 未使用 / NC
CH<n>_NET string 電路 net name(對照 schematic

Channel 定址:ch / 8CHIPS[] indexch % 8 → LTC2977 PMBus PAGE0x00~0x07)。

SWB 通道與位址對應(2026-08-19 上機驗證,ababb2c):

FPGA I2C 通道 板 / 接頭 LTC2977 位址(lo / hi
Ch6 SWB0 CONN14 / CONN16 CONN14 0x5C,0x5E ; CONN16 0x62,0x64
Ch8 SWB0 CONN13 / CONN15 CONN13 0x5C,0x5E ; CONN15 0x62,0x64
Ch7 SWB1 CONN14 / CONN16 CONN14 0x5C,0x5E ; CONN16 0x62,0x64
Ch9 SWB1 CONN13 / CONN15 CONN13 0x5C,0x5E ; CONN15 0x62,0x64

同一顆 LTC2980 的兩個位址相差 27-bit,由規格書 8-bit 配對除以 2 而來),不是 1。 兩張板共用一條通道,所以同通道上的位址必須互斥 —— 上表兩組(0x5C/0x5E0x62/0x64)不重疊。

全通道 net / 電壓對照:docs/LTC2980_channel_map.csv9 個 .conf × 16ch = 144 列, 欄位 Board,CONN,Ch,NetName,Vnom)。查「某個 net 在哪片哪個 channel」比翻 9 個 .conf 快。 CSV 是產出物,不是正本 —— 改完 .conf./tools/gen_channel_map.sh 重產,別手改 CSV。 兩件從表上看得出來、改 .conf 時要記得的事:

  • SWB0 與 SWB1 的 net / 電壓完全相同,差別只在 CHIPS[] 的 bus0: vs 1:)與 CB_I2C_CH。 也就是說有兩份會各自漂移的重複資料 —— 改了 SWB0 沒改 SWB1,不會有任何東西擋你。
  • 8 個 NC 通道SWB0/1 CONN14 的 CH10/CH11/CH13、CONN15 的 CH10)在 CSV 裡以 NC / - 原樣保留,不是漏掉;濾掉它們會讓 page 編號對不上。

3. profiles/*.conf — 16-ch 批次 margin 組合

PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... )   # "channel:operation:change_percent"
operation PMBus OPERATION(0x01) 說明
high 0xA8 Margin high
low 0x98 Margin low
nominal 0x80 回標稱值(跟隨 VOUT_COMMAND
off 0x00 關閉輸出

4. FPGA / I2C 暫存器語意(工具庫依賴)

區塊 位置 關鍵欄位
CB F0 local cb_fpga 0 0xD90 RST_CAUSE_REG0xD94/0xD98 = SWB0/SWB1
CB F3 I2C(每 ch 0x20 stridebase 0x300 +00/04 PRSCL, +08 CTRL(b7 MOD_EN), +0C TX/RX, +10 CMD/STAT, +14 MUX_SEL, +18 RST, +1C SEM
CB F3 VI2Cbase 0x780ICB/PDB 同上,但 +1C 無 SEM
I2C CMD STA=0x80 STO=0x40 RD=0x20 WR=0x10 NACK=0x08 IACK=0x01
I2C STAT RX_ACK=0x80(1=NACK) BUSY=0x40 ARB_LOST=0x20 TIP=0x02 INT=0x01
Prescale @75MHz 0x88 = 100 kHz、0x24 = 400 kHz

5. 錯誤計數 sysfs(判定依據)

類別 路徑 判定
PCIe AEREP + 上游 RP 都要看) /sys/bus/pci/devices/<BDF>/aer_dev_{correctable,nonfatal,fatal} test 前後差值 > 0 即 failcorrectable 需依 spec 設門檻)
DDR EDAC /sys/devices/system/edac/mc/mc0/rank<0-3>/dimm_{ce,ue}_count UE > 0 直接 failCE 依門檻

Blanton PCIe 拓樸對照show_pcie_error_reg_*.ttl 的來源):

裝置 Endpoint BDF Upstream Root Port
TH6 SWB0 0000:01:00.0 0000:00:01.1
TH6 SWB1 0000:02:00.0 0000:00:01.2
CB FPGA F0~F3 @ 0000:03:00.x 0000:00:01.5
BMC 0000:03:00.0 0000:00:01.4
I210 1G NIC 0000:07:00.0 0000:00:02.4
NVMe SSD 0000:06:00.0 0000:00:02.1

⚠️ BDF 是 per-unit 的,而且只解決了一半。 blanton_fpga_pcimem.shV1.5.0 起)已改為 source 時自動偵測,不再需要每台改檔: 掃 sysfs 找 vendor == 0x1590HPE)且 .0~.3 四個 function 都有 resource0 的裝置 → 退回 lspci -Dnn 名稱比對 → 再退回 FPGA_BDF_FALLBACK0000:03:00)。 偵測結果會印一行 [INFO] CB FPGA BDF = ...,並存在 FPGA_BDF_ACTIVE。 換 DUT 後可用 fpga_rescan 重測,或 FPGA_BDF=0000:05:00 fpga_rescan 手動釘住。

utils/show_pcie_error_reg_*.ttl 裡的 BDF 仍然是寫死的(上表那 7 組), 自動偵測完全沒有涵蓋到它們。換 DUT 時這些 TTL 還是要人工校對,否則 AER 會讀到錯誤的裝置 ——甚至讀到不存在的路徑而整段 No such file or directory


Key Features

模組 進入點 功能
Script APre-test 1_Blanton_Script_A.ttl V1.0.7 root 登入 → date -s 對時 → 清 job log → hw-test-session start設定風扇轉速等資料面就緒wait_init.ttl)→ DUT 清單(boot/version/fwutil/syseeprom/ssdhealth/TPM/NVMe)→ BMC enroll + version/status → source bash 工具 → 清/讀 7 組 PCIe AER + ras-mc-ctl --summarylspci → margin → PMON → dmesg → 10G/1G 管理網路 ping → 100G uplink 設定與狀態 → 一輪流量基線show uptime
Script BStress 2_Blanton_Script_B.ttl mlucas-avx2 -cpu 0:15 + bgctl runmemtester / SSD / USB 壓力 + BMC DDRbmc-manager run memtester)→ BMC USB net test(探測 cdc_ncm 介面,systemd-run 掛 4 小時 ping)→ 啟動 mgmt ping 監控 → jobs / bgctl list → traffic(依 SWB_UNIT)→ while 1 每輪完整 PMON + margin
Script CPost-test 3_Blanton_Script_C.ttl kill $(jobs -p) + bgctl stop --all / reset + 停 BMC USB unit 與 mgmt ping → PMON + dmesg → 7 組 AER + ras-mc-ctl → BMC USB journalctlip -s link show eth0/eth1cat mlucas log → traffic stop + report → NVMe 健康 → show reboot-cause / uptimejob log 複製到 USB(帶時戳)hw-test-session finish
SWB loopback 流量 blanton_traffic_linespeed <sub> [-u 0|1|all] initVLAN 30..137,成對 cdN/cdN+32)→ clearstarttx 100 length=512)→ stopreportper-pair TX/RX 交叉比對 PASS/FAIL);另有 pslink/speed)與 run(一條龍)
FPGA 暫存器存取 cb_fpga <fn> <addr> [data]fpga_rescan pcimem 打 resource0 + BAR 相對 offset32-bit wordBDF 於 source 時自動偵測;pmc/icb/swb0/swb1_fpga 走 VSPI 窗口
CB I2C / PMBus cb_i2c_init/scan/read/writecb_pmbus_read/write/linear16 FPGA F3 OpenCores master讀用 Repeated STARTSMBus/PMBus 裝置必需)
ICB / PDB 存取 vi2c_init/scan/read/writevi2c_scan_all CB F3 VI2C proxy~3.3 ms/reg,取代 VSPI 的 ~18 ms/reg(後者會踩 SMBus 2535 ms timeout
溫度 temp_cb / temp_icb / temp_all TMP7512-bit 左靠齊 ×0.0625)、TMP432(含 RANGE bit 的 64 偏移、remote1/2
電源資料 pwr_data / pwr_data_pdb / pwr_pdb_id SWB VRM 全軌 Vin/Vout/Iout/Temp 對齊表;MP29816 解析度執行期從 MFR_VOUT_SCALE_LOOP,不寫死
電壓 Margin margin_init/status/set/apply_profile/save + *_all.sh 9 顆 LTC2980CB CONN13、SWB0/1 CONN13~16)批次 high/low margin 與狀態掃描。v2.6.0 起 SWB 路徑真正接上共用 cb_i2c 後端,並有 margin_swb_info/probe/scan/reset/sem 除錯包裝
管理網路 ping mgmt_ping_monitor.sh {start|stop|status|fg|tail|clear|summary} 一輪 = 10G leg + 1G leg,各自 ip address/route replaceping -I <if> 打自己的對端;兩張卡都保持 up。每 leg 記 ip -s link show 與該卡的 TX/RX packet delta,另出一行可 grep 的 RESULT
BMC 監控 bmc_monitor.sh {start|stop|status|fg|tail|clear} 由 host 端 bmc-manager run 週期取樣 free -m,另加一組 I2C 寫入/讀回圖樣測試bus 1、addr 0x41、offset 0x00C0,寫 55AA55AA 讀回、再寫 AA55AA55 讀回)。B 啟動、C 停止並 cat log/bmc_poll.log
BMC DDR 壓力 bmc_monitor_ddr.sh ⚠️ 已停用 —— B/C 內呼叫處已註解,改由 bgctl run bmc-manager run memtester 取代。檔案保留未刪
100G PRBS port_prbs_monitor.sh {start [both|a|b]|stop|status|report|clear} 兩個 uplink 各一個 worker,可同時或單獨跑。setuplpmode offprbs setprbsstat STArt)→ 週期 prbs get(判定)+ prbsstat Ber(只記錄)→ teardownSTOp + prbs clear)。輸出含 PRBS OK! 才算 PASS。⚠️ A/B/C 的呼叫目前註解掉
USB 目標偵測 usb_target.sh [-o dev|mnt|both|id] [-n] [-r sec] 找出插入的 USB 儲存裝置,排除 //host 的底層碟(本平台可能從 USB DOM 開機),多顆時拒絕猜;掛載時會驗證真的可寫
打包交付 publish/publish.sh [-v Ver] [-f] [-z] [-n] 版號讀 Script A 檔頭,複製成 publish/Script_ABC_Blanton_<Ver>/,排除 *.log,可另出 zip

Data Flow

一輪完整測試(端到端)

[測試員] 開 Tera Term,連 COM<n>Control → Macro → 1_Blanton_Script_A.ttl
    │
    ▼
Script A ── logopen Logs/Blanton_Margin_<ts>.log ──┐  (之後所有畫面都進這個檔)
    │                                              │
    ├─ 登入 admin → sudo -i → root@sonic:~#         │
    ├─ date -s "<host 時間>"   ← 讓 DUT 時戳可對照
    ├─ rm /host/hw-eval/jobs/*   ← 清掉上一輪的 job log
    ├─ hw-test-session start / log / status
    ├─ 風扇:max31790 unbind→sleep→bind18-0020 與 25-0020 各一次)
    │        → fan-speed-control.sh <FAN_SPEED> → 回答 y 確認   │
    ├─ source 6 個 bash 工具(函數進 shell)         │
    │    └ 此時 blanton_fpga_pcimem.sh 印出 [INFO] CB FPGA BDF = ...(自動偵測結果)
    ├─ AER 基線:7 組 EP+RP 的 correctable/nonfatal/fatal
    ├─ lspci -tvvv / -vv       ← 拓樸 + link speed/width
    ├─ margin_status_all       ← 9 顆 LTC2980 × 16ch 的 Vout 與偏差%
    ├─ show platform × 9       ← fan/temp/psu/voltage/current/ssdhealth/leak status/leak channels
    ├─ dmesg -T(合併 error 正則 + i2c 過濾)→ dmesg -C 清空 ← C 只會看到 soak 期間新產生的
    ├─ mgmt pingstart → pause 45 → stop → cat log      ← 10G/1G 各一輪
    ├─ 100G uplinklpmode off → 兩埠 startup → config save → show interfaces status
    ├─ 一輪流量基線:ps → init → clear → show → start → stop → report
    └─ show uptime
  (最前面還有 wait_init.ttl:輪詢 show platform temperature 直到不再回報
    "Thermal Not detected",避免 pmon 還沒起來就抓基線)
    ▼
[messagebox "Start Script B"] ← 人工確認後手動跑 B
    │
    ▼
Script B ── 同一個 log 檔續寫(logwrite 分隔線)
    ├─ 背景程序:mlucas-avx2(CPU) ×1, stress_mem ×5, stress_ssd, stress_usb  → 共 8 個 job
    │     stress_hhmd / stress_pcie 已於 2026-08-17 移除,見 Status 表 ScriptB #5/#7 "KC Remove"
    ├─ bgctl run: memtester 1G / qfx5252-stress-ssd / qfx5252-stress-usb
    ├─ BMC: bmc-manager run memtesterDDR)、cdc_ncm 介面探測 + systemd-run 4hr pingUSB
    ├─ mgmt_ping_monitor.sh start
    ├─ jobs / bgctl list        ← 確認全部起來了
    ├─ traffic: ps → init → clear → (pause 15) → show → start  unit 0 與 1VLAN 30..137 loopback
    └─ while 1: setup_pmon9 項)→ margin_status_all          soak 期間持續取樣)
    ▼
[測試員 Ctrl-C / 停止 macro,接著跑 C]
    │
    ▼
Script C
    ├─ kill $(jobs -p)          ← 收掉所有背景壓力
    ├─ show platform × 9 + dmesg  ← 收工快照
    ├─ AER 再抓一次              ← 與 Script A 基線相減 = 本輪新增錯誤
    ├─ bgctl stop --all / reset、systemctl stop BMC USB unit、mgmt ping stop
    ├─ journalctl BMC USB unit、ip -s link show eth0/eth1、ras-mc-ctl --summary
    ├─ cat mlucas_amm_log       ← CPU 壓力程式自身的 pass/fail
    ├─ nvme smart-log / smartctl -x /dev/nvme0
    ├─ traffic: stop → report   ← per-pair TX/RX 交叉比對,PASS/FAIL/NAexit 2 = 有 FAIL/NA
    ├─ show reboot-cause / show uptime  ← soak 期間有沒有意外重開,一眼看得到
    ├─ usb_target.sh -o dev → sync → mount <dev> /mnt/usb
    ├─ cp bmc_poll.log / mgmt_ping.log → jobs/,再 cp -r jobs/ /mnt/usb/jobs-<YYYYmmdd>_<HHMM>
    └─ hw-test-session finish
    ▼
[messagebox "GOOD JOB! Test Case DONE"] → 人工檢查 log

硬體讀值路徑(以「讀一顆 SWB VRM 的 Vout」為例)

pwr_data
  └→ cb_pmbus_read <ch> <slave7> 0x8B 2        (blanton_cb_i2c.sh)
       └→ _cbi2c_xfer_readSTA+WR(slave|W) → WR(reg) → Sr + STA+WR(slave|R)
                            → RD(ACK) → RD(NACK)+STO             ← Repeated START
            └→ cb_fpga 3 <0x300 + ch*0x20 + reg>                  (blanton_fpga_pcimem.sh)
                 └→ pcimem /sys/bus/pci/devices/0000:03:00.3/resource0 <off> w [data]
                      └→ CB FPGA BAR0 → F3 I2C master → SCL/SDA → MP29816/MP2985B
  └→ 解碼:MP2985B = 1 mV/LSBMP29816 = 由 MFR_VOUT_SCALE_LOOP(0x29) bit[12:10] 決定
           Vin 一律 31.25 mV/LSB(÷32

Key Constraints & Business Rules

  1. A → B → C 必須依序跑,且 B 之後才能跑 C。 Script B 的背景 job 只存在於那個 shell session Script C 的 kill $(jobs -p) 依賴同一個 session;中途斷線就得手動收程序。
  2. A / B / C 共用同一個 log 檔:只有 Script A logopenB / C 用 logwrite 續寫分隔線。 跑 B/C 前若關掉了 Tera Termlog 就斷了。
  3. PCIe AER 的判定是「差值」不是「絕對值」Script A 抓基線、Script C 抓結果, 兩者相減才是本輪產生的錯誤。EP 與上游 Root Port 兩邊都要看(錯誤可能只記在 RP)。
  4. BDF 是 per-unit 的,bash 端已自動偵測、TTL 端仍寫死blanton_fpga_pcimem.sh V1.5.0 起 於 source 時自掃(vendor 0x1590lspci → fallback),但 utils/show_pcie_error_reg_*.ttl 的 7 組 BDF 還是硬編碼,換 DUT 仍需人工校對(見 Data Models §5 註)。
  5. ICB / PDB 一律走 VI2C,不走 VSPIVSPI ~18 ms/reg 會讓 I2C byte 相之間拉到 ~50 ms 踩中 SMBus 2535 ms timeout,裝置會 NACK register pointer。實測全 5 通道掃描 9.4 s vs 34.0 s。
  6. I2C 讀一律用 Repeated START(不是 STOP + START):PMBus / SMBus 裝置(VRM、EFUSE) 只吃 Sr;只有純暫存器裝置兩種都行。
  7. margin_saveSTORE_USER_ALL)會永久寫進 NVM,斷電保留。測試流程中絕不執行 以免覆蓋客戶出廠 config。margin.sh 的 auto-enable 只改 RAMON_OFF_CONFIG),斷電復原。
  8. 操作硬體電壓有損壞 DUT 的風險:套 profile 前先確認該軌 OV/UV limit 與 servo DAC 注入電阻 有 populate(本板部分 margin 電阻標 PROTO,沒 populate 的軌電壓不會動)。
  9. ARB_LOST 不等於裝置存在vi2c_scan 只看 RX_ACK,仲裁失敗會被誤報成「有裝置」。 blanton_pwr_data.sh 因此加了 ARB_LOST-aware retry 與 plausibility window 0xFFFF 或超出範圍一律回 NA)——寧可 NA 也不要印出一個看起來像數據的錯值
  10. bcmcmd 成功退出不代表指令成功BCM shell 拒絕指令(VLAN: ERROR: Entry exists / Failed to execute the diagnostic command)時 bcmcmd 仍 exit 0。 blanton_traffic_linespeed.sh 因此改用輸出比對($TL_ERR_PAT),並把 vlan createEntry exists(重跑 init)與 vlan removenot found(init 前先 stop) 當良性情況分開計數。另外 bcmcmd 一律以 </dev/null 執行 —— 否則它會吃掉 while 迴圈的 stdin,導致只有第一個 VLAN 被設定V0.3.1 修的 bug)。
  11. DUT 密碼不得進 git1_Blanton_Script_A.ttl 目前的 sendln "YourPaSsWoRd" 是 placeholder 實際帳密必須放 secret/config_secret.ttlgitignored)並由 config.ttl include。
  12. .sh / .conf 必須是 LFCRLF 的 shell script 在 SONiC 上直接掛 -bash: $'\r': command not found + syntax error near unexpected token), settings/*.conf 則因為是被 source 的,未加引號的賦值會變成 "6\r"(安靜地壞掉)。 .gitattributes 已把 *.sh *.conf *.py *.txt *.md 釘成 LF、*.ttl 維持 CRLF。 ⚠️.gitattributes 不會回頭重寫既有工作區檔案 —— 早於它 clone 出來的目錄, 需 git rm --cached -r . && git reset --hard 或刪掉目錄重新 checkout 才會生效, 而且 git status 乾淨不代表磁碟上是 LF--renormalize 只在進 index 的路上轉換)。
  13. bmc_monitor*.sh / mgmt_ping_monitor.sh 需要執行權:它們是本專案「被執行」而非被 source 的腳本, 而 do_start 內部是 setsid "$SCRIPT_PATH" __daemon即使用 bash x.sh start 呼叫 也仍需 exec bit。git 記錄為 100644,且 Windows → 隨身碟 → DUT 的路徑無法攜帶權限位元, 所以佈署後要先 chmod +x ~/Blanton_Script/bmc_monitor*.sh,否則 Script B 的 start 會 Permission denied、Script C 的 cat 撲空(BMC 段全空但不會報錯)。
  14. TTL 的 timeout 是全域的,設了就要還原timeout = N 之後每一個 wait 都被限制在 N 秒, 逾時的 wait 會直接返回而沒吃到 prompt,於是下一個指令在前一個還沒跑完就送出,之後整輪錯開一拍。 wait_init.ttl 設 60 後還原 0Script B 的 cdc_ncm 探測設 15,在 :skip_ping(兩條路徑的匯流點)還原。 加新的 timeout 時務必配一個 timeout = 0
  15. 兩張管理網卡同網段時會 ARP fluxmgmt_ping_monitor.sh 讓 eth0/eth1 同時 up,若兩者在同一個 /24(本專案預設 192.168.1.99 / .101),對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張, 量到的數字不能歸屬。ARP_STRICT=1 會設 arp_ignore=1 / arp_announce=2 擋掉; 另外每個 leg 的 RESULT 行帶 nic_tx / nic_rx(該卡自己的 packet delta), ping 成功但 nic_tx 接近 0 就代表封包從另一張卡出去了。兩張卡在不同網段時可設 0。
  16. 客戶 NDAdocs/ 內含客戶 FPGA 規格與 schematic 衍生資訊,本 repo 只推 NAS + Gitea 絕不推 GitHub

Security Considerations

項目 做法
DUT console 帳密 集中在 secret/config_secret.ttlgitignored),config.ttlinclude 載入。repo 內只留 secret/config_secret.ttl.example,敏感欄位一律 __CHANGE_ME__
secret/ 資料夾 本機 / 現場敏感資料集中地:DUT 帳密、per-unit BDF 覆寫、COM port 設定、客戶提供的未公開附件。.gitignoresecret/* + !secret/README.md + !secret/*.example + !secret/.gitkeep除 README 與 .example 外全部忽略
客戶機密文件 docs/ 內 FPGA 規格(docx/xlsx/md)屬客戶 NDA 範圍;schematic 原始檔(*.DSN)一律 gitignore,不進 repo
Remote 限制 只推私有 remotenasgit.et-wen.com:51222+ giteaetgit.et-wen.com)。不設 GitHub origin
測試 log logs/*.log 含 DUT 序號、MAC、韌體版本等可識別資訊 → gitignore,只保留目錄結構(.gitkeep
破壞性硬體指令 margin_save / STORE_USER_ALL 為永久 NVM 寫入,工具預設不呼叫;批次腳本 margin_save_all.sh 在 README 與腳本頂端都有警語
root 權限 全流程在 root@sonic:~# 下執行(pcimem / i2c 需要);腳本不留任何 chmod 777 或放寬權限的動作
For_AI/ AI 協作素材(截圖、草稿筆記)整個資料夾 gitignore,避免不小心把客戶圖面帶進 repo

Build & Setup Steps

無編譯。從零到能跑一輪測試:

# ── 0. 取得專案(開發機 / 測試 NB)────────────────────────────
git clone ssh://ETHouseNAS@git.et-wen.com:51222/volume1/git/Blanton_TTL_Script.git
cd Blanton_TTL_Script

# ── 1. 準備帳密(不進 git)──────────────────────────────────
cp secret/config_secret.ttl.example secret/config_secret.ttl
#   編輯 secret/config_secret.ttl,填入實際 DUT 帳密(取代 __CHANGE_ME__

# ── 2. DUT 端:部署 bash 工具庫 ─────────────────────────────
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT_IP>:~/
#   佈署後務必補執行權(Windows/隨身碟路徑帶不動 exec bit):
ssh admin@<DUT_IP> 'chmod +x ~/Blanton_Script/bmc_monitor*.sh'
#   若曾在舊工作區編輯過,先確認沒有 CRLFgrep -rlU $'\r' ~/Blanton_Script
ssh admin@<DUT_IP> 'sudo -i'
#   (現場無網路時改用 USB 隨身碟複製到 ~/Blanton_Script

# ── 3. DUT 端:煙霧測試(跑 Script A 之前先手動確認)──────────
source ~/Blanton_Script/blanton_fpga_pcimem.sh
#   → 會印 [INFO] CB FPGA BDF = 0000:0X:00.0-.3 (resource0)   ← BDF 自動偵測,不用改檔
#   偵測錯或多顆候選時:FPGA_BDF=0000:05:00 fpga_rescan
cb_fpga 0 0xD90                     # RST_CAUSE_REG,讀得到值 = BAR 通了
source ~/Blanton_Script/blanton_cb_i2c.sh
cb_i2c_init 11 && cb_i2c_scan 11    # Ch11 風扇控制器,應看到 0x20
source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh
margin_init Blanton_CB_CONN13 && margin_status
source ~/Blanton_Script/blanton_traffic_linespeed.sh
blanton_traffic_linespeed ps -u 0            # 對照線的 link/speed
blanton_traffic_linespeed init -u 0 -n       # -n = dry-run,先看要下哪些 bcmcmd

# ── 4. DUT 端:校對 AER 的 BDF(自動偵測沒涵蓋這裡!)─────────
lspci -Dnn                          # 對照 ARCHITECTURE.md 的 PCIe 拓樸表
#   與 src/Script_ABC_Blanton/utils/show_pcie_error_reg_*.ttl 內寫死的 7 組 BDF 比對,
#   不符就改 TTL——否則 AER 會讀到別的裝置或不存在的路徑

HostWindows)端:

1. 安裝 Tera Term 5.x
2. 把 src\Script_ABC_Blanton\ 整包複製到本機(路徑不要有空白與非 ASCII)
3. 在該資料夾下建立 Logs\ 目錄(Script A 的 logopen 需要)
4. Tera Term 連上 DUT COM port(預設 115200-8-N-1
5. Control → Macro → 選 1_Blanton_Script_A.ttl
6. A 跑完出現 messagebox → 手動跑 2_Blanton_Script_B.ttlsoak
7. Soak 時間到 → 停止 B 的 macro → 跑 3_Blanton_Script_C.ttl
8. 檢查 Logs\Blanton_Margin_<ts>.log

打包交付:

./publish/publish.sh          # 版號讀 Script A 檔頭 → publish/Script_ABC_Blanton_V1.0.3/
./publish/publish.sh -z       # 另外產出同名 .zip
./publish/publish.sh -n       # dry run,只印會做什麼
./publish/publish.sh -f       # 覆蓋既有輸出資料夾

版號不是參數而是從 Script A 的 ; Version : Vx.y.z 讀出來的,所以資料夾名不可能跟 測試員打開 macro 看到的版本不一致。要出新版就先改 Script A 檔頭再跑。 輸出會排除 *.log(測試 log 含 DUT 序號,不隨交付外流),但保留空的 logs/logopen 寫入。

註:本專案非 .NET / Blazor / EC2 架構,aws-ec2-deployvbox-run-deploy 兩份部署指南不適用,已跳過。


Development Phases

現況基準:docs/TTL_Script_Blanton_Status_20260814.xlsx 已逐項標記 OK / On-Going 以下 Phase 直接把該表的 On-Going 項目排進來,並補上工程化(版控、密碼外移、打包)的缺口。

Phase 1 — 版控化 + 密碼外移(工作量:S)

目標: 專案進 git(NAS + Gitea),帳密不再躺在腳本裡,任何人 clone 下來照文件就能跑。

包含:

  • git init + .gitignoresecret/*For_AI/logs/*.log~$**.DSN
  • secret/README.md + secret/config_secret.ttl.example__CHANGE_ME__ placeholder
  • config.ttl 改為 include "..\..\secret\config_secret.ttl"(或現場放同層), 把 1_Blanton_Script_A.ttlsendln "YourPaSsWoRd" 換成 sendln dut_password ← 唯一未完成項;密碼目前仍寫在腳本裡
  • src/Script_ABC_Blanton/logs/.gitkeep,既有 Blanton_Margin_20260814-164122.log 移出 repo
  • CLAUDE.md + ARCHITECTURE.md 進 repopush nas + gitea不推 GitHub

驗收條件: 在另一台機器 git clone → 填 secret/config_secret.ttl → Script A 能完整登入並產生 log git log -p 中搜不到任何實際密碼。


Phase 2 — Script A 補完:Check History + Margin 驗收(工作量:M

目標: Script A 的基線資料補齊到「開機原因 + 全部電壓軌」都有紀錄,Status 表的兩個 On-Going 轉 OK。

包含:

  • 新增 utils/show_reset_cause.ttlcb_fpga 0 0xD90RST_CAUSE_REG)、 cb_fpga 0 0xD94SWB0)、cb_fpga 0 0xD98(SWB1),並在註解貼上 bit 定義 (來源 docs/Blantons_FPGA_Registers.md §5 RST_CAUSE_REG
  • Script A 的 ; ========== Check History ========== 區塊改 include 上面這支
  • utils/show_margin_status.ttl:清掉已註解的 per-conf 舊寫法,只留 margin_status_all.sh;確認 9 顆 LTC2980 都能掃到(含 SWB 的 TRANSPORT="swb" 路徑)
  • 新增 utils/show_pwr_data.ttlpwr_data + pwr_data_pdb)與 utils/show_temp_sensor.ttltemp_all),把 blanton_pwr_data.sh / blanton_temp_sensor.sh 真正接進流程(目前 Script A 只 source 沒用)
  • Script A 開頭加 BDF 自檢 —— 由 blanton_fpga_pcimem.sh V1.5.0 的 source 時自動偵測達成, log 內會出現 [INFO] CB FPGA BDF = ...(比原本規劃的 lspci 一行更完整)

驗收條件: 跑一次 Script Alog 內同時含 reset cause 三個暫存器值、9 顆 LTC2980 × 16ch 的 margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,且無 ERR / NA 以外的異常。


Phase 3 — Script B 壓力層穩固化(工作量:M)

目標: 壓力程序起得來、起不來看得出來,soak 迴圈有時戳、可控週期。

包含:

  • 前置檢查:~/hammer/tools/amd/mlucas-avx2 仍是唯一還依賴 hammer 的項目,缺檔就別往下跑
  • 壓力程序 log 加時戳,避免多輪覆蓋: mlucas_amm_log~/logs/mlucas_amm_log_$(date +%Y%m%d-%H%M%S).logStatus 表 ScriptB #2 的既定寫法)
  • 壓力層改用平台的 bgctlmemtester / qfx5252-stress-ssd / qfx5252-stress-usb), 取代 ~/hammer/tools/stress_*.pyScript B 以 jobs + bgctl list 兩者並列確認
  • bgctl list 之後加數量驗證,不符時 messagebox 提示(目前只印出來給人看) ← V1.0.10 起 bgctl list + jobs 改為每輪都印,中途死掉的 job 看得到,但仍要靠人眼比對
  • soak 迴圈改為「每輪先 date、跑完 pause <間隔>」, 把 EN_LoopInterval(預設 600 秒 = 10 min)放進 config.ttl,兌現 Status 表的「Get data every 10mins」 ← V1.0.10 已補上 pause 60(迴圈不再全速空轉),但 60 秒是寫死的、也還沒有每輪 date 距 Status 表的 10 分鐘仍有差距,故本項未結
  • soak 每輪補 show platform psustatus / voltage / current —— 迴圈已改為 include "utils/setup_pmon.ttl",九項全收
  • ; ========== CLEAR EVENT ==========Status 表 ScriptB #1Owner: Alan
  • BMC 納入 soakbmc_monitor.shfree -m 取樣)與 bmc_monitor_ddr.shmemtester 由 Script B 啟動、Script C 停止並把 log 併進 master log
  • Script A 加開機資訊與就緒等待:show boot、BMC /etc/issuewait_init.ttl
  • Script C 加 show reboot-cause / show uptimesoak 期間意外重開看得見

驗收條件: Script B 啟動後 jobs 顯示 8 個 job;連續跑 3 輪,log 內三段各自帶正確時戳且間隔 ≈10 min; 故意把 ~/hammer 改名,Script B 會在前置檢查就停下並提示。


Phase 4 — Traffic 與 SONiC 介面資料(工作量:M)

目標: 補齊 Status 表中 Owner=Alan 的三個 traffic 項目,讓測試涵蓋交換晶片的資料面。

📌 實作路線與原規劃不同:原本設想用 SONiC CLIsonic-clear counters / show interface counters), 實際落地的是更底層的 bcmcmd drivshell 路線 —— SWB 實體 loopback 線 + VLAN 成對配置 + tx burst 直接讀 ASIC 的 MIB_TPOK/MIB_RPOK。好處是能做 per-pair 雙向交叉比對(cdA.TX == cdB.RX), 比 SONiC CLI 的單向 counter 強得多;代價是綁定 Broadcom SDK 與那條 loopback 線。

包含:

  • blanton_traffic_linespeed.shV0.4.0):init / clear / show / start / stop / ps / report / rununit 0 與 1VLAN 30..137 對應 cdNcdN+32 (取代原規劃的 utils/traffic_setup.ttl
  • per-pair TX/RX 報表與 PASS/FAIL 判定:DUT 上 awkreport+ 離線 tools/bcm_mibpair_report_V1.1.0.py,同版面同判定規則 (取代原規劃的 utils/show_traffic_counters.ttl
  • Script B 接上 ps → init → clear → show → start、Script C 接上 stop → report
  • 原始 bcmcmd 指令表留檔:tools/traffic_loopback_{vlan_setting,start,vlan_remove}.txt
  • Script A 的流量基線 —— 原本的空區塊已改成完整一輪 ps → init → clear → show → start → stop → report,含 15 秒沉澱)
  • utils/show_interface_detail.ttlshow interface transceiver eeprom/domshow interface link-trainingStatus 表 ScriptC #4,仍 On-Going
  • utils/show_tech.ttlshow techsupportScript C 收工快照,Status 表 ScriptC #4
  • config.ttlEN_Traffic 旗標,未接 loopback 線的站點可整段跳過 (現在 B/C 是無條件執行,沒接線會整批 bcmcmd 失敗)
  • -u 0 已從三支腳本移除,全部沿用工具預設 TL_UNITS="0 1",兩塊 switch board 都測到
  • 100G uplink 狀態:show interfaces status Ethernet513,Ethernet514A 與 B 各一次)

驗收條件: EN_Traffic=1 時,Script C 的 report 印出 108 對的 TX/RX 表且全 PASS 拔掉一條 loopback 線重跑,該對顯示 FAIL 或 NA 且 exit code 為 2EN_Traffic=0 時整段不執行且不報錯。


Phase 5 — Log 解析與自動判定(工作量:L)

目標: 不用人眼掃幾 MB 的 console log,跑完自動吐一張 PASS/FAIL 摘要。

包含:

  • tools/parse_blanton_log.py:吃 Logs/*.log,切出 ScriptA / ScriptB / ScriptC 三段 (靠 logwrite##### 分隔線)
  • AER / EDAC 差值計算:抽出 A 與 C 兩次的 aer_dev_*dimm_{ce,ue}_count,輸出增量表, UE > 0 或 fatal/nonfatal > 0 直接標 FAIL
  • Margin 表解析:把 9 顆 × 16ch 的 Vout / 偏差% 收成 CSV,標出超出 ±(profile 設定值 + 容差) 的軌
  • 溫度 / 風扇 / 電源趨勢:soak 期間逐輪取樣 → CSV(可直接畫圖)
  • Stress 判定:mlucas_amm_logbgctl 各工作的 log /host/hw-eval/.../qfx5252-stress-{ssd,usb}.log)的錯誤關鍵字掃描
  • Traffic 判定:直接複用 tools/bcm_mibpair_report_V1.1.0.py(它已能吃 console log 的 show c 段落並輸出 PASS/FAIL),不要重寫一套解析
  • 管理網路判定:抓 mgmt_ping_monitor.shRESULT 行(已是單行可 grep 格式), 並檢查 nic_tx/nic_rx 不為 0 —— 否則 PASS 也不能歸屬到那張卡
  • NVMe / EDACnvme smart-logsmartctl -xras-mc-ctl --summary 的前後差值
  • 產出 Logs/<run>_summary.md:一頁 PASS/FAIL + 每個子系統一行結論

驗收條件: 拿一份既有 log(如 Blanton_Margin_20260814-164122.log)跑解析器, 產出 summary 與 CSV;人工植入一筆假的 dimm_ue_count=1 後,summary 正確翻成 FAIL。


Phase 6 — 打包、Runbook 與交付(工作量:S)

目標: 產出可直接交給現場測試員(或客戶)的一包,含操作手冊,不需要看原始碼。

包含:

  • publish/publish.sh:把 src/Script_ABC_Blanton/ 打包成 publish/Script_ABC_Blanton_<Ver>/-z 另出 zip)。版號讀 Script A 檔頭, 排除 *.log 但保留空的 logs/。工具本身進 git,產出被 gitignore
  • README.md(現場用):Tera Term 設定、A→B→C 操作順序、常見錯誤(BDF 不符、 margin 掃不到、hammer 工具缺檔)與對應處理
  • CHANGELOG.md:延續三支腳本頂端的 Version History,集中成一份
  • 三支腳本的 header 版號與 CHANGELOG.md 對齊,config.ttlscript_version 並寫進 log 開頭
  • docs/TTL_Script_Blanton_Status_*.xlsx 更新為全 OK,或把剩餘項目移進 Future Extensions
  • 打 git tag v1.1.0push nas + gitea

驗收條件: 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C 並產出 summarypublish/ 內容與 git tag 一致。


Future Extensions

  • Script B 的 eye measurementStatus 表 ScriptB「Take one round of eye measurement on uplink ports」 目前是空區塊,待 TH6 SDK 的 eye scan 指令確認後補上。
  • PDB 電源轉換值驗證blanton_pwr_data.sh 的 PDB 段落在第一台 DUT(COM39)因 ch4 仲裁問題無法驗證, COM36 才拿到部分結果;READ_VIN 已知不是真的輸入電壓(跟隨 READ_VOUT)。待拿到 brick 的 MFR_ID/MFR_MODEL 後對照 datasheet 定案。
  • show_pcie_error_reg.ttl 淘汰:舊的合併版已被 7 支 per-device 版取代,確認無人引用後刪除。
  • BDF 自動偵測 —— 已於 blanton_fpga_pcimem.sh V1.5.02026-08-17)完成。 下一步是把同樣的偵測結果餵給 utils/show_pcie_error_reg_*.ttl 讓 AER 那 7 組 BDF 也不用手改(目前仍是硬編碼)。
  • stress_hhmd / stress_pcie 的替代:兩者已於 2026-08-17 移除,I2C/PCIe 的持續讀取壓力 目前沒有替代品。若仍需覆蓋這塊,可考慮用 blanton_cb_i2c.sh / cb_fpga 寫一支輕量 loop。
  • SSH / 網路模式:目前全走 COM console。若 DUT 管理網路可用,可改用 plink/ssh 執行同一組 bash 工具,速度與可靠度都比 serial 好,TTL 只保留開機階段。
  • 多 DUT 併行:多台 DUT 同時 soak 時,Tera Term 每台開一個 macro window 可考慮改成 Pythonpyserial)統一排程與集中收 log。
  • margin 子專案的重複檔 —— v2.6.0 已移除內含的 blanton_cb_i2c.sh / blanton_fpga_pcimem.sh 複本,改由 _swb_find_backend 往上層找共用版,漂移風險解除。 與獨立 repo LTC2980_Margin_Script 的同步機制(submodule 或 vendored 腳本)仍待評估。
  • Ref/margin_command_trace.md 需重新產生SWB 章節的 1223 條 cb_pmbus_* 指令是依 修正前的通道/位址展開的(其中 487 條用到已不存在的 0x5D/0x5F/0x63/0x65), 文件已加過期警告但內文未動。第 1~4 章不受影響。
  • wait_init.ttl 沒有逾時出口:若 pmon 一直起不來,result 既非 1 也非 2,迴圈會無限重試, Script A 既不往下走也不報錯。可加最大重試次數 + messagebox 提示。
  • 腳本的執行權mgmt_ping_monitor.shbmc_monitor.sh(以及已停用的 bmc_monitor_ddr.sh)需人工 chmod +x。 可在 Script B 起它之前補一行(比照既有的 chmod +x ~/hammer/tools/amd/mlucas-avx2),或在 publish 時處理。
  • bmc_monitor_ddr.sh 已停用:B/C 內的呼叫已註解,DDR 壓力改由 bgctl run bmc-manager run memtester 取代。檔案還留在 repo,待確認不再需要後刪除,或在檔頭標註停用。 (bmc_monitor.sh 已於 2026-08-25 重新啟用,並加上 I2C 寫入/讀回圖樣測試。)
  • rm /host/hw-eval/jobs/* 清不掉子目錄Script A 用的是不帶 -rrm,但 Script C 是 cp -r 那個目錄,代表裡面可能有子目錄。清不乾淨的話,上一輪的 job log 會被當成這輪的一起 複製到 USB。要確認 bgctl 的產出結構,必要時改成 rm -rf .../jobs/*
  • 100G PRBS 尚未接進 A/B/Cport_prbs_monitor.sh 已隨包交付、可手動執行,但三支腳本裡的呼叫 都還註解著(bring-up 中)。要啟用時記得 PRBS 期間 link 會顯示 downstop 之後才會回來。
  • Script C 的 USB 掛載走 mount 而非 usb_target.sh -o mnt:目前是 -o dev 取節點再自己 mount <dev> /mnt/usb,繞過了工具內建的 mkdir -p、exfat/ntfs modprobe 與可寫性驗證。 掛載點不存在、檔案系統模組沒載、或媒體唯讀時只會失敗一行,job log 就沒帶出來。
  • 風扇確認提示是無限等待wait "Set all configured fan channels to" 之後才 sendln "y" 若該版 fan-speed-control.sh 不再詢問(或字串改了),這個 wait 會永遠等下去,Script A 停在那裡 且不報錯。加個 timeout + 分支會比較保險(記得還原 timeout = 0)。
  • TR518 內建封包測試尚未腳本化tools/TR518.txt 記下了 tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 這組指令(含 port all lb=mac + l2 learn off 前置), 目前只能手貼。它與 blanton_traffic_linespeed 是兩條互斥的打流路線(都會動 loopback 與 L2 學習), 要腳本化的話得先決定兩者怎麼共存,不能同時跑。
  • settings/ 裡 SWB0 與 SWB1 是兩份相同的資料8 個 .conf 中,SWB1 的四個除了 CHIPS[] 的 bus 與 CB_I2C_CH 之外,net name 與 VNOM 與 SWB0 逐欄相同(見 docs/LTC2980_channel_map.csv)。 改一邊忘了改另一邊不會有任何警告。可考慮改成「共用 net 定義 + 各自的 transport 覆寫」兩層檔案。
  • Script C 沒有倒出 mgmt_ping.logC 會 stop 管理網路監控並印 ip -s link show 但沒有 cat ~/Blanton_Script/log/mgmt_ping.log,所以整個 soak 期間累積的 per-leg RESULT 留在 DUT 上、沒進 master log。Script A 那輪基線有 cat