The physics物理 A capacitor made of wires and pins由線和腳組成的電容
The NES CPU data bus (D0–D7) strings together the 2A03, the PRG ROM, the work RAM, and (buffered) the PPU. When the CPU reads an address nothing answers — the open bus — the value it gets is whatever charge remains on the copper: the last byte anyone drove. What holds that charge is the bus net's parasitic capacitance: PCB trace-to-plane capacitance plus the package pins, bond wires, and input gates of every chip hanging on the bus. Tens of picofarads in total; with leakage currents this small, the level survives for milliseconds and more — vastly longer than the microseconds between CPU cycles, so a following read always sees the last byte. No component on the schematic is "the open-bus capacitor". The board provides it for free, by existing.
NES 的 CPU 資料匯流排(D0–D7)串著 2A03、PRG ROM、工作 RAM 和(經緩衝的)PPU。當 CPU 讀一個沒人回應的位址 —— open bus —— 它拿到的值,就是銅線上殘留的電荷:最後被任何人驅動過的位元組。保持這團電荷的,是匯流排網的寄生電容:PCB 走線對地電容,加上掛在匯流排上每一顆晶片的封裝接腳、bond wire 與輸入閘極。合計幾十 pF;漏電流這麼小,電位能存活毫秒以上 —— 遠長於 CPU cycle 之間的微秒,所以緊接的讀取永遠看得到 last byte。電路圖上沒有任何零件叫「open-bus 電容」。主機板光是存在,就免費提供了它。
The proof證明 Why every on-die mechanism failed — experimentally為什麼每個晶粒內機制都失敗 —— 實驗為證
Our graph models the two dies' interiors exactly (segdefs polygons — the M2 census computes real capacitance for every on-die node) and the board as ideal wires with no geometry. The bus trace and everyone's pin capacitance exist between the dies, in a region our data simply does not describe. The retirement experiments confirmed the consequence three independent ways (full record):
我們的圖精確建模兩顆晶粒的內部(segdefs 多邊形 —— M2 普查能算出每個晶粒內節點的真電容),而主機板是沒有幾何的理想導線。匯流排走線與大家的接腳電容存在於晶粒之間,在我們的資料完全沒有描述的區域。試拔實驗用三條獨立路徑證實了後果(完整紀錄):
- M2 capacitance arbitration — can't reach it: the bus is actively re-driven each cycle (not floating), and the board net has no C in our data anyway. Control experiment: FAIL(1).
- M2 電容裁決 —— 碰不到:匯流排每個 cycle 被主動重驅動(不是浮接),而且板網在我們的資料裡本來就沒有 C。對照實驗:FAIL(1)。
- The full M4 latch stack (data-wins + hold + transparent) — wrong physics: nothing here is a latch. Control: FAIL(1).
- M4 閂鎖全 stack(data-wins + hold + transparent)—— 物理不對口:這裡沒有任何東西是閂鎖。對照:FAIL(1)。
- M3 delay — timing does not create charge storage that isn't modeled.
- M3 延遲 —— 時序不會憑空生出沒被建模的電荷儲存。
| OpenBus last-byte (this page)OpenBus last-byte(本頁) | io_db decay (retired ✅)io_db 衰減(已退役 ✅) | |
|---|---|---|
| where the capacitance lives電容在哪 | the board (traces + pins)板上(走線+接腳寄生) | on-die (2C02 io-bus latch)晶粒內(2C02 io-bus 閂鎖) |
| hold time保持多久 | milliseconds and up毫秒級以上 | ~600 ms then leaks to 0後漏到 0 |
| in our graph?在我們的圖裡嗎 | no geometry at all❌ 零幾何 | real nodes (ppu._io_db)✅ 真節點 |
| fate命運 | ceiling → M5e chartered天花板 → M5e 立案 | M2 timestamp decayM2 時戳衰減 |
The two are easy to confuse — both are "charge remembers a byte". The difference is jurisdiction: one capacitor is drawn in segdefs, the other exists only in the physical world between the packages.兩者很容易搞混 —— 都是「電荷記住一個位元組」。差別在管轄權:一顆電容畫在 segdefs 裡,另一顆只存在於封裝之間的物理世界。
The charter立案 M5e — give the bus its physics, in the right homeM5e —— 把物理還給匯流排,放進對的家
The honest fix is not another on-die mechanism — it is admitting the board's bus is a physical component our system model should carry, exactly as the 74LS373 already is. M5e charters that: extend the M5 board-component library with a bus-hold semantic for external nets — a capacitance annotation on the board-level data bus that remembers the last driven value and supplies it when nothing drives. The shim's logic barely changes; its home and legitimacy do: from "test-mode patch" to "physically-justified board net model", the same philosophy that made the '373 a first-class citizen instead of a hack in a callback.
誠實的解法不是再做一個晶粒內機制 —— 而是承認主機板的匯流排是一個系統模型本來就該攜帶的物理元件,就像 74LS373 已經是的那樣。M5e 立的就是這個案:把 M5 板級元件庫延伸出外部網的 bus-hold 語意 —— 在板級資料匯流排上掛一個電容標註,記住最後被驅動的值、在沒人驅動時供出它。shim 的邏輯幾乎不變;改變的是它的家與正當性:從「測試模式補丁」變成「有物理依據的板網模型」—— 跟讓 '373 成為一級公民、而不是回呼裡的 hack,是同一個哲學。
- Where does bus-hold live? A property of the connection layer (any board net can carry a C annotation), or a pseudo-component ("the bus" as a device)? The former is more general; the latter matches the '373 precedent.
- bus-hold 住哪?連線層的屬性(任何板網都能帶 C 標註),還是偽元件(「匯流排」本身當一個 device)?前者更通用;後者符合 '373 前例。
- Does board-bus decay matter? On-die decay was ~600 ms and test-visible; board hold is longer and probably never decays within any test. Likely a hold-forever first version.
- 板匯流排的衰減要不要建?晶粒內衰減 ~600ms 且測試看得到;板上保持更久,大概沒有測試等得到它衰減。第一版可能就是永久保持。
- The P6 glitch half stays separate. The err4 DOR-precharge pulse escaping through an open pad driver is a transient (M4/P6 jurisdiction), not bus-hold; M5e must not quietly absorb it.
- P6 毛刺那一半另案。err4 的 DOR precharge 脈衝經敞開 pad 驅動洩出是瞬態(M4/P6 管轄),不是 bus-hold;M5e 不可以悄悄把它吸收進來。
- Verification is decidable. Unusually for this family, the control already fails in isolation (AC OpenBus, FAIL(1)) — so when M5e is built, a clean three-arm retirement proof is available immediately.
- 驗證是可判的。在這個家族裡難得地,對照組在孤立下就會失敗(AC OpenBus,FAIL(1))—— 所以 M5e 一旦建成,乾淨的三段論退役證明立刻可用。