Skip to content

Tighten designs - #4482

Open
gudeh wants to merge 7 commits into
The-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:secure-owned-designs-augusto
Open

Tighten designs#4482
gudeh wants to merge 7 commits into
The-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:secure-owned-designs-augusto

Conversation

@gudeh

@gudeh gudeh commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Use CORE_UTILIZATION instead of DIE and CORE explicit values. Reduce the clock period of two designs. This should make all of the changed designs to have a more dense placement and negative slacks.

gudeh added 5 commits August 26, 2026 22:34
…k period for two designs which did not reach a negative slack

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
## make update_ok for ibex (gf180)...
designs/gf180/ibex/rules-base.json updates:
| Metric                                        | Old        | New        | Type     |
| ------                                        | ---        | ---        | ----     |
| placeopt__design__instance__area              |     725567 |     724846 | Tighten  |
| placeopt__design__instance__count__stdcell    |      15783 |      15301 | Tighten  |
| cts__design__instance__count__setup_buffer    |       1372 |       1330 | Tighten  |
| cts__design__instance__count__hold_buffer     |       1372 |       1330 | Tighten  |
| globalroute__timing__setup__tns               |       -2.0 |      -8.23 | Failing  |
| finish__timing__setup__tns                    |      -2.07 |      -31.7 | Failing  |

## make update_ok for riscv32i (ihp-sg13g2)...
designs/ihp-sg13g2/riscv32i/rules-base.json updates:
| Metric                                        | Old        | New        | Type     |
| ------                                        | ---        | ---        | ----     |
| synth__design__instance__area__stdcell        |   140000.0 |   139000.0 | Tighten  |
| placeopt__design__instance__area              |     157813 |     156855 | Tighten  |
| placeopt__design__instance__count__stdcell    |      10692 |      10640 | Tighten  |
| cts__design__instance__count__setup_buffer    |        930 |        925 | Tighten  |
| cts__design__instance__count__hold_buffer     |        930 |        925 | Tighten  |
| detailedroute__route__wirelength              |     456338 |     575080 | Failing  |
| finish__design__instance__area                |     168206 |     167407 | Tighten  |

Large percentage changes in failing metrics (>50%):
 - ibex (gf180)  finish__timing__setup__tns       1431.40%  (-2.07 → -31.7)
 - ibex (gf180)  globalroute__timing__setup__tns   311.50%  (-2.0 → -8.23)

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
@gudeh gudeh self-assigned this Aug 27, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the OpenROAD subproject and modifies physical design configurations across multiple designs (tinyRocket, ibex, aes, riscv32i, and bp_fe_top) by increasing core utilization targets and tightening clock periods. However, several critical issues were identified: replacing fixed die and core areas with dynamic utilization for designs with macros (tinyRocket and bp_fe_top) risks breaking manual macro placements; the aggressive utilization targets of 75% and 85% lead to severe timing degradation (TNS of -31.7 for ibex) and significant routing congestion (a 26% wirelength increase for riscv32i); and the 85% utilization target for aes is overly aggressive for timing closure.

Comment on lines +28 to +29
export CORE_UTILIZATION = 50
export PLACE_DENSITY_LB_ADDON = 0.10

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using dynamic CORE_UTILIZATION instead of fixed DIE_AREA and CORE_AREA is highly risky for designs containing macros (such as the SRAMs specified in WRAP_LEFS). In physical design flows, dynamic floorplan sizing based on standard cell area changes the die boundaries whenever the netlist size fluctuates. This will break manual macro placement configurations that rely on absolute coordinates, leading to placement failures or overlaps. It is recommended to retain fixed DIE_AREA and CORE_AREA dimensions for designs with macros to ensure stability.

# These values must be multiples of placement site
export DIE_AREA    = 0 0 400.008 399.84
export CORE_AREA   = 19.992 20.16 380.016 380.16

export PLACE_DENSITY = 0.20

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this true @eder-matheus ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm pretty sure we have other designs with macros that uses CORE_UTILIZATION. You can double check it, but I think this is just gemini hallucinating.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AcKoucher @joaomai what do you say?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your changes are fine. If a certain design were to use manual macro placement we could treat it as an exception. It's just Gemini being overly defensive.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks guys!

Comment on lines +20 to +21
export CORE_UTILIZATION = 50
export PLACE_DENSITY_LB_ADDON = 0.11

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Removing the fixed DIE_AREA and CORE_AREA in favor of dynamic CORE_UTILIZATION is problematic for bp_fe_top because it contains multiple SRAM macros (ADDITIONAL_LEFS). Dynamic floorplan sizing causes the die/core boundaries to shift whenever the synthesized netlist size changes. This invalidates manual macro placement configurations (typically defined with absolute coordinates), leading to out-of-bounds or overlapping macro placement errors. To tighten the design safely, calculate and specify a smaller, fixed DIE_AREA and CORE_AREA instead of using dynamic utilization.

export DIE_AREA    = 0 0 800 600 
export CORE_AREA   = 10 10 790 590 

export PLACE_DENSITY_LB_ADDON = 0.11

},
"finish__timing__setup__tns": {
"value": -2.07,
"value": -31.7,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The total negative slack (finish__timing__setup__tns) has degraded significantly from -2.07 to -31.7. While some negative slack is expected when tightening the design, a TNS of -31.7 at the final stage is extremely high for the Ibex core on GF180. This indicates severe, unresolvable timing violations under the new 75% utilization target. Consider lowering the utilization target (e.g., to 65% or 70%) to allow the optimizer sufficient routing and buffering space to meet timing.

},
"detailedroute__route__wirelength": {
"value": 456338,
"value": 575080,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The detailed routing wirelength (detailedroute__route__wirelength) increased by approximately 26% (from 456338 to 575080), even though the standard cell area decreased slightly. This disproportionate increase in wirelength is a clear symptom of severe routing congestion caused by raising the core utilization from 35% to 75%. High congestion and excessive routing detours can lead to increased dynamic power, crosstalk, and potential DRC violations. Consider a more moderate utilization target (e.g., 60%) to balance density and routing efficiency.

export SDC_FILE = $(DESIGN_HOME)/$(PLATFORM)/$(DESIGN_NICKNAME)/constraint.sdc

export CORE_UTILIZATION = 20
export CORE_UTILIZATION = 85

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Setting CORE_UTILIZATION to 85% is extremely aggressive for a standard cell design, especially when combined with a tighter clock period of 3ns. High utilization limits the router's ability to insert buffer trees for timing closure and clock tree synthesis, and typically leads to severe routing congestion and DRC violations. A utilization target between 60% and 70% is generally the practical upper limit for routability and timing closure in most technologies.

export CORE_UTILIZATION = 70

@openroad-ci

openroad-ci commented Aug 28, 2026

Copy link
Copy Markdown
Member

🔍 QoR check

Metrics reflect the PR merge build — i.e. what will land on the target branch. Advisory — results are log-only and do not affect build status. The authoritative QoR gate remains the local rules-file check.

Commit c996bd3 · Jenkins build #3 · Baseline: build

62 design(s) checked — 0 with regression(s), 0 without a comparable baseline.
Design Variant Verdict local vs inline passed / failed / missing
asap7/aes base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/aes-block base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/aes-mbff base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/aes_lvt base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/cva6 base ✅ pass ✅ MATCH 12 / 0 / 0
asap7/ethmac base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/ethmac_lvt base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/gcd-ccs base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/jpeg_lvt base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/mock-alu base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/mock-cpu base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/riscv32i base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/riscv32i-mock-sram base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/swerv_wrapper base ✅ pass ✅ MATCH 25 / 0 / 0
asap7/uart base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/aes base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/aes-hybrid base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/riscv32i base ✅ pass ✅ MATCH 25 / 0 / 0
gf180/uart-blocks base ✅ pass ✅ MATCH 25 / 0 / 0
gt2n/aes base ✅ pass ✅ MATCH 25 / 0 / 0
gt2n/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
gt2n/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/aes base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/i2c-gpio-expander base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/riscv32i base ✅ pass ✅ MATCH 25 / 0 / 0
ihp-sg13g2/spi base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/aes base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/ariane133 base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/ariane136 base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/black_parrot base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/bp_be_top base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/bp_fe_top base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/bp_multi_top base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/cva6 base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/dynamic_node base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/mempool_group base ✅ pass ✅ MATCH 12 / 0 / 0
nangate45/swerv base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/swerv_wrapper base ✅ pass ✅ MATCH 25 / 0 / 0
nangate45/tinyRocket base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/aes base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/chameleon base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/microwatt base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hd/riscv32i base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hs/aes base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hs/gcd base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hs/ibex base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hs/jpeg base ✅ pass ✅ MATCH 25 / 0 / 0
sky130hs/riscv32i base ✅ pass ✅ MATCH 25 / 0 / 0

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
set clk_name core_clock
set clk_port_name clock
set clk_period 800
set clk_period 700

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it change QoR at all? I don't see new metrics for this design.
Same for ihp/aes and nangate45/bp_fe.

@gudeh

gudeh commented Sep 3, 2026

Copy link
Copy Markdown
Contributor Author

for the private design:
Screenshot from 2026-09-03 13-10-35
For some reason I do not see the finish tns in the dashboard. @migueldalberto

For public designs:
Screenshot from 2026-09-03 13-17-23

I am surprised to see improvements, I suspect after merging with master results improved. I can further tighten them.

@gudeh

gudeh commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

nangate45/bp_fe has a PPL error for certain input utilization values:
image

gf12/tinyRocket has the error mentioned in #4500.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants