P130 starts the top.sv cleanup in the least dramatic way: it extracts
the scheduler boundary into an explicit plain-RTL valid / ready /
fire helper while keeping architectural execution unchanged.
check
result
Verilator build
PASS
BusyBox shell workload reaches P130-FILE-OK
PASS
Ready/valid contract counters emitted
PASS
Hardened layout
NOT RUN
contract counter
value
samples
64,743,639
arrival-fire cycles
22,652,878
service-fire cycles
22,652,811
backpressure cycles
0
dual-ready cycles
0
triple-ready cycles
0
per-class fire counter
integer
memory
control
arrival fires
13,095,201
3,246,456
6,311,221
service fires
13,095,201
3,246,389
6,311,221
metric
P129
P130
post-load cycles
218,413,661
218,446,005
shell window cycles
64,498,976
64,551,556
retired instructions
86,239,296
86,248,132
CPI
2.5326
2.5328
S_FETCH cycles
7,622,465
7,620,558
S_MEM cycles
27,700,817
27,709,660
This is not a speedup rung. The useful part is that the new helper’s
per-class fire counts agree with the older scheduler arrival/service
audit and report zero backpressure. The bad news is familiar: every
class still maxes at occupancy 1 and there are still zero dual-ready
cycles.
That makes P130 a good first refactor boundary rather than a performance
win. The next rung should move from a combinational contract helper to a
small state-owning dispatch queue module, still using plain wires:
*_valid, *_ready, *_fire, payload fields, and counters attached to
actual handshakes.