P123 keeps the P122 four-entry ROB ring and adds a separate shadow dispatch/issue opportunity model. It does not let younger operations change architectural state yet. It asks a narrower question: how often does the frontend already have work queued while the serialized backend is still busy?
| check | result |
|---|---|
| Verilator build | PASS |
BusyBox shell workload reaches P123-FILE-OK | PASS |
| Dispatch/issue opportunity counters emitted | PASS |
| Hardened layout | NOT RUN |
| dispatch / issue counter | value |
|---|---|
| frontend-ready/backend-busy cycles | 40,404,653 |
| serial backend block cycles | 40,404,653 |
| dispatch opportunities | 40,404,653 |
| modeled dispatch allocs | 40,404,653 |
| modeled issue drains | 40,404,652 |
| modeled full blocks | 0 |
| modeled occupancy at end | 1 |
| modeled max occupancy | 1 |
| modeled occupancy-0 cycles | 67,914,985 |
| modeled occupancy-1 cycles | 150,006,182 |
| modeled occupancy-2/3/4 cycles | 0 |
| metric | P122 | P123 |
|---|---|---|
| post-load cycles | 219,016,787 | 217,921,168 |
| shell window cycles | 65,109,744 | 64,008,910 |
| retired instructions | 86,435,662 | 86,078,334 |
| CPI | 2.5339 | 2.5317 |
| S_FETCH cycles | 7,628,977 | 7,615,306 |
| S_MEM cycles | 27,785,996 | 27,640,594 |
The cycle numbers are the measured P123 profile, but this rung should not be read as a speedup claim. The dispatch model is shadow-only; the important result is the 40.40M-cycle window where a real dispatch stage could be doing work while the old backend waits to retire the current instruction.
That gives the next rung a sharper target: add a shadow issue slot with explicit block reasons for memory operations, CSR/trap/fence behavior, control-flow repair, and unresolved dependencies. A ROB ring becomes interesting only after dispatch and issue can actually get ahead of writeback.
- kernel banner to /init 116,722,502 53.7%
- /init to shell banner 1,078,743 0.5%
- shell banner to first command 35,482,946 16.3%
- echo command 1,649 0%
- uname -a 2,477,956 1.1%
- ls /bin /usr/share 31,936,047 14.7%
- cat sample file 3,118,950 1.4%
- touch/write/cat/rm /tmp file 10,412,164 4.8%
- 8x ash loop with file I/O 16,061,464 7.4%
- final marker 680 0%
- fetch 3.5% 7,615,306
- execute 39.5% 86,103,010
- mem 12.8% 27,919,152
- walker 1.2% 2,692,933
- writeback 39.5% 86,078,334
- mul/div 3.4% 7,510,717