What does track assignment do between global and detail routing?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
Track assignment takes each global route, which only says which GCells a net passes through, and places its long segments on real tracks. It does this across whole rows and columns of the block at once, so parallel nets are spread sensibly before detail routing starts. After it finishes, every net is drawn in metal, but there are still many violations near pins for detail routing to fix.
Technical Explanation
- Global routing leaves each net as a list of GCells with no exact geometry. Detail routing needs real shapes to check. Track assignment is the bridge between them.
- It works in horizontal partitions and vertical partitions, assigning tracks to all the segments that run through a row or column together. Seeing all the segments at once lets it avoid putting two nets on the same track and reduce later rip-up.
- It also reroutes wires that overlap after the first assignment, so two nets never end up on the same stretch of the same track. Long straight segments are its strength; the short connections into pins are left for detail routing.
- After track assignment the block no longer holds global routes. They have been replaced by metal shapes, which is why incremental global routing must happen before this step, not after.
- The result is complete but rough: nets are connected, but pin connections are often not legal yet. Detail routing then works locally to clean those up.
- At the end of
route_track, Zroute prints wire length and via count per layer, the first real routing numbers you get. - Because it only places long segments, track assignment is fast compared with detail routing. On a large block it may take a fraction of the time, while detail routing and its search-and-repair iterations take most of the total.
- By default track assignment is neither timing-driven nor crosstalk-driven. You can enable both with
route.track.timing_driven, and withroute.track.crosstalk_driventogether withtime.si_enable_analysis.
Common Mistake
The Trap: Treating the DRC count right after track assignment as a warning sign. Track assignment is expected to leave many violations near pins, because it places long segments, not pin connections. A junior who stops the flow here to debug those violations is solving detail routing's job by hand.
Follow-up Question & Model Response
"Why does it matter that track assignment works on whole partitions rather than net by net?"
Candidate Model Response: If nets were assigned one at a time, the early nets would take the best tracks and later nets in the same channel would be pushed to awkward tracks or forced into jogs. Looking at a whole row or column at once lets the tool spread parallel segments across the available tracks and keep nets that must cross from blocking each other. That gives detail routing a much cleaner starting point, with fewer rip-ups.
Practical Example
Tapeout Scenario: Three nets pass horizontally through the same GCell row on M3 (illustrative). After global routing they are just "row 42, columns 10 to 18". Track assignment looks at the whole row, sees six free M3 tracks, and puts the nets on tracks 2, 4 and 6, leaving a free track between each pair so later pin connections have room. Detail routing then only has to fix a spacing violation where one net drops to M2 at its pin. The route_track summary for the block reports the first real wire totals, for example 4.1 m of M2 and 2.8 m of M3, and a via count per layer. Those numbers are worth saving, because if detail routing later adds a large number of extra vias or wire, it tells you search-and-repair had to fight hard in some region.
PnR Flow Mentor Guide
Master the Physical Design Implementation Flow
Read the complete 8-chapter PnR Flow Mentor Guide free on the web — library setup through placement, clock tree synthesis, routing, chip finishing, hierarchical implementation, and ECO, all the way to stream-out.

Continue practising