docs: record EXI_J4 J4-header EXI merge + measured seed sweep
4/8 seeds pass capture, best seed 8 = 63.09 MHz (+17% margin) — same pass rate as the default build, so the AND-merge costs no measurable timing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -228,6 +228,43 @@ RX + 2 KB TX buffer at reset (`RMSR/TMSR=0x55`), so socket-3 frames are stored
|
|||||||
in the chip independently — no extra FPGA buffer needed. Register addresses are
|
in the chip independently — no extra FPGA buffer needed. Register addresses are
|
||||||
still datasheet-from-memory — **confirm at hardware bring-up**.
|
still datasheet-from-memory — **confirm at hardware bring-up**.
|
||||||
|
|
||||||
|
### EXI on the J4 debug header (`EXI_J4=1`) — bench host without SP1
|
||||||
|
|
||||||
|
`EXI_J4=1` lets a bench host (the Pi) drive EXI through the unpopulated J4
|
||||||
|
header instead of the SP1 edge connector. It does NOT repin the EXI resource —
|
||||||
|
it **merges** a second set of pads onto the existing ones, so SP1 stays live and
|
||||||
|
the default build is unchanged:
|
||||||
|
|
||||||
|
| J4 | DBG | FPGA pin | EXI |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | — | — | GND |
|
||||||
|
| 2 | DBG0 | 9 | CLK (in) |
|
||||||
|
| 3 | DBG1 | 10 | MOSI (in) |
|
||||||
|
| 4 | DBG2 | 11 | MISO (out) |
|
||||||
|
| 5 | DBG3 | 12 | CS_N (in) |
|
||||||
|
| 6 | DBG4 | 6 | INT_N (out) |
|
||||||
|
|
||||||
|
The three inputs are **AND-merged** with `PULLUP=1` on both pad sets. AND is
|
||||||
|
exact, not a hack: every EXI input is inactive-HIGH (CPOL=1 → CLK idles high,
|
||||||
|
CS_N is active-low, MOSI only matters while CS_N is low), so the unplugged side
|
||||||
|
idles at 1 through its pull-up and passes the other side through — no select
|
||||||
|
signal needed. Outputs drive both pads. **Drive one side at a time**; a GC on
|
||||||
|
SP1 plus a host on J4 will fight and the AND yields the mangled product.
|
||||||
|
Build refuses to run alongside `UART_J4` (also pins 9/10) or an `ETH_D3_PIN`
|
||||||
|
aimed at a J4 pad.
|
||||||
|
|
||||||
|
**Why merge rather than repin:** all five J4 pads are on the SAME bottom die
|
||||||
|
edge as the EXI pads (x=13–18 vs x=5–9, both y=0 per icestorm's `pinloc_db`
|
||||||
|
`5k-sg48`), so the capture domain keeps its bottom-edge anchor. Repinning would
|
||||||
|
have perturbed the one placement variable the pin-co-location experiment showed
|
||||||
|
is worth ±5 MHz — see "Remaining capture bottleneck" above.
|
||||||
|
|
||||||
|
**Measured 2026-09-30**, `EXI_J4=1` + socket-3 UDP, `--seeds 8`:
|
||||||
|
`clk` 29.2–31.4 MHz (PASS on all 8); `capture_clk` **4 of 8 PASS** (seeds 2, 5,
|
||||||
|
6, 8), best **seed 8 = 63.09 MHz** (+9.1 MHz / 17% margin). Same pass rate as
|
||||||
|
the default build and a better best seed, so the merge costs no measurable
|
||||||
|
capture timing — but it is still seed-dependent, so **always sweep**.
|
||||||
|
|
||||||
### Pending work
|
### Pending work
|
||||||
- **Synthesis/timing**: ⚠️ partially — synthesizes and P&Rs, `clk` closes with
|
- **Synthesis/timing**: ⚠️ partially — synthesizes and P&Rs, `clk` closes with
|
||||||
wide margin, but `capture_clk` closes on only **2 of 8 seeds** and the default
|
wide margin, but `capture_clk` closes on only **2 of 8 seeds** and the default
|
||||||
|
|||||||
Reference in New Issue
Block a user