journal 2026-05-01

P36 clears the divider slew/cap tail

p36riscvrv32mlibrelanetiming

P36 followed the P35 result directly. P35 was DRC/LVS/antenna clean and passed the ACT4 I/M batches, but the routed metrics still had 13 max-slew and 1 max-cap violations. The remaining suspect was the signed divide/remainder finish path.

The RTL change is intentionally small:

Commands:

make -C projects/36_rv32im_divider_sign_stage/test clean all
make -C projects/36_rv32im_divider_sign_stage/test act4_m
make -C projects/36_rv32im_divider_sign_stage/test act4
make harden PROJECT=36_rv32im_divider_sign_stage

Result:

checkresult
Directed RV32IM runtimePASS
ACT4/Sail rv32i/IPASS=39 FAIL=0 NOT RUN=0
ACT4/Sail rv32i/MPASS=8 FAIL=0 NOT RUN=0
Full RISC-V complianceNOT RUN
LibreLane flowPASS
Run directoryprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-01_20-53-59
Final GDSprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-01_20-53-59/final/gds/top.gds
Metricsprojects/36_rv32im_divider_sign_stage/librelane/runs/RUN_2026-05-01_20-53-59/final/metrics.json
Magic DRCPASS (0 errors)
KLayout DRCPASS (0 errors)
LVSPASS (0 errors)
AntennaPASS (0 net violations, 0 pin violations)
Routing DRCPASS (0 errors)
Setup timingPASS (0 violations, worst setup slack 6.626 ns)
Hold timingPASS (0 violations, worst hold slack 0.106 ns)
Max slewPASS (0 violations)
Max capPASS (0 violations)
Max fanoutFAIL (1 violation)

Compared with P35, standard-cell count moved from 26883 to 27181, and standard-cell area moved from 188652 um^2 to 191266 um^2. Setup slack fell from 8.048 ns to 6.626 ns, but that is still comfortable against the 40 ns clock.

The honest read: this fixed the thing we were aiming at. It did not produce a perfect DRV-zero metrics file because of the one fanout count. That is a much smaller problem than the P35 slew/cap tail.