No. 35 / project of 147 on the ladder

RV32IM signoff clean

introduces — Low-memory mtvec WARL cleanup, divider sign-fix simplification, and residual DRV audit

harden statelast run2026-05-01
cells26,883non-filler
slack8.05ns setup
area900 x 900 die, 188652 stdcell areaμm²
signoff
  • DRCPASS
  • LVSPASS
  • antennaPASS

P35 is the follow-up to P34’s “small DRV tail” result. It keeps the same RV32IM platform and does not add new instructions. The work here is narrower: make the remaining high-fanout and slow-corner cones less silly, rerun the ACT4 coverage, and harden again with a practical LibreLane config.

Status: hardened, with residual DRV warnings. LibreLane run RUN_2026-05-01_19-57-20 produced final GDS and passed Magic DRC, KLayout DRC, LVS, antenna, routing DRC, setup timing, hold timing, and max fanout. Max slew and max cap still report a small slow-corner tail.

The Result

Run it:

make -C projects/35_rv32im_signoff_clean/test clean all

Result: PASS

checkresult
Build linked rv32im_zicsr runtime ELFPASS
UART-load compiled imagePASS
Execute C *, /, and % through RV32MPASS
Execute mulh, mulhsu, and mulhuPASS
Check divide-by-zero and overflow edge casesPASS
MMIO UART writes M, T, EPASS
MMIO timer interrupt visible to CPASS
External interrupt visible to CPASS
Halt with x5 = 1PASS

ACT4/Sail rv32i/I: PASS=39 FAIL=0 NOT RUN=0

ACT4/Sail rv32i/M: PASS=8 FAIL=0 NOT RUN=0

Full RISC-V compliance: NOT RUN

Harden Result

LibreLane flow: PASS

harden checkresult
Run directoryprojects/35_rv32im_signoff_clean/librelane/runs/RUN_2026-05-01_19-57-20
Final GDSprojects/35_rv32im_signoff_clean/librelane/runs/RUN_2026-05-01_19-57-20/final/gds/top.gds
Metricsprojects/35_rv32im_signoff_clean/librelane/runs/RUN_2026-05-01_19-57-20/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 8.048 ns)
Hold timingPASS (0 violations, worst hold slack 0.100 ns)
Max slewFAIL (13 violations, all in max_ss_100C_1v60)
Max capFAIL (1 violation)
Max fanoutPASS (0 violations)

The comparison to P34 is the real story:

metricP34P35
Worst setup slack7.475 ns8.048 ns
Worst hold slack0.106 ns0.100 ns
Max slew violations1213
Max cap violations31
Max fanout violations90
Standard-cell area192919 um^2188652 um^2
Standard-cell count2714726883

What Changed

The supported instruction set is the same as P34:

instruction familystatus
RV32I base integer instructionsPASS in scoped ACT4/Sail rv32i/I
MUL, MULH, MULHSU, MULHUPASS in scoped ACT4/Sail rv32i/M
DIV, DIVU, REM, REMUPASS in scoped ACT4/Sail rv32i/M
Zicsr machine-mode CSR subsetused by the runtime, not full CSR compliance

The implementation changes are mostly cleanup. mtvec is now a low-memory WARL CSR: only bits [11:2] are stored, bits [31:12] read as zero, and the core still uses direct trap mode only. That matches this tiny platform’s low external RAM map and cuts down the CSR/trap cone.

The divider also selects quotient-versus-remainder before applying the final sign correction. That avoids keeping two parallel two’s-complement result paths alive at the final divider writeback.

Scope

This is not a full RISC-V compliance claim. The recorded official-test coverage is the scoped ACT4/Sail rv32i/I and rv32i/M batches listed above.

Still unsupported: atomics, compressed instructions, supervisor mode, vectored mtvec, delegation CSRs, satp, an MMU, and official full compliance packaging.

What We Learned

P35 did not magically turn the chip into a perfect electrical-signoff example. It did clean up fanout completely and reduce cap to one violation, while keeping the ACT4 I/M coverage green and producing DRC/LVS/antenna-clean GDS.

The remaining slew tail is now a specific slow-corner datapath problem. That is better than broad reset-tree noise, but it is not worth turning this ladder rung into an open-ended backend tuning swamp.