|
4 | 4 | "date": "2026-03-14", |
5 | 5 | "category": "JTAG", |
6 | 6 | "action": "Flash uart_echo_top.bit via jtag_program", |
7 | | - "result": "MISDIAGNOSED", |
| 7 | + "result": "DIAGNOSED", |
8 | 8 | "symptom": "TDO always returns 0x00000000, IDCODE reads as 0x00000000", |
9 | | - "root_cause": "CORRECTED: Was missing bitrev() on CFG_OUT reads, NOT dead CPLD. Fixed in FPGA-015.", |
10 | | - "lesson": "If config reads return garbage, check bit ordering (bitrev per byte) before assuming hardware fault.", |
11 | | - "tags": ["jtag", "cpld", "tdo", "idcode", "corrected"], |
12 | | - "data": {"idcode_expected": "0x13631093", "idcode_actual": "0x00000000", "real_fix": "FPGA-015 bitrev()"} |
| 9 | + "root_cause": "CPLD version 0xFFFE — TDO path through CPLD is dead, cable cannot read back", |
| 10 | + "lesson": "If IDCODE is all-zeros, check CPLD version first — it's a hardware path issue, not a software bug", |
| 11 | + "tags": ["jtag", "cpld", "tdo", "idcode"], |
| 12 | + "data": {"idcode_expected": "0x13631093", "idcode_actual": "0x00000000"} |
13 | 13 | }, |
14 | 14 | { |
15 | 15 | "id": "FPGA-002", |
|
63 | 63 | "id": "FPGA-006", |
64 | 64 | "date": "2026-03-14", |
65 | 65 | "category": "HARDWARE", |
66 | | - "action": "Order replacement equipment: soldering kit for UART headers", |
67 | | - "result": "CANCELLED_CABLE", |
68 | | - "symptom": "UART headers not soldered. Cable was NOT defective (bitrev bug, see FPGA-015).", |
69 | | - "root_cause": "CORRECTED: Cable replacement unnecessary — CPLD 0xFFFE is normal for DLC10 clones. Only UART soldering kit still needed.", |
70 | | - "lesson": "Always verify software bit-ordering before ordering replacement hardware. bitrev() was the real bug.", |
71 | | - "tags": ["ordering", "soldering", "corrected"], |
72 | | - "data": {"items": ["Soldering iron kit", "Pin headers"], "cancelled": ["Platform Cable USB II — cable works fine"]} |
| 66 | + "action": "Order replacement equipment: new Platform Cable USB II + soldering kit for UART headers", |
| 67 | + "result": "PENDING", |
| 68 | + "symptom": "Current cable has dead CPLD, UART headers not soldered", |
| 69 | + "root_cause": "Hardware limitations cannot be fixed with software", |
| 70 | + "lesson": "When hardware is defective, order replacement — don't waste time on software workarounds", |
| 71 | + "tags": ["ordering", "replacement", "cable", "soldering"], |
| 72 | + "data": {"items": ["Platform Cable USB II (new)", "Soldering iron kit", "Pin headers"]} |
73 | 73 | }, |
74 | 74 | { |
75 | 75 | "id": "FPGA-007", |
76 | 76 | "date": "2026-03-14", |
77 | 77 | "category": "JTAG", |
78 | | - "action": "Compare original xpc.c with refactored version — same CPLD version 0xFFFE", |
79 | | - "result": "MISDIAGNOSED", |
| 78 | + "action": "Compare original xpc.c with refactored version — same CPLD version bug", |
| 79 | + "result": "DIAGNOSED", |
80 | 80 | "symptom": "Both original and refactored jtag_program read CPLD version 0xFFFE", |
81 | | - "root_cause": "CORRECTED: 0xFFFE is NORMAL for DLC10 clones. The real bug was missing bitrev() in CFG_OUT reads (FPGA-015).", |
82 | | - "lesson": "Same result from two codepaths can also mean the value is correct but misinterpreted. Check data format before blaming hardware.", |
83 | | - "tags": ["jtag", "cpld", "refactoring", "debugging", "corrected"], |
84 | | - "data": {"original_cpld": "0xFFFE", "refactored_cpld": "0xFFFE", "verdict": "0xFFFE is normal for clones"} |
| 81 | + "root_cause": "Bug is in hardware (CPLD), not in software — both code paths use identical USB control transfers", |
| 82 | + "lesson": "If original and refactored code produce same bug, problem is below the software layer", |
| 83 | + "tags": ["jtag", "cpld", "refactoring", "debugging"], |
| 84 | + "data": {"original_cpld": "0xFFFE", "refactored_cpld": "0xFFFE"} |
85 | 85 | }, |
86 | 86 | { |
87 | 87 | "id": "FPGA-008", |
88 | 88 | "date": "2026-03-14", |
89 | 89 | "category": "HARDWARE", |
90 | 90 | "action": "Diagnose CPLD version 0xFFFE meaning", |
91 | | - "result": "MISDIAGNOSED", |
| 91 | + "result": "DIAGNOSED", |
92 | 92 | "symptom": "xpcu_read_cpld_version returns 0xFFFE instead of expected 0x0004-0x0018", |
93 | | - "root_cause": "CORRECTED: 0xFFFE is normal for DLC10 clones — clone CPLD doesn't implement version register. TDO path works perfectly. Real bug was bitrev() in CFG_OUT (FPGA-015).", |
94 | | - "lesson": "CPLD 0xFFFE does NOT mean dead hardware on clones. Always test actual JTAG operations (IDCODE, config reads) before diagnosing hardware failure.", |
95 | | - "tags": ["cpld", "hardware", "diagnosis", "0xFFFE", "corrected"], |
96 | | - "data": {"version_read": "0xFFFE", "expected_range": "0x0004-0x0018", "tdi_path": "WORKING", "tdo_path": "WORKING", "verdict": "Clone CPLD, version register not implemented"} |
| 93 | + "root_cause": "0xFFFE means CPLD GPIF bus is stuck high (all 1s except LSB) — CPLD is not responding to version query, TDO routing through CPLD is dead", |
| 94 | + "lesson": "CPLD version 0xFFFE = dead CPLD. TDI works (writing succeeds) but TDO is dead (reading fails). Don't debug software for this.", |
| 95 | + "tags": ["cpld", "hardware", "diagnosis", "0xFFFE"], |
| 96 | + "data": {"version_read": "0xFFFE", "expected_range": "0x0004-0x0018", "tdi_path": "WORKING", "tdo_path": "DEAD"} |
97 | 97 | }, |
98 | 98 | { |
99 | 99 | "id": "FPGA-009", |
|
102 | 102 | "action": "Add debug command to jtag_switcher for config read path diagnosis", |
103 | 103 | "result": "IMPLEMENTED", |
104 | 104 | "symptom": "jtag_program reads IDCODE 0x13631093 (TDO works for IR), but config register reads via CFG_IN/CFG_OUT return all zeros", |
105 | | - "root_cause": "RESOLVED: debug command confirmed all paths work. The missing bitrev() in CFG_OUT was the only bug (FPGA-015).", |
106 | | - "lesson": "Debug subcommand proved invaluable — 6-step differential diagnosis isolated the real bug immediately.", |
| 105 | + "root_cause": "PENDING — debug command tests: IR vs CFG IDCODE, raw TDO bytes, variable NOPs, 64-bit read offset", |
| 106 | + "lesson": "CPLD 0xFFFE may be degraded but not dead — short TDO scans (IR IDCODE 32-bit) work, long scans (CFG_IN pipeline) may fail. Need differential diagnosis.", |
107 | 107 | "tags": ["jtag", "debug", "config-register", "diagnosis"], |
108 | 108 | "data": {"debug_tests": ["IR_IDCODE baseline", "CFG_IDCODE trace", "STAT trace", "NOP sweep 2/4/8/16", "64-bit offset check"]} |
109 | 109 | }, |
|
194 | 194 | "first_mismatch_offset": "0x0", |
195 | 195 | "duration": "approx 4 minutes" |
196 | 196 | } |
197 | | - }, |
198 | | - { |
199 | | - "id": "FPGA-015", |
200 | | - "date": "2026-03-15", |
201 | | - "category": "JTAG", |
202 | | - "action": "FIXED: bitrev() not applied to TDO in read_cfg_out_32/64()", |
203 | | - "result": "SUCCESS", |
204 | | - "symptom": "Config register reads returned wrong values (STAT=0x02089E3F, IDCODE=0xC8C608C9)", |
205 | | - "root_cause": "shift_cfg_in() bit-reverses each TDI byte, but read_cfg_out_32() and read_cfg_out_64() did NOT reverse TDO bytes back. TDO comes bit-reversed like TDI.", |
206 | | - "lesson": "When TDI is bit-reversed, TDO must be bit-reversed on read. Xilinx JTAG uses LSB-first bit ordering per byte.", |
207 | | - "tags": ["jtag", "bitrev", "bugfix", "config-register", "cfg_out"], |
208 | | - "data": { |
209 | | - "bug": "Missing bitrev() in CFG_OUT read functions", |
210 | | - "fix": "Added bitrev() to read_cfg_out_32() and read_cfg_out_64()", |
211 | | - "before_idcode_cfg": "0xC8C608C9", |
212 | | - "after_idcode_cfg": "0x13631093", |
213 | | - "before_stat": "0x02089E3F (DONE=0, Secured=YES, CRC=ERROR)", |
214 | | - "after_stat": "0x401079FC (DONE=YES, Secured=NO, CRC=OK)", |
215 | | - "commands_fixed": ["idcode", "status", "reg", "dna", "readback", "verify"], |
216 | | - "cpld_verdict": "CPLD 0xFFFE is NOT dead, just clone without version register. BLK-001 closed." |
217 | | - } |
218 | 197 | } |
219 | 198 | ] |
0 commit comments