Files
Blanton_TTL_Script_Diag/ARCHITECTURE.md
T
etwenandClaude Opus 5 318e656744 docs(arch): Add ARCHITECTURE and CLAUDE, init repo
Bring the Diag-OS variant of the Blanton A/B/C Tera Term scripts under
version control, alongside the SONiC-based Blanton_TTL_Script.

- ARCHITECTURE.md: Diag OS flow, acc_* command taxonomy, swutil addressing,
  TH6 test sequence side effects, and a 6-phase roadmap
- CLAUDE.md: stack, per-script command inventory, conventions, footguns
- .gitattributes: keep .ttl as CRLF (Windows-only), LF for everything else
- .gitignore: secret/, For_AI/, *.log, publish/ output
- secret/: README + config_secret.ttl.example for per-unit overrides
- Logs/ and utils/ placeholders (logopen needs Logs/ to pre-exist)

Known gaps documented, not fixed here: 2_Blanton_Script_B.ttl includes
utils/show_margin_status.ttl which does not exist yet, and its while loop
has no pause despite the "every 10mins" comment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoEiorvuhmdTkpZWtEhJwq
2026-08-18 22:45:07 +08:00

34 KiB
Raw Blame History

ARCHITECTURE — Blanton TTL Script (Diag)

Overview

Blanton_TTL_Script_Diag 是 BlantonProject Helios)交換器平台在 Diag OS(ODM 出貨的診斷映像, 非 SONiC)下的產線 / 工程驗證自動化腳本組。 測試工程師在 Windows 端用 Tera Term (TTL macro) 透過 COM port 連上 DUT 的 diag console (提示字元 root@(none):~#),由 A / B / C 三支腳本依序把整套 acc_* 診斷指令跑過一輪,全程自動存 log。

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

Script 階段 做什麼
1_Blanton_Script_A.ttl Inventory / Functional sweep 開 log → 韌體版本、EEPROM、I2C/PCIe 列舉、DDR/SSD/USB/BMC/TPM/RTC/NFC 功能測、溫度風扇、100G port、BER/FEC/FDR、TH6 診斷
2_Blanton_Script_B.ttl Stress / Soak 起 CPU / DDR / SSD / USB 壓力與流量,之後進 while 1 迴圈週期取數(目前僅 margin,其餘為空區塊)
3_Blanton_Script_C.ttl Post-test / Verdict 殺掉壓力程序、收工取數、比對 PCIe error counter 與流量 counter(目前全為空區塊)

與姊妹專案 Blanton_TTL_ScriptSONiC 版)最大的差異在取數能力的來源

Blanton_TTL_ScriptSONiC 本專案(Diag
DUT OS SONiCDebian-based NOS ODM Diag OSbusybox 風格,root@(none)
取數層 自寫的 bash 工具庫pcimem → FPGA I2C/VI2C → VRM/溫感) Diag image 內建的 acc_* 指令集 + swutil
登入 sonic login: → admin → sudo -i(要密碼) 直接就是 root(無登入互動)
交換晶片 bcmcmd drivshell swutil(含 dsh -c 轉發 drivshell
腳本內容 TTL + bash 兩層 純 TTL 一層

使用者:硬體 / 系統驗證工程師(ETWen、KC、Alan)與產線測試員。 核心價值:把 Diag OS 下數十條要人工逐條敲、且每條輸出都要留存的診斷指令, 壓縮成「開 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 portdiag console115200-8-N-1
DUT OS ODM Diag OSbusybox/Linuxprompt root@(none):~#,直接 root
DUT 診斷指令集 內建 acc_* 家族(見 Data Models §2+ swutil + onie-syseeprom
交換晶片存取 swutilTomahawk6 / TH6*: = all unit、1: = unit 1dsh -c 轉發 drivshell
系統韌體資訊 versionacc_misc_version {bios,i210,mac}acc_pld utilacc_bmc_board info
板級 EEPROM onie-syseeprom -t cpuONIE TLV 格式)
錯誤 / 健康資料源 acc_dram_cpu chkeccacc_fs_ssd selftestacc_misc_liquid info(漏液)、acc_temp_thermal
高速鏈路驗證 acc_net_mac {100G,ber,fec,fdr}swutil *:ps cd100init.sh
Log Tera Term logopenappend + plain text + timestamp
版本控制 GitNAS + GiteaGitea 端本 repo 設為 public,見 Security Considerations

⚠️ 無編譯步驟。 TTL 是直譯執行,「build」等同「把 src/Script_ABC_Blanton_Diag/ 整包複製到 Tera Term 的工作目錄,並確認同層有 Logs\ 資料夾」。


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_diag / EN_* 旗標)     │
│            │                                                 │
│            └─→ include "utils/*.ttl"  (可重用取數片段)        │
│                                                              │
│   logopen → Logs\Blanton_Margin_<ts>.log  (整段 console 存檔) │
└───────────────────────┬──────────────────────────────────────┘
                        │ COM portsendln "<cmd>" / wait prompt_diag
                        ▼
┌──────────────────────────────────────────────────────────────┐
│  DUT — Diag OS console  (root@(none):~#)                     │
│                                                              │
│   acc_misc_*   version / liquidBIOS/I210/MAC 版本、漏液)   │
│   acc_pld_*    util cbCB CPLD/PLD 暫存器)                  │
│   acc_pwr_mon  show d2d(電源監控)                           │
│   acc_iai_*    i2c device / pcie device(匯流排列舉)         │
│   acc_dram_cpu info / rw / chkeccDDR                      │
│   acc_bmc_*    board/iai/net/fs/dram/e2pBMC 子系統)        │
│   acc_fs_*     ssd info|rw|selftest / usb rw(儲存)          │
│   acc_scy_*    tpm / nfc(安全元件)                          │
│   acc_net_*    cpu traffic mgmtp / mac 100G|ber|fec|fdr       │
│   acc_temp_thermal ddr|cpu|sensor ; acc_cool_fan speed        │
│   acc_time_rtc test ; acc_led_*LED,目前註解未啟用)        │
│   onie-syseeprom -t cpu                                       │
│   100init.sh100G 埠初始化)                                 │
└───────────────────────┬──────────────────────────────────────┘
                        │ swutil*: = all unit, 1: = unit 1
                        ▼
┌──────────────────────────────────────────────────────────────┐
│  Tomahawk6 (TH6) 交換晶片 × 2 unit                            │
│   swutil *:ps cd            埠狀態 / link / speed             │
│   swutil *:port cd en=0|1   埠 down/up(重新協商)            │
│   swutil -C -r              重新載入設定並重啟                │
│   swutil [1:]dsh -c 'tr NN' Broadcom drivshell 內建測試       │
│                                                              │
│  設定檔:/usr/local/bin/config.ymlAUTO: 0→1               │
│          /usr/local/bin/extphy_init_LT.soc(測試時改名停用)  │
└──────────────────────────────────────────────────────────────┘

Project Structure

Blanton_TTL_Script_Diag/
│
├── CLAUDE.md                          # 專案記憶 & 給 Claude 的指令
├── ARCHITECTURE.md                    # 本架構文件
├── .gitignore                         # secret/ + For_AI/ + logs 規則
├── .gitattributes                     # 換行符政策(.ttl 保持 CRLF、.sh/.md 一律 LF
│
├── docs/                              # 規格與狀態文件(客戶提供 / 專案產出)
│   └── .gitkeep                       #   ← 待放:Diag 指令手冊、逐項 Status 表
│
├── tools/                             # Host / 離線端輔助腳本
│   └── .gitkeep                       #   ← 待放:log 解析器(Phase 5
│
├── secret/                            # 🚫 gitignored — COM 設定、per-unit 覆寫、未公開附件
│   ├── README.md                      # ✅ committed — 用途索引
│   ├── config_secret.ttl.example      # ✅ committed — 現場參數範本(__CHANGE_ME__
│   └── config_secret.ttl              # 🚫 實際值,由 config.ttl include(尚未接線)
│
├── For_AI/                            # 🚫 gitignored — AI 協作素材(截圖、草稿)
│
├── publish/                           # 可交付的打包輸出(Blanton_Script_ABC_Diag_v<ver>_<date>/ + zip
│
└── src/
    └── Script_ABC_Blanton_Diag/       # ← Tera Term 的工作目錄(整包給測試員)
        │
        ├── config.ttl                 # 全域設定:testcase 名、EN_Margin / EN_log、prompt_diag
        ├── 1_Blanton_Script_A.ttl     # Inventory + 功能掃描(目前唯一實作完整的一支)
        ├── 2_Blanton_Script_B.ttl     # Stress / soak(骨架,區塊多為空)
        ├── 3_Blanton_Script_C.ttl     # Post-test 判定(骨架,區塊多為空)
        │
        ├── utils/                     # 可 include 的取數片段(TTL,無狀態、只 wait+sendln
        │   └── show_margin_status.ttl # ⚠️ Script B 已 include**檔案尚未建立**Phase 1
        │
        └── Logs/                      # Tera Term logopen 輸出(*.log gitignored

Data Models

本專案沒有資料庫,「資料模型」是設定檔格式Diag 指令的命名語意 / 回傳格式

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

strTestcase   = "Margin"            ; 測項名,進 log 檔名
project_name  = "Blanton"           ; 專案名,進 log 檔名
EN_Margin     = 1                   ; 1=Script B 迴圈內跑 margin 取數, 0=跳過
EN_log        = 1                   ; 1=logopen 存檔, 0=不存
prompt_diag   = "root@(none):~#"    ; Diag OS 的 shell 提示字元(所有 wait 的依據)

Log 檔名規則:<mdir>\Logs\<project_name>_<strTestcase>_<YYYYmmdd-HHMMSS>.log mdirgetdir 取得 = macro 所在資料夾;Logs\ 必須先存在logopen 不會自建)。

logopen filename 0 1 1 1 的四個旗標依序為:binary=0(文字)、append=1、plain text=1、timestamp=1。

2. acc_* 指令命名語意(Diag OS 指令集)

Diag image 內建的指令一律是 acc_<domain>_<device> <subcommand> [args]

domain 涵蓋範圍 本專案用到的指令
misc 雜項 / 版本 / 液冷 acc_misc_version {bios,i210,mac}acc_misc_liquid info
pld CPLD / PLD acc_pld util cb 0 0x0CB PLD,起始位址 0x0
pwr 電源監控 acc_pwr_mon show d2d
bmc BMC 子系統 acc_bmc_board infoacc_bmc_iai i2c_deviceacc_bmc_net usb_pingacc_bmc_fs spi_testacc_bmc_dram rwacc_bmc_e2p bmc_r
iai 匯流排 / 介面列舉(Inventory Access Interface acc_iai_i2c deviceacc_iai_pcie device
dram 主記憶體 acc_dram_cpu {info,rw,chkecc}
fs 儲存裝置 acc_fs_ssd {info,rw,selftest short}acc_fs_usb rw
scy 安全元件 acc_scy_tpmacc_scy_nfc test
net 網路 / MAC acc_net_cpu traffic mgmtpacc_net_mac {100G,ber,fec,fdr}
temp 溫度 acc_temp_thermal {ddr,cpu,sensor}
cool 散熱 acc_cool_fan speed 30(設定 30% duty
time 時間 acc_time_rtc test
led 指示燈 acc_led_sysacc_led_mgmtportScript A 內目前全部註解掉

高速鏈路測試的參數形式:

指令 參數 說明
acc_net_mac ber -m berproj -p all -m 模式、-p BERbit error rate)測試,全埠
acc_net_mac fec -p all -p FEC 錯誤計數
acc_net_mac fdr -m fdr -u all -m 模式、-u unit FDRForward Data Rate / 廠商定義)測試,全 unit

3. swutil 定址語法(TH6 交換晶片)

形式 意義
swutil *:<cmd> 所有 switch unit 下指令
swutil 1:<cmd> 只對 unit 1 下(不加前綴 = unit 0
swutil *:ps cd port statuscd 為埠群組(100G/400G cd 系列)
swutil *:port cd en=0 / en=1 埠 disable / enable(用來強制重新協商)
swutil -C -r 重新載入設定(config.yml)並 reset
swutil [1:]dsh -c '<drivshell cmd>' 把指令轉發給 Broadcom drivshell

Tomahawk6 測試段落會先改兩個檔再重載:

sed -i 's/AUTO: 0/AUTO: 1/g' /usr/local/bin/config.yml        # 開啟自動協商
mv /usr/local/bin/extphy_init_LT.soc /usr/local/bin/extphy_init_LT.temp  # 停用外部 PHY LT 初始化
swutil -C -r                                                   # 重載設定
swutil    dsh -c 'tr 39'   # unit 0 內建測試 39
swutil 1: dsh -c 'tr 39'   # unit 1 內建測試 39
swutil    dsh -c 'tr 55'   # unit 0 內建測試 55

⚠️ tr <n> 的實際測項定義尚未在本 repo 留檔(來自 Broadcom SDK 的內建 test suite 編號)。 待取得 SDK 文件後補進 docs/,否則 log 裡只會看到編號、看不出測了什麼。 ⚠️ 這段有副作用且不會自動還原config.ymlsed -i 就地改寫、 extphy_init_LT.soc 被改名。跑完這段的 DUT 已不是出廠設定, 下一輪測試(或交機)前必須手動復原。

4. 判定資料源(目前散在 log 裡,尚未自動化)

類別 來源指令 判定
DDR ECC acc_dram_cpu chkecc 有 UE 直接 failCE 依門檻
SSD 健康 acc_fs_ssd selftest short / info selftest 非 pass 即 fail
漏液 acc_misc_liquid info 任一 channel 觸發即 fail(液冷平台最高優先)
溫度 acc_temp_thermal {ddr,cpu,sensor} 超出板規上限即 fail
鏈路 acc_net_mac ber / fecswutil *:ps cd BER 超門檻、FEC 不可修正錯誤 > 0、link 未達標速
PCIe / I2C 列舉 acc_iai_pcie deviceacc_iai_i2c device 裝置數量 / 位址與 golden list 不符即 fail

目前這些全靠人眼看 log。Phase 5 的 tools/parse_blanton_diag_log.py 就是要把上表變成自動判定。


Key Features

模組 進入點 功能
Script AInventory + 功能掃描) 1_Blanton_Script_A.ttl logopen → 版本/PLD/電源監控/BMC board info → 漏液 → ONIE EEPROM → I2C/PCIe 列舉 → DDR info/rw/chkecc → BMC 六項(I2C/USB net/SPI/DRAM/EEPROM)→ SSD 三項 → TPM → USB → MGMT traffic → 溫度三項 → 風扇 → RTC → NFC → 100G init + MAC → 埠 down/up + 狀態 → BER / FEC / FDR → TH6 tr 測試
Script BStress / Soak 2_Blanton_Script_B.ttl 目前只有骨架:logwrite 分隔線 + while 1 迴圈,迴圈內依 EN_Margin include margin 取數。CPU/DDR/SSD/USB 壓力、eye measurement、traffic start 皆為空區塊
Script CPost-test 3_Blanton_Script_C.ttl 目前只有骨架:logwrite 分隔線 + 結尾 messagebox。kill process、取數、PCIe error counter、stress 結果、traffic counter 皆為空區塊
共用設定 config.ttl 三支腳本開頭 include,集中管理 testcase 名、EN_* 旗標、prompt_diag
Log 一體化 Script A logopen A 開檔,B / C 用 logwrite 續寫分隔線 → 一輪測試一個 log 檔

Data Flow

一輪完整測試(端到端)

[測試員] 開 Tera Term,連 COM<n> (115200-8-N-1)Control → Macro → 1_Blanton_Script_A.ttl
    │
    ▼
Script A ── logopen Logs\Blanton_Margin_<ts>.log ──┐  (之後所有畫面都進這個檔)
    │                                              │
    ├─ flushrecv                 ← 清掉開檔前殘留的 console 輸出
    ├─ Inventoryversion / bios / PLD / i210 / mac / pwr_mon / bmc board
    ├─ 漏液:acc_misc_liquid info            ← 液冷平台,出事就不用往下測了
    ├─ EEPROMonie-syseeprom -t cpu
    ├─ 列舉:acc_iai_i2c device / acc_iai_pcie device
    ├─ DDRinfo → rw → chkecc
    ├─ BMCi2c_device / usb_ping / spi_test / dram rw / e2p bmc_r
    ├─ 儲存:ssd info/rw/selftest short、usb rw
    ├─ 安全:tpm、nfc
    ├─ MGMTacc_net_cpu traffic mgmtp
    ├─ 環境:thermal ddr/cpu/sensor、fan speed 30、rtc test
    ├─ 100G100init.sh → acc_net_mac 100G
    ├─ 埠:ps cd → port en=0 → en=1 → (pause 60) → ps cd     ← 等重新協商
    ├─ 鏈路品質:ber → fec → fdr
    └─ TH6config.yml AUTO 改 1 → 停用 extphy LT → swutil -C -r
             → dsh 'tr 39'(u0) → 'tr 39'(u1) → 'tr 55'(u0)
    ▼
[目前 Script A 結尾沒有 messagebox,跑完不會提示接 Script B]   ← Phase 2 待補
    │
    ▼
Script B ── 同一個 log 檔續寫(logwrite '##### ScriptB START #####'
    ├─ (待實作) CPU / DDR / SSD / USB 壓力、uplink eye measurement、traffic start
    └─ while 1: if EN_Margin=1 → include "utils/show_margin_status.ttl"
                                   ↑ ⚠️ 此檔尚未建立,目前跑到這裡會失敗
                                   ↑ ⚠️ 迴圈內無 pause,不是註解說的「每 10 分鐘」
    ▼
[測試員停止 B 的 macro,接著跑 C]
    │
    ▼
Script C ── logwrite '##### ScriptC START #####'
    ├─ (待實作) kill process / take data / PCIe error counter / stress 結果 / traffic counter
    └─ messagebox 'GOOD JOB! Test Case DONE'
    ▼
[人工檢查 Logs\Blanton_Margin_<ts>.log]

單一取數步驟的執行模型

wait prompt_diag          ← 等上一條指令跑完、shell 把提示字元吐回來
sendln "<diag command>"   ← 送下一條
   │
   └→ 畫面上出現的所有回應,被 logopen 的 log 直接吃進檔案

這個「先 waitsendln」的節奏是全專案唯一的同步機制 —— 沒有回傳值解析、沒有 exit code、 沒有逾時保護。因此:

  • 判定完全靠事後看 log(或 Phase 5 的解析器)。
  • wait 沒有 timeout 就是無限等:長時間指令(acc_fs_ssd selftestacc_net_mac beracc_dram_cpu rw)若在 DUT 上掛住,macro 會永遠停在那一行,且畫面上看不出是「還在跑」還是「死了」。

Key Constraints & Business Rules

  1. A → B → C 必須在同一個 Tera Term session 依序跑。 只有 Script A 會 logopen B / C 是 logwrite 續寫;中途關掉 window,log 就斷了(未來 B 的背景程序也會跟著沒了)。
  2. Logs\ 資料夾必須先存在。 logopen 不會自動建目錄,缺了就整支 macro 在第一步失敗 —— 而且因為還沒開 log,失敗現場不會留下任何紀錄。
  3. prompt_diag = "root@(none):~#" 是全專案的同步基準。 Diag image 換版、hostname 被設定、 或 shell prompt 客製化,整組腳本會全部卡在第一個 wait。換 image 先確認這一行。
  4. Diag OS 沒有登入互動。 開機直接是 root,所以本專案(不同於 SONiC 版)沒有帳密要藏 secret/ 存在是為了 per-unit 的 COM port / 埠清單 / 客戶未公開附件。
  5. wait 沒有逾時保護。 現行腳本任何一條指令 hang 住,macro 就無限等待。 長時間項目(SSD selftest、BER、DDR rw)在 Phase 2 要加 timeout 與逾時分支。
  6. TH6 段落會改 DUT 的檔案且不還原sed -iconfig.ymlAUTO: 0AUTO: 1、 把 extphy_init_LT.soc 改名成 .temp跑完的 DUT 不是出廠狀態,交機或下一輪測試前要手動復原。
  7. acc_cool_fan speed 30 會把風扇壓到 30%,之後腳本沒有還原成自動控制。 在高負載 / 高室溫環境下連著跑 Script B 的 soak 有過熱風險 —— 測完要確認風扇回到 auto。
  8. swutil *:port cd en=0 會把埠打掉。 若 DUT 的管理流量走這些埠(而不是 MGMT port), 遠端連線會斷。現場只用 COM console 時沒問題,改用 SSH 操作時要特別注意。
  9. 漏液檢查(acc_misc_liquid info)優先於一切。 這是液冷平台,漏液屬於會弄壞硬體的等級, Script A 把它排在很前面就是這個理由;判讀為異常時應直接中止測試,不要繼續往下跑。
  10. utils/show_margin_status.ttl 目前不存在,但 2_Blanton_Script_B.ttl 已經 include 它。 這是已知的 broken referencePhase 1 修)——EN_Margin=1 時 Script B 會失敗。
  11. Diag 版與 SONiC 版是兩套獨立腳本,不共用檔案。 兩邊的 config.ttl 同名但內容不同 (prompt 不一樣),不要互相複製;共通的只有「A/B/C 三段式 + logopen/logwrite」這個慣例。

Security Considerations

項目 做法
DUT 帳密 Diag OS 直接是 root、無登入互動,本 repo 不含任何帳密。日後若 image 加上登入,一律放 secret/config_secret.ttlgitignored),由 config.ttl includerepo 內只留 .example__CHANGE_ME__
secret/ 資料夾 本機 / 現場敏感資料集中地:COM port 設定、per-unit 埠清單與 BDF 覆寫、客戶提供的未公開附件。.gitignoresecret/* + !secret/README.md + !secret/*.example + !secret/.gitkeep除 README 與 .example 外全部忽略
測試 log Logs/*.log 含 DUT 序號、MAC、韌體版本、ONIE EEPROM 內容等可識別資訊 → gitignore,只保留目錄結構(.gitkeep
客戶機密文件 docs/ 內若放入客戶提供的 diag 指令手冊 / schematic 衍生資訊,屬 NDA 範圍;schematic 原始檔(*.DSN)一律 gitignore
Remote 與可見性 nasgit.et-wen.com:51222+ giteaetgit.et-wen.com)。本 repo 在 Gitea 上依指示設為 public —— 因此 docs/ 放客戶文件前務必再確認一次,可公開的東西才進 repo。GitHub 不設 origin
破壞性指令 acc_dram_cpu rwacc_bmc_dram rwacc_fs_ssd rwacc_fs_usb rw 都是寫入測試sed -i config.ymlmv extphy_init_LT.soc 會改動 DUT 設定。這些只能對測試機執行,絕不可對客戶已上線的機器跑
For_AI/ AI 協作素材(截圖、草稿筆記)整個資料夾 gitignore,避免不小心把客戶圖面帶進 repo

Build & Setup Steps

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

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

# ── 1. 現場參數(不進 git;目前尚未被 config.ttl include,先備而不用)──
cp secret/config_secret.ttl.example secret/config_secret.ttl
#   編輯 secret/config_secret.ttl,把 __CHANGE_ME__ 換成實際值

HostWindows)端:

1. 安裝 Tera Term 5.x
2. 把 src\Script_ABC_Blanton_Diag\ 整包複製到本機(路徑不要有空白與非 ASCII)
3. 確認該資料夾下有 Logs\ 目錄(repo 內已用 .gitkeep 保留;logopen 不會自建)
4. Tera Term 連上 DUT 的 diag console COM port115200-8-N-1
5. 手動按一次 Enter,確認提示字元真的是  root@(none):~#
      不是的話,改 config.ttl 的 prompt_diag,否則整組腳本會卡在第一個 wait
6. Control → Macro → 選 1_Blanton_Script_A.ttl
7. A 跑完 → 手動跑 2_Blanton_Script_B.ttlsoakwhile 1 迴圈,泡到時間到停掉)
      ⚠️ 目前 EN_Margin=1 會因為 utils\show_margin_status.ttl 不存在而失敗,
         未修好前先在 config.ttl 設 EN_Margin=0
8. 停掉 B → 跑 3_Blanton_Script_C.ttl
9. 檢查 Logs\Blanton_Margin_<ts>.log
10. 收工還原:確認風扇回自動控制、config.yml 的 AUTO 與 extphy_init_LT.soc 已復原

DUT 端煙霧測試(跑 Script A 之前先手動敲三條確認):

version                       # 有輸出 = console 通了、diag 環境正常
acc_iai_i2c device            # I2C 列舉,對照 golden list
acc_misc_liquid info          # 漏液狀態,異常就別往下跑

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


Development Phases

現況基準(2026-08-18):Script A 已完整、B / C 只有骨架,且 B 有一個 broken include。 以下 Phase 先把「能穩定跑完一輪」補起來,再往自動判定與交付走。

Phase 1 — 版控化 + 修好 broken reference(工作量:S

目標: 專案進 git(NAS + Gitea),三支腳本能從乾淨 clone 跑起來不報錯。

包含:

  • git init + .gitignoresecret/*For_AI/Logs/*.log~$**.DSN
  • .gitattributes.ttl-text(維持 CRLF),.sh/.md/.py 一律 LF
  • secret/README.md + secret/config_secret.ttl.example__CHANGE_ME__ placeholder
  • src/Script_ABC_Blanton_Diag/Logs/.gitkeeplogopen 依賴這個目錄存在)
  • CLAUDE.md + ARCHITECTURE.md 進 repopush nas + gitea
  • 建立 utils/show_margin_status.ttl —— Script B 已 include 但檔案不存在; 內容為 Diag OS 下對應的 margin 取數指令(SONiC 版是 source margin_status_all.sh Diag 版要先確認有沒有等價的 acc_pwr_* 子指令,沒有就先放 acc_pwr_mon show d2d
  • config.ttlscript_version,並於 Script A 開頭 logwrite 出來 (log 開頭要看得出跑的是哪一版腳本)

驗收條件: 在另一台機器 git clone → 複製 src/Script_ABC_Blanton_Diag/ 到 Tera Term → A / B / C 三支都能載入且不出現「找不到檔案」;git status 乾淨(log 不會被誤加)。


Phase 2 — Script A 穩固化:逾時、分段、交棒(工作量:M)

目標: Script A 不會無聲卡死,log 分段清楚,跑完會提示接 Script B。

包含:

  • Script A 開頭補 logwrite '##### ScriptA START #####' 分隔線 (B / C 都有,只有 A 沒有,log 開頭少一段)
  • 每個測試區塊前加 logwrite 小標題(=== DDR ====== BMC ===…), 讓 Phase 5 的解析器有明確的切段依據
  • 長時間指令加逾時保護:timeout = <秒> + wait prompt_diag 後檢查 result 逾時就 logwrite 標記並 messagebox 提示(acc_fs_ssd selftest shortacc_net_mac beracc_dram_cpu rwacc_bmc_dram rw 這四項優先)
  • Script A 結尾補 messagebox 'Script A DONE — start Script B'(比照 SONiC 版)
  • TH6 段落加還原步驟:測完把 extphy_init_LT.temp 改回 .socconfig.ymlAUTO: 1 改回 0(或至少在結尾 messagebox 提醒人工復原)
  • acc_cool_fan speed 30 之後補一條還原成自動控制的指令(先確認 Diag 的子指令名)
  • 把註解掉的 LED 測試改為由 config.ttlEN_LED 旗標控制(LED 要人眼看, 不是每個站點都跑,但不該用註解來開關)
  • 拆出 utils/:把 Script A 的大區塊(BMC 六項、SSD 三項、溫度三項、 鏈路品質三項)各自抽成 utils/show_*.ttl,主腳本只留 include —— 比照 SONiC 版的分層慣例

驗收條件: 跑一次 Script A,log 內每個區塊都有 === 標題可切段; 故意拔掉 SSD 讓 selftest 卡住,macro 會在逾時後標記並繼續(而不是永遠停住); 跑完跳出 messagebox。


Phase 3 — Script B 壓力層實作(工作量:L)

目標: Script B 從骨架變成真的能 soak:壓力起得來、起不來看得出來、取樣有固定週期。

包含:

  • 確認 Diag OS 上可用的壓力手段(SONiC 版用 ~/hammer/tools/mlucas-avx2 / stress_*.pyDiag image 不一定有)—— 先在 DUT 上盤點,把結論寫進 docs/
  • ; ========== CLEAR EVENT ==========:補上清事件 / 清 counter 的指令
  • AMD CPU stress / DDR stress / SSD rw / USB rw 四個空區塊實作, 並在啟動後印一次「目前跑著哪些背景程序」以供確認
  • ; ========== Take one round of eye measurement on uplink ports ========== 確認 acc_net_macswutil dsh 是否有 eye scan 子指令,補上
  • Traffic START 區塊:接 100init.sh + acc_net_mac 100Gswutil loopback
  • soak 迴圈補 pause EN_LoopIntervalconfig.ttl 新增,預設 600 = 10 分鐘), 每輪開頭先 sendln "date" 留時戳 —— 兌現註解寫的「Get data every 10mins」
  • 迴圈內取數擴充:溫度、風扇、電源監控、漏液、DDR ECC(不是只有 margin

驗收條件: Script B 啟動後能列出所有背景壓力程序;連續跑 3 輪, log 內三段各自帶時戳且間隔 ≈10 分鐘;EN_Margin=0 時整段 margin 跳過且不報錯。


Phase 4 — Script C 收工判定(工作量:M)

目標: Script C 從骨架變成真的能收工:程序收乾淨、資料抓齊、counter 有前後比對。

包含:

  • ; ========== Kill Process ==========:收掉 Script B 起的所有背景壓力 (Diag OS 下的做法要先確認 —— busybox 的 jobs 行為與 SONiC 的 bash 不一定相同)
  • ; ========== TAKE DATA ==========:收工快照(版本、溫度、風扇、電源、漏液、DDR ECC)
  • ; ========== Check PCIE error counters ==========acc_iai_pcie device(或 Diag 提供的 AER 子指令)抓錯誤計數 —— 要與 Script A 的基線相減,看差值不看絕對值
  • ; ========== CHECK Stress results ==========:把 Phase 3 各壓力程式的 log 印出來
  • ; ========== CHECK Traffic counters ==========swutil *:ps cd + MAC counter 與 Script B 啟動時的基線比對
  • 結尾除了 messagebox,再 logwrite 一段收工時戳與「本輪測了哪些項目」清單

驗收條件: 跑完 A→B→Cps 確認沒有殘留的壓力程序; log 內 Script A 與 Script C 的 PCIe / ECC counter 可直接對照相減; messagebox 出現時 log 已完整寫出。


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

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

包含:

  • tools/parse_blanton_diag_log.py:吃 Logs/*.log,靠 #####=== 分隔線 切出 ScriptA / ScriptB / ScriptC 三段與各測試區塊
  • acc_* 指令輸出的解析規則表(一個指令一個 parser,缺 parser 就標 UNPARSED 而不是靜默略過)
  • Counter 差值計算:Script A 與 Script C 的 PCIe error / DDR ECC 相減, UE > 0 或 fatal > 0 直接標 FAIL
  • 鏈路品質判定:BER / FEC 的門檻可設定(放 tools/thresholds.yml),超過標 FAIL
  • soak 期間的溫度 / 風扇 / 電源趨勢 → CSV(可直接畫圖)
  • 產出 Logs/<run>_summary.md:一頁 PASS/FAIL + 每個子系統一行結論

驗收條件: 拿一份實跑的 log 產出 summary 與 CSV 人工在 log 內植入一筆假的 ECC UEsummary 正確翻成 FAIL; 未知輸出格式不會讓解析器崩潰,只會標 UNPARSED


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

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

包含:

  • tools/publish.sh:把 src/Script_ABC_Blanton_Diag/ + 空 Logs/ + secret/*.example 打包成 publish/Blanton_Script_ABC_Diag_v<ver>_<YYYYMMDD>/ 與同名 zip
  • README.md(現場用):Tera Term 設定、A→B→C 操作順序、 常見錯誤(prompt 不符、Logs\ 缺目錄、指令逾時、TH6 設定未復原)與對應處理
  • CHANGELOG.md:延續 1_Blanton_Script_A.ttl 頂端的 Version History,集中成一份
  • docs/ 補齊:Diag 指令手冊(廠商提供)、tr <n> 測項對照、逐項 Status 表
  • 三支腳本的 header 版號與 CHANGELOG.md 對齊
  • 打 git tag v1.0.0push nas + gitea

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


Future Extensions

  • 與 SONiC 版共用 utils 慣例:兩個 repo 的 utils/*.ttl 命名與分層若對齊, 未來寫 log 解析器可以共用一套切段規則(甚至同一支 parser 吃兩種 log)。
  • tr <n> 測項字典:把 Broadcom drivshell 的內建測試編號整理進 docs/ log 裡才看得出 tr 39 / tr 55 到底測了什麼。
  • TH6 設定的自動還原:目前 config.ymlextphy_init_LT.soc 的改動要人工復原, 可寫成 Script C 的收尾步驟,或做成 utils/th6_restore.ttl
  • 產線模式:把 Script A 的功能掃描抽成「快速版」(跳過 BER / selftest 等長時間項目), 用 config.ttlEN_Quick 切換,供產線快篩使用。
  • SSH / 網路模式:目前全走 COM console。若 Diag OS 的 MGMT port 可用, 可改用 plink/ssh 執行同一組指令,速度與可靠度都比 serial 好。
  • 多 DUT 併行:多台同時測時 Tera Term 每台開一個 macro window 可考慮改成 Pythonpyserial)統一排程與集中收 log。
  • Blanton_TTL_ScriptSONiC 版)的測項對照表:同一片硬體在兩種 OS 下各測了什麼、 哪些項目只有其中一邊有 —— 這張表對交機報告很有用。