STEP 1586 Rev 1 root cause diagnostic

STEP: 1590 / Date: 2026-08-30 / Type: Phase C 13 diagnostic / Status: ★ silicon verify 完了 (programming transient 仮説 完全確定)

★★ 結論 (silicon verify 済): STEP 1574 generator の counter reset-comparison pattern に bug なし。 STEP 1586 Rev 1 の LED 点滅せず 現象は 一時的な programming transient (bitstream valid、 FPGA に load されず) と silicon 実機で 確定

Rev 1 rebuild bitstream (UserCode 0x0000B4BF) を Nano 9K に program → fs↔programmed UserCode 一致 ✅ + LED ~0.5 Hz 点滅 (藤本さん目視)。

⚠ STEP 1586 への corrigendum: 「STEP 1574 generator の oscillator stub に bug」 との 記述は 推定に基づいた誤り。 実際は programming transient の 可能性が高い。 code 修正は 不要、 defensive practice (post-program UserCode 検証) 追加のみ 推奨。

証拠 table

項目STEP 1586 Rev 1 (失敗)Rev 1 rebuild (本 STEP)Rev 2 (成功)STEP 1038 (成功)
Source Verilogcounter reset-comparison同一 (byte-for-byte)free-running counterfree-running counter
Build 成功
Resource (LUT/FF/CLS)35/26/1935/26/1926/25/1525/24/15
fs //UserCode:(上書き済不明)0x0000B4BF ★0x0000F6750x0000A5F4
Programmed User Code0x00000000(未 program)0x0000F6750x0000A5F4
UserCode fs ↔ programmed❌ 一致せず✅ 一致✅ 一致
Status Code0x000354210x0003F0200x0003F020
LED 動作(未 program)

Reasoning

  1. Rev 1 を 別 dir で byte-for-byte 同一 source から rebuild → LUT/FF/CLS が STEP 1586 Rev 1 と 完全一致 = build 再現性 OK
  2. Rebuild bitstream の //UserCode: header = 0x0000B4BF (非零 valid checksum)
  3. STEP 1586 で 元 program した Rev 1 bitstream も (fs は上書き済で確認不能だが) 同じく valid UserCode を持っていたはず (source 同一、 build 決定的)
  4. それにもかかわらず programmed User Code が 0x00000000 だった = FPGA SRAM に bitstream data が実際に到達しなかった = configuration 失敗
  5. この時点で 「User code mismatch」 warning が出ていた が、 progress bar 100% で 見落とし → LED 動作せず と 判明

Netlist 検証 (Rev 1 rebuild)

DFFR (Gowin sync-reset D-FF) が 25 個生成、 RESET input は 25-bit comparator LUT chain の 出力 n24_4 に接続、 DFFE local_tick の CE 入力も 同じ n24_4。 これは Verilog の期待どおり合成:
DFFR local_counter_0_s0 (
    .Q(local_counter[0]),
    .D(n51_6),
    .CLK(clk_d),       // ← generic routing (TA1132 warning、 Rev 2/STEP 1038 と同じ)
    .RESET(n24_4)      // ← comparator output (== 26_999_999 で fire)
);

DFFE local_tick_s1 (
    .Q(output_pulse_d),
    .D(n77_5),         // ← ~local_tick
    .CLK(clk_d),
    .CE(n24_4)         // ← 同じ comparator output
);
∴ synthesized design は 「正しい silicon 動作の期待」 を持つ。

Programming transient の 可能性

「User code mismatch」 warning は 実は critical signal: fs header の UserCode と programmed User Code が異なる = configuration 失敗。 progress bar 100% だけを見て信頼してはいけない。 STEP 1586 で 私 (Claude) が この signal を 軽視した (「cosmetic warning」 と 判断)。 これが 本 STEP の 主 lesson。

Silicon retest 課題 (defer to 次回 Nano 9K 接続 session)

STEP 1574 generator への影響

Defensive practice 追加提案 (defer to 別 STEP)

# programmer_cli 実行後、 UserCode diff 自動 verify
FS_USERCODE=$(grep "UserCode:" impl/pnr/*.fs | awk '{print $NF}')
PROG_OUTPUT=$(programmer_cli --device GW1NR-9C --cable-index 1 --run 2 --fsFile impl/pnr/*.fs 2>&1)
PROG_USERCODE=$(echo "$PROG_OUTPUT" | grep "User Code is:" | awk '{print $NF}')

if [ "$FS_USERCODE" != "$PROG_USERCODE" ]; then
    echo "★ Configuration MAY have failed: fs=$FS_USERCODE prog=$PROG_USERCODE"
    echo "  Retry recommended"
    exit 1
fi

Files