packages/chip/docs/pd/avfs.md
Status: planning_evidence_release_blocked
Adaptive Voltage / Frequency Scaling closed-loop controller for the six DVFS-managed rails:
| Rail | Enum | Source rail in rail plan |
|---|---|---|
| CPU big | DVFS_RAIL_CPU_BIG | VDD_CPU_BIG |
| CPU little | DVFS_RAIL_CPU_LITTLE | VDD_CPU_LITTLE |
| NPU | DVFS_RAIL_NPU | VDD_NPU |
| GPU | DVFS_RAIL_GPU | VDD_GPU |
| SoC fabric / NoC | DVFS_RAIL_SOC_FABRIC | VDD_SOC_FABRIC |
| SRAM | DVFS_RAIL_SRAM | VDD_SRAM |
Each AVFS instance produces a target_code_o value at DVFS_STEP_UV
(6.25 mV) granularity. The output is consumed by rtl/power/dldo.sv on-die
regulators (CPU/NPU rails) and by the PMC firmware off-chip PMIC sequencer
(all rails).
canary_margin_low_i[CANARY_COUNT-1:0] ┐
canary_margin_high_i[CANARY_COUNT-1:0] ┤ AVFS update tick
├──> target_code_o (+/- 1 LSB)
min_code_i, max_code_i ┘
CANARY_COUNT = AVFS_CANARY_COUNT = 16: per-rail in-situ critical-path
replicas spread across the floorplan.AVFS_UPDATE_CYCLES (= 20_000 at 200 MHz = 100 us).fault_o asserts if raise saturates at max_code_i (silicon is slower
than the DVFS table allows; needs human-in-loop response).Generated at silicon characterization from pd/signoff/sta/* corner sweeps.
Three production tables binned by silicon corner (SS, TT, FF), each parameterized
by junction temperature (0 / 25 / 85 / 105 °C). The PMC firmware
loads the appropriate table at boot based on fuse settings and the on-die
DTSs.
See docs/evidence/power/dvfs-table-evidence.yaml for the production gate.
The skeleton format is in docs/pd/dvfs-tables/.
verify/cocotb/power/test_avfs_convergence.py — 5/5 tests pass.max_code_i with fault, clamp at min_code_i, disable holds init code.make cocotb-avfs.