Routing
Each case shows the tail of a real run, ending where the tool stopped or warned. Say what caused it, or what to do about it. A case you miss returns later in the round and starts its schedule over; one you get right returns after 1, 3, 7, then 21 days. Keys 1 to 4 choose an option, h shows a hint, and Enter moves on. Progress is stored in this browser.
All 5 cases in this stage, with answers
-
This run finished cleanly. Is there anything here to act on?
5_2_route log
global_route -end_incremental -congestion_report_file ./reports/nangate45/gcd/good/congestion_post_recover_power.rpt Repair antennas... [WARNING GRT-0246] No diode with LEF class CORE ANTENNACELL found. [INFO ANT-0002] Found 0 net violations. [INFO ANT-0001] Found 0 pin violations. Estimate parasitics...
Yes: antenna repair has no diode to insert, so it fixes nothing.Hint: Read the first line, then ask how the two lines under it were able to say zero.
The tool looked for a cell of the antenna class and found none, so the repair step is doing nothing. On this design nothing was violating, so it cost nothing. On a design that does violate, the same warning means the violations stay and are found much later, at sign-off. A warning in a clean run is worth reading precisely because nothing failed.
# name a diode from the platform so repair has something to insert export ANTENNA_CELL_NAME = ANTENNA_X1
-
What is this report saying about the tile it names?
5_1_grt log
violation type: Horizontal congestion srcs: net:_105_ net:_107_ net:_109_ net:_189_ net:clk net:net52 comment: capacity:7 usage:8 congestion:1 bbox = (16.8000, 16.8000) - (18.9000, 18.9000) on Layer - violation type: Vertical congestion srcs: net:_149_ net:_150_ net:dpath.a_lt_b$in0\[10\] net:clknet_0_clk comment: capacity:5 usage:6 congestion:1 bbox = (21.0000, 21.0000) - (23.1000, 23.1000) on Layer -
One more wire wants to cross the tile than it has tracks for.Hint: Read the comment line as three numbers about one small square of the die.
Global routing divides the die into tiles and counts how many wires want to cross each boundary against how many can. Usage above capacity is the overflow, reported per direction with the nets involved. A little is normal and the detailed router will resolve it; a lot, or a cluster of it in one place, is the congestion that makes a design unroutable.
# give the region room, or the tool more layers to use export CORE_UTILIZATION = 45 export MAX_ROUTING_LAYER = metal6
-
Detailed routing is reporting violations. Should you be worried?
5_2_route log
[INFO DRT-0195] Start 3rd guides tiles iteration. Completing 10% with 31 violations. Completing 20% with 31 violations. Completing 30% with 31 violations. Completing 40% with 31 violations. Completing 50% with 27 violations. Completing 60% with 27 violations. Completing 70% with 27 violations. Completing 80% with 27 violations. Completing 90% with 0 violations. Completing 100% with 0 violations. [INFO DRT-0199] Number of violations = 0.No: the router clears them as it goes, and ended at zero.Hint: Read down the percentages, then read the last line.
The router works in passes, ripping up and rerouting what does not fit, so a count part way through a pass means nothing on its own. What matters is the number at the end of the last iteration. A healthy run of this design also reports violations in its early passes. The number to watch is one that stops falling between iterations.
# nothing to fix here; the line that matters is the last one report_design_area
-
Global placement printed this, before any routing ran. What is it?
3_1_place_gp log
[INFO GPL-0041] Total routing overflow: 0.0000 [INFO GPL-0042] Number of overflowed tiles: 0 (0.00%) [INFO GPL-0043] Average top 0.5% routing congestion: 0.7465 [INFO GPL-0044] Average top 1.0% routing congestion: 0.7361 [INFO GPL-0045] Average top 2.0% routing congestion: 0.7240 [INFO GPL-0046] Average top 5.0% routing congestion: 0.6931 [INFO GPL-0047] Routability iteration weighted routing congestion: 0.7413
The placer's own estimate of how routable its placement is.Hint: Ask how a placer could know anything about congestion at all.
A placer in routability mode runs a quick trial route and reads the overflow back, which is how it knows to spread cells apart before the real router ever starts. The averages of the worst tiles matter far more than the overall figure: congestion is local, and a design with an average of 0.72 and a handful of tiles at 1.0 is the one that fails.
# if the top percentiles are near or above 1, spread the design out export PLACE_DENSITY_LB_ADDON = 0.30
-
Detailed routing on a larger design. Is this going to finish?
5_2_route log
[INFO DRT-0195] Start 0th optimization iteration. [INFO DRT-0199] Number of violations = 5434. [INFO DRT-0195] Start 1st optimization iteration. [INFO DRT-0199] Number of violations = 2304. [INFO DRT-0195] Start 2nd optimization iteration. [INFO DRT-0199] Number of violations = 1925. [INFO DRT-0195] Start 3rd optimization iteration. [INFO DRT-0199] Number of violations = 100. [INFO DRT-0195] Start 4th guides tiles iteration. [INFO DRT-0199] Number of violations = 0.
Yes: each pass clears most of what the one before it left.Hint: Look at the ratio between one pass and the next, not at the first number.
The shape is what matters. Five thousand becomes two thousand, then two thousand becomes a hundred, and the last pass finishes clean, which is a router that is winning. The pass to worry about is one that returns almost the same number as the pass before it, over and over: that is a design the router cannot fix by rerouting, and it needs the placement or the floorplan changed instead.
# nothing here; read the trajectory before reacting to the first number grep "Number of violations" 5_2_route.log