Skip to content
Ch 01 / 14 Chapter 1: What a Design Plan Is
Next →

CHAPTER ONE

What a Design Plan Is, and Why the Rest of the Chip Obeys It

By the end of this chapter you will be able to explain what design planning produces, decide how a large netlist should be divided into physical blocks, size a core from cell area, and prove that a design is ready for the next planning step instead of hoping that it is.

Why this chapter matters in a real project

On a large chip, the decisions made in the first week of physical work are the ones nobody gets to take back cheaply. Where you draw the boundary between two blocks decides how many wires must cross that boundary for the next nine months. How big you make the core decides how much silicon area the company pays for on every wafer, forever.

Design planning is the stage where those decisions are made deliberately rather than by accident. It sits between synthesis, which produced a netlist with no physical meaning at all, and implementation, which will spend enormous compute on placement, clock trees and routing. Its job is not to finish anything. Its job is to find out — quickly, and before the expensive steps start — whether the shape of the chip you have in mind can actually work, and to hand every downstream team a piece of the problem small enough to solve.

Engineers who are good at this stage look slow at first. They measure before they draw. They write down the assumption behind every number. They run a cheap check before a long command. Then they finish months earlier than the engineer who started by typing a die size.

Prerequisites

This is the first chapter, so it assumes only that you know what a logic gate and a flip-flop are, and that a netlist is a list of cells and the nets connecting them. Everything physical is introduced from zero; if you have never seen a floorplan, a routing track or a Tcl command, you are the reader this chapter was written for.

Learning objectives

  1. State in one sentence what design planning produces and what decision it exists to support.
  2. Distinguish die from core, logical from physical hierarchy, and a hard macro from a standard cell.
  3. Compute a core area from a cell count, an average cell area and a target utilisation, and state the result with units.
  4. List the four factors that decide where a partition boundary goes, and apply them to a module list.
  5. Explain what changes in the design database when a logical module is committed to a physical block.
  6. Explain why a multiply instantiated block constrains pin placement, and what a feedthrough is.
  7. Name the validation keyword that guards each planning step, and run the pre-floorplan check on a design.
  8. Diagnose a failed planning step from its message summary rather than from its first line.
A full-page plate in four bands. The first band shows the four inputs to design planning: a gate-level netlist of 9.90 million cells and 72 SRAMs, reference libraries, timing constraints with four clocks and two corners, and power intent with two supplies. An arrow leads to the second band, an annotated 3.44 mm square die of the Nimbus-8 design showing five shaded physical blocks labelled CPU cluster, NPU core 0, NPU core 1, ISP and SoC periph, a DDR PHY hard macro along the bottom, banks of SRAM macros inside each block, small triangles marking block pins along every boundary, and shaded channel regions between blocks. Callouts identify the five physical blocks totalling 8.15 square millimetres, the hard macros, the 2.09 square millimetres of channels, and the block pins. The third band is a schematic strip: a launch flip-flop inside the CPU cluster drives two buffers in the top-level channel and then a capture flip-flop inside NPU core 0, with dashed block boundaries between them, showing one 625 picosecond clock period shared by three owners. The fourth band shows the four outputs: block plans, timing budgets, a top-level plan, and a verdict on whether the floorplan is worth implementing.
Figure 1.1 The whole chapter in one plate. Data arrives, a plan is built, one clock period is shared between separate owners, and decisions leave. Every element in the centre panel is explained in this chapter; keep the page marked, because the same design returns in every chapter of this book.

1.1 The beginner’s mental model

Start with a building

An architect handed an empty plot and a list of requirements — twelve offices, one laboratory, a server room, a lift — does not begin by drawing walls. She begins by adding up how many square metres of room she has been asked for, comparing that with the plot, and deciding how the space will be divided. Only then does she draw. She knows that corridors are not wasted space: without them nobody reaches the offices. She knows the lift shaft cannot be moved to suit a nicer layout, because it is a fixed structure that arrives as it is. And she knows that if she gets the division wrong, every later drawing inherits the mistake.

Design planning is that stage of work for a chip. You are handed a netlist instead of a room list, silicon area instead of a plot, and hard intellectual-property blocks instead of a lift shaft — and the discipline is the same. Measure, divide, place the immovable things, leave room for the connections, and check the arithmetic before anyone starts building.

Two panels side by side. The left panel is an architectural floor plan of a building: four rooms labelled office, office, office and lab, a hatched vertical corridor running through the middle with four doorways shown as quarter-circle arcs, a solid dark rectangle labelled lift shaft, cannot move, and a dashed vertical line at the left edge labelled electrical riser, with an overall dimension of 18 metres. The right panel is the Nimbus-8 die of the same visual weight, showing the five physical blocks, shaded channels, block pins as small triangles, and the DDR PHY macro, dimensioned 3.44 millimetres. A mapping strip below pairs room with physical block, corridor with routing channel, doorway with block pin, lift shaft with hard macro, and electrical riser with power and ground mesh. A final line marks where the analogy stops: rooms do not share a deadline, blocks share one clock period, and a signal may pass straight through a block that does not use it.
Figure 1.2 The analogy, drawn to the same scale of care as the real thing — and its limits. Use the left panel to get oriented, then drop it: the two differences named at the bottom of the figure are exactly the two things that make chip planning hard.
WHERE THE ANALOGY BREAKS — READ THIS TWICE

Two rooms in a building are independent once the walls are up. Two blocks on a chip are not. They share one clock period, so if one block is slow the other must be faster, and somebody has to decide by how much before either team starts work. And a signal on a chip may need to enter one block and leave the other side without being used inside it at all — a feedthrough, which has no architectural equivalent. Every time this book says “think of it as a room”, remember these two exceptions.

Now the engineering model

Strip the analogy away and the model is concrete. A chip is fabricated as a rectangle of silicon called the die. Inside the die, set back from its edge, is the core: the region where logic cells are allowed to sit. The strip between core and die edge — the core offset — is not wasted either; it carries power rings, input/output structures and the seal ring that protects the die when it is cut from the wafer. No standard cells go there.

The core is not smooth. It is ruled into placement rows, each exactly as tall as the standard cells in your library, because a standard cell may only sit on a row, aligned to it, the way a book sits on a shelf. Crossing the rows, in every metal layer above, are routing tracks: the evenly pitched lines that wires are expected to follow. Rows tell you how much logic fits. Tracks tell you how much wiring fits. A floorplan that ignores either one will fail late and expensively.

Two kinds of things get placed in the core. A standard cell is a small library cell — an inverter, a flip-flop — one row tall, and there are millions of them. A hard macro is a large pre-built object such as a static random-access memory (SRAM) or a physical interface block: it arrives fully designed, it cannot be reshaped, it is taller than a row, and it blocks the rows it covers. You place macros. You do not synthesise them.

An annotated die plate on the left with the die boundary drawn as a double line labelled die edge and seal-ring zone, dimensioned 3.44 millimetres in both directions, and the core boundary drawn as a dashed square dimensioned 3.20 millimetres, filled with faint horizontal placement rows and labelled core area, 3.20 by 3.20 equals 10.24 square millimetres, placement rows live here. A coordinate origin with x and y arrows sits at the lower-left die corner. A callout points to the gap between core and die edge: core offset 0.12 millimetres or 120 micrometres, the ring between core and die edge carrying power rings, input-output structures and the seal ring, never cells. A magnified inset on the right shows six placement rows with alternating N and FS orientation labels, standard cells of different widths sitting on the rows, dashed vertical routing tracks at 0.048 micrometre pitch, a row height dimension of 0.576 micrometres labelled row height equals 12 tracks, and a hard macro spanning two rows labelled a macro blocks every row it covers. A legend identifies die boundary, core boundary, standard cell, hard macro, placement row and routing track.
Figure 1.3 The anatomy every later chapter assumes. Note the two scales: the die is measured in millimetres, the rows and tracks in fractions of a micrometre. Design planning is the only stage where you routinely have to think at both scales in the same sentence. Row height and track pitch here belong to this book’s teaching library; your own library will differ, and the tool reads them from your technology data rather than guessing.

Do not confuse these

Table 1.1 Term pairs that beginners mix up, and the one question that separates them
ThisNot thisHow to tell them apart in one question
DieCoreDoes it include the ring that holds power rings, I/O and the seal ring? Then it is the die. The core is only the cell-legal region inside it.
Logical hierarchyPhysical hierarchyDid a human write it in RTL, or did you choose it as a planning boundary? Modules are logical; blocks are physical and exist only after you commit them.
ModuleBlockCan it be planned, shaped and handed to a team on its own? Then it is a block. Until then it is a module inside its parent.
Standard cellHard macroIs it one row tall and reshapeable by the tools? Standard cell. Fixed size, blocks rows, arrives pre-built? Hard macro.
Signal routingPower and ground routingDoes the wire carry information or current? PG wiring is planned as a pattern of rings, meshes and rails; signal wiring is planned as topology and budgets.
UtilisationCongestionUtilisation is an area ratio you can compute by hand. Congestion is a wiring-demand result you must ask a router for. High utilisation makes congestion likely; it does not measure it.
AbstractFull blockDoes it contain the whole netlist, or only what the current task needs — boundary, pins, blockages, timing? The reduced view is the abstract.
EstimateSignoff resultWas it produced from a plan with no real clock tree and no real routes? Then it is an estimate, and it is allowed to be wrong. Say so when you report it.
Block boundaryBlock originThe boundary is the outline the block occupies; the origin is the coordinate reference its internal objects are measured from. Both can be changed, and confusing them moves everything by a constant.
A chip plan is a division of measured area, not a drawing. Get the measurement and the division right and the drawing follows; get them wrong and no amount of drawing helps.

1.2 The concepts, built in dependency order

The rest of this chapter builds the subject one idea at a time, in the order the ideas depend on each other. Read the subsections in sequence the first time. Afterwards, each one is short enough to be re-read on its own.

1.2.1 What design planning is for

Design planning is an integral part of the path from register-transfer level (RTL) description to the final layout data. It exists for two reasons.

The first is feasibility. You want to know early — while changes are still cheap — whether a given implementation strategy can work. Is this die big enough? Can these blocks be placed so that the critical paths stay short? Will the wires fit? A planning run answers those questions in hours, using estimates, instead of finding the answer weeks later using a full implementation.

The second is divide and conquer. A design with millions of cells is expensive to process as one flat object. Splitting it into smaller, more manageable pieces lets separate teams work on separate blocks in parallel, from RTL all the way through physical implementation, and lets the tools work on one piece at a time. Working with smaller blocks — and reusing one block in several places — reduces overall runtime.

WHY?

Why not just implement the whole chip flat and skip planning? For a small design you sometimes can, and the tool supports flat flows. But three things push large designs towards a planned hierarchy: the design may need excessive computing resources to process flat; some blocks may arrive late and you need a methodology that absorbs late changes to one block without disturbing the schedule of the others; and the design may contain hard intellectual-property macros such as RAMs, or a block that was implemented before and can be converted and reused. If any of those is true of your project, a hierarchical plan is not a luxury.

Planning buys two things you cannot buy later: an early answer about feasibility, and a legitimate way to work on many pieces at once.

1.2.2 What floorplanning actually is

Floorplanning is the concrete work inside design planning. It means: partitioning logical modules into physical blocks; sizing and placing those blocks; performing a floorplan-level placement of macros and standard cells; and creating a power plan. The purpose is to make every downstream physical step more efficient, so that the design can be optimised robustly rather than rescued repeatedly.

An effective floorplan helps timing close, because placing blocks well makes critical paths short and reduces routing congestion. The difficulty is that the two goals fight each other. You want a small, area-efficient footprint, because area is money. You also want enough space left for routing, because wires need room. A floorplan that is too generous wastes silicon on every chip ever shipped. A floorplan that is too tight cannot be routed, and you will discover that after weeks of work.

Floorplanning is also iterative by nature. A realistic sequence reshapes the blocks, creates a new cell placement, reallocates the timing budgets, re-checks top-level timing, and goes round again until the floorplan is good enough. Expect several passes. An engineer who describes the first floorplan as “done” has not yet measured it.

WHAT CHANGES IF…

…you add 10 % to the die instead of improving the plan? Every wafer costs the same to process, so cost per good die rises with area; yield falls as die area grows; and the longer wires that come with a bigger floorplan cost delay and switching power. The plan usually has more slack in it than the die does — which is why enlarging the die is the last lever a senior engineer reaches for, not the first.

Floorplanning is a negotiation between area efficiency and routability, settled by measurement and repeated until both sides are satisfied.

1.2.3 Area arithmetic: the calculation you must be able to do by hand

Everything physical starts from one ratio. Core utilisation is the total area occupied by all standard cells and macro cells divided by the total core area. It is expressed as a number between 0 and 1: a core utilisation of 0.80 means 80 % of the core area is used for cell placement at this stage, and the remaining area is available for routing and for the cells that later steps will add.

That definition is worth reading twice, because two details in it catch people out. First, macros count: a design that is 30 % SRAM by area has far less standard-cell freedom than its cell count suggests. Second, it describes the area at this stage. Optimisation, clock-tree synthesis and hold fixing all add cells later, so a plan that starts at the utilisation you can just barely route has already failed.

Here is the arithmetic for this book’s teaching design, Nimbus-8, a small edge-inference system-on-chip. Every number in the table below is used again in later chapters, so it is worth following the calculation rather than skimming it.

Table 1.2 Nimbus-8 area budget, computed from the netlist
QuantitysymbolCalculationValue
Standard cells to placeNfrom the netlist9.90 M
Average standard-cell areaalibrary average for this design mix0.350 µm²
Standard-cell areaA_std9.90 × 10⁶ × 0.350 µm²3.465 mm²
SRAM macros72 instances × 0.0320 mm²2.304 mm²
DDR PHY macroone hard IP instance0.544 mm²
Area that must be placedA_place3.465 + 2.304 + 0.5446.313 mm²
First core estimate at 0.70A_core6.313 ÷ 0.709.019 mm² → 3.003 mm square
Core chosen after channel allowance3.20 mm × 3.20 mm10.24 mm²
Resulting core utilisationU6.313 ÷ 10.240.617
Die with 0.12 mm core offset(3.20 + 2 × 0.12)²3.44 mm × 3.44 mm = 11.83 mm²

Notice what happened between the two core numbers. Asking for a utilisation of 0.70 produces a 3.00 mm core — but that number quietly assumes the whole core can be filled with blocks. In a design with top-level logic sitting between the blocks, it cannot: some of the core must stay as channel. Once 2.09 mm² of channel is reserved, the honest core is 3.20 mm square and the honest utilisation is 0.617. Both numbers are correct; only one of them is a plan.

Three horizontal stacked bars drawn to a common scale. The first bar, labelled what must be placed, is divided into standard cells 3.465, SRAM macros 2.304 and a narrow segment for the PHY, totalling 6.313 square millimetres. The second bar, labelled the core you draw, is divided into block shapes 8.149 and channels and glue 2.091, totalling 10.24 square millimetres. The third bar, labelled the die you pay for, is divided into core 10.24 and an offset ring of 1.594, totalling 11.83 square millimetres, with an overall dimension line reading die area 11.83 square millimetres. A panel below states the formula: core utilisation equals area that must be placed divided by core area, equals 6.313 divided by 10.24 equals 0.617 or 61.7 percent, and notes that asking for 0.70 gives a 3.00 millimetre core estimate while the honest number lands at 0.617 on a 3.20 millimetre core. To the right, two conceptual sketches compare utilisation 0.62, where routing has room, with utilisation 0.85, where routing fights cells, using a low-to-high routing-demand colour legend and labelled as a conceptual sketch rather than tool output.
Figure 1.6 The three areas, drawn to one scale so their differences are visible: what must be placed, the core you draw around it, and the die you pay for. The right-hand pair is a sketch of intuition, not measured data — utilisation is arithmetic, congestion is a routing result, and only a router can tell you the second one.
MENTOR’S TIP

Write the area calculation into a text file with its assumptions — cell count, average cell area, macro list, target utilisation, channel allowance — and keep it beside the scripts. When someone asks in month four why the die is 3.44 mm, that file is the answer. Without it, the honest answer is “because it was 3.44 mm in month one”, which is how chips end up larger than they need to be.

Utilisation is an area ratio you can compute by hand before the tool is even open; the whole floorplan is built on it, so compute it yourself and know what it excludes.

1.2.4 Logical hierarchy, physical hierarchy, and the moment one becomes the other

A netlist has a logical hierarchy: modules inside modules, written by designers for reasons of readability, reuse and verification. It has no physical meaning at all. Nothing about a module says where it sits, how big it is, or what shape it takes.

A physical hierarchy is something you choose. You select certain logical modules and declare that each will be planned, shaped, placed, routed and handed over as a unit. That declaration is called committing the module, and the result is a physical block. Blocks are committed early in the floorplanning flow, precisely so that the reduced views built from them can be used to produce an initial floorplan and initial timing budgets.

What changes in the database when you commit? The module stops being merely a name inside its parent and becomes an object with a boundary, an origin, pins where its nets cross that boundary, its own area target, and its own constraints. It can then be opened separately, planned separately, and given to another engineer. That is a genuine change of kind, not a label.

Two aids exist for the decision itself. A hierarchy browser in the graphical interface lets you navigate the design hierarchy, examine the logical structure, and read per-module information such as utilisation, standard-cell count and pin count — which is exactly the data the decision needs. For the same information in text form, ask the tool for a hierarchy report. Then, once you have decided, you commit.

Two columns separated by a dashed vertical line. The left column, headed logical hierarchy: what the netlist says, is a tree rooted at nimbus_top with 9.90 million cells, 72 SRAM and 1 PHY, whose children are u_cpu_cluster with 4.60 million cells and 24 SRAM and its two indented children u_core_pair_0 and u_core_pair_1 each with 2.28 million cells and 12 SRAM, then u_npu_core_0 and u_npu_core_1 each with 1.45 million cells and 12 SRAM, u_isp with 1.85 million and 20 SRAM, u_periph_bus with 0.29 million and 4 SRAM, u_pmu with 0.05 million, u_ddr_phy_wrap with 0.02 million plus the PHY macro, and clock, reset and test glue with 0.19 million. The right column, headed physical hierarchy: what you commit to, lists four committed items: u_cpu_cluster as a sub-chip with two children, u_npu_core as one reference with two instances marked MIB, u_isp as a block, and u_soc_periph grouping periph_bus, pmu and the PHY wrapper. Below them a dashed panel titled one plan, two placements shows two boxes, u_npu_core_0 and u_npu_core_1. A highlighted panel states that clock and reset generation, test control and bus glue, 0.19 million cells, stay at the top level and live in the channels. A closing note explains that a logical module becomes a physical block only when committed.
Figure 1.4 The same design seen twice. Nothing on the left is a decision; everything on the right is. Read across: two identical NPU modules become one block reference placed twice, three small modules become one block of a useful size, and the glue becomes nobody’s block — which is why the plan must leave it somewhere to live.
Logical hierarchy is given to you; physical hierarchy is your decision, and committing is the moment the decision becomes a fact in the database.

1.2.5 Floorplan style: channelled or abutted

The tool supports complete hierarchical planning for both layout styles, and the choice interacts directly with your partitioning.

In an abutted floorplan the blocks sit directly against one another and there is no top-level logic between them. In a channelled floorplan there are gaps between blocks, and those gaps hold top-level logic — either a small amount or a large amount. There is also a narrow-channel variant for the case where the gaps are deliberately thin.

The consequence is simple and often missed by beginners: if your partition leaves cells at the top level, you cannot have an abutted floorplan, because those cells have nowhere to sit. Nimbus-8 keeps 0.19 M cells of clock generation, reset synchronisation and test control at the top, so Nimbus-8 is a channelled design, and 2.09 mm² of its core is reserved accordingly. Had we pushed every one of those cells down into blocks, an abutted style would have become possible — and the design would have had a smaller core but stiffer block interfaces.

Choose the style and the partition together: leftover top-level logic and an abutted floorplan cannot both be true.

1.2.6 Deciding where the boundaries go

Partitioning is the highest-leverage decision in the whole planning stage, and it is made with judgement informed by four factors.

Table 1.3 The four partitioning factors, and what each one asks you to do
FactorWhat it asksWhat you do about it
SizeAre the blocks of similar size?Group small modules together; divide large ones when it is appropriate to do so.
FunctionDoes the cut follow the functional units your verification and simulation people work with?Partition along functional units, and watch top-level connectivity and block pin counts to avoid congestion and timing problems.
Floorplan styleDoes the physical hierarchy support the style you intend?Different styles need different hierarchies: abutted has no top-level logic, channelled has a small or large amount.
Common hierarchy with synthesisDoes the physical hierarchy match the one used in the synthesis tool’s topographical mode?Keep them the same, so that scan-chain description data can be exchanged between block level and top level.

Read those four in order and a rhythm appears: get the sizes comparable, respect function, match the style, align with synthesis. Figure 1.7 turns the same four factors into something you can walk through module by module.

A decision tree with five diamond-shaped questions arranged vertically, each with a yes branch continuing downward and a no branch leading right to a highlighted corrective action. The questions are: is its size similar to your other candidates, with the no branch reading divide the oversized ones and group the small ones, then ask again; is it a functional unit your verification and simulation people use, with the no branch reading re-cut along function or you will fight the verification flow; is its interface pin count modest for its boundary length, with the no branch reading expect pin and route congestion, re-cut or plan feedthroughs early; does the leftover top-level logic suit your intended floorplan style, with the no branch reading abutted style needs no top-level logic while channelled style allows it; and does this physical cut match the synthesis hierarchy, with the no branch reading align them or block-level and top-level scan data will not exchange. All five yes branches lead to a final dark box reading commit it as a physical block and give it a target area or utilisation. A side note explains that size and grouping come first because they change everything downstream, and that the synthesis-hierarchy check is last but never optional.
Figure 1.7 A walkable version of Table 1.3. The order is deliberate: size and grouping change every later answer, so they are asked first. Every exit on the right is a reason to redraw the boundary, not a reason to carry on and hope.
WHAT CHANGES IF…

…you commit five small blocks instead of grouping them into one? Each block brings a boundary, a pin set, an abstract view, a timing budget, a set of checks and a person who owns it. Five of those for 0.36 M cells is a poor trade: the pins alone can cost more routing resource than the logic saves. This is why grouping is listed as a factor in its own right rather than as an afterthought.

Partition for comparable size and honest function first; the tool will implement whatever cut you commit to, including a bad one.

1.2.7 More than two levels of hierarchy

Many tools are limited to two levels of physical hierarchy — top and block. Large system-on-chip designs frequently need more, and the tool provides comprehensive support for multiple levels at the same time, which is what makes it possible to treat u_cpu_cluster as a block that is itself a parent. You can enable or disable specific blocks and levels of hierarchy for planning with the set_editability command, which is how you keep a large multi-level design manageable while working on one part of it.

Support for extra levels is not a single feature; it appears in every planning function, and it is worth knowing where:

You can also view, analyse and edit any level in full-chip context, choosing to see the top level alone or several levels at once. When several levels are shown, interactive routing behaves as though the design were flat; when you finish, the routes are pushed into the children and the hierarchical pins are added automatically.

Three panels showing successive levels of hierarchy, connected by dashed projection lines like an exploded view. Level 1, labelled nimbus_top, is the full die plate with five children and channels, with the CPU cluster block outlined in a highlight colour. Level 2, labelled u_cpu_cluster, a block that is also a parent, shows the highlighted block enlarged with two children side by side, u_core_pair_0 and u_core_pair_1, separated by a highlighted sibling channel. Level 3, labelled u_core_pair_0, leaf level with rows, cells and macros, shows six SRAM macros and five placement rows filled with standard cells. Below, three labelled bands define the interfaces a multi-level plan must serve: parent to child, a top-level net that has to reach a pin inside a child block; child to parent, a block output that has to reach top-level glue or another level; and sibling to sibling, two blocks at the same level talking across a channel. A closing note explains that each level constrains the one above it, that a shape constraint on u_core_pair_0 becomes one on u_cpu_cluster and then on nimbus_top, and that planning is top-down for area and bottom-up for feasibility.
Figure 1.8 One design, three levels, and the three kinds of interface that appear as soon as a block becomes a parent. The exploded view is the mental picture to keep: constraints travel upward from the leaves, area targets travel downward from the top, and the plan is finished when the two directions agree.
Extra levels of physical hierarchy are supported everywhere in the flow, and every level you add is another set of parent, child and sibling interfaces to plan.

1.2.8 One block, many placements: multiply instantiated blocks and feedthroughs

When the same block appears more than once in a design it is a multiply instantiated block, universally abbreviated MIB. Nimbus-8 has one: a single NPU (neural processing unit) core reference placed twice. You plan it once and place it twice, which is one of the strongest runtime and effort savings available in a hierarchical flow.

The saving comes with a constraint that beginners consistently underestimate. Because every instance is the same block, the pin placement must work for all of them: the algorithm determines a placement that suits every instance and makes the pin positions identical on each. A pin location that is ideal for instance 0 and awkward for instance 1 is not a legal location at all. The same applies to feedthroughs — the global router creates them across MIBs, decides which can be reused, and ties unused ones off to power or ground.

A feedthrough is a path provided through a block for a signal the block does not use. Without it, a net that needs to get from one side of the die to the other must detour around every block in the way, which costs wire length, delay and routing resource in the channels — often exactly where they are scarcest.

A schematic figure. On the left, a dashed context box labelled u_cpu_cluster contains a D flip-flop symbol and the caption drives both instances. In the centre, two identical block rectangles labelled u_npu_core_0 and u_npu_core_1 each carry four block pins at identical positions on both left and right edges, labelled p0 to p3. Inside each block, a wire from pin p1 passes through a buffer symbol into the D input of a D flip-flop symbol whose Q output continues to the right edge. Across the lower part of each block a straight highlighted line runs from the left edge to the right edge labelled feedthrough, logic untouched. On the right, a dashed context box labelled u_soc_periph receives both the ordinary signals and the feedthrough net. A legend distinguishes a signal used by the block, a feedthrough that passes through untouched, and a block pin. A closing note explains that the two instances are the same block placed twice, that every pin must sit at the same place on every instance, that any feedthrough exists on both, and that a pin position suiting one instance but not the other is not a legal pin position at all.
Figure 1.9 The MIB bargain, drawn with real schematic symbols so that the electrical meaning is visible: the same interface on every instance, in exchange for planning the block once. The highlighted line is a feedthrough — a signal that enters and leaves without being used inside.
A MIB is one plan used many times, so every pin and every feedthrough must be legal for every instance simultaneously.

1.2.9 Sharing the clock period: timing budgets

Here is the idea that makes hierarchical planning possible at all. Two blocks that exchange a signal cannot be optimised independently unless somebody first decides how much of the clock period each of them is allowed to consume. That decision is a timing budget.

The tool estimates timing at the hierarchical interfaces and creates budgets for the sub-chips, so that each block team receives ordinary timing constraints describing its own slice and can then work alone. Figure 1.10 shows what the arithmetic looks like for one path in Nimbus-8: a 625 ps clock period, minus the clock uncertainty and the capture flip-flop’s setup requirement, leaves 550 ps to be divided between the launching block, the top-level channel and the capturing block.

Three panels. The top panel is a schematic of one timing path drawn with standard symbols: inside a zone labelled u_cpu_cluster a D flip-flop labelled FF_A launch drives an AND gate; the path crosses a dashed block-pin boundary into a zone labelled top level containing two buffer symbols; it crosses a second block pin into a zone labelled u_npu_core_0 and reaches the D input of a D flip-flop labelled FF_B capture. A side note lists clk_cpu at 1.60 gigahertz, a period of 625 picoseconds, uncertainty of 45 picoseconds, setup of FF_B of 30 picoseconds, and states that 625 minus 45 minus 30 leaves 550 picoseconds to share. The middle panel is a square-wave clock waveform of four periods with the first rising edge labelled launch edge, the second labelled capture edge, and a dimension line marking 625 picoseconds between them. The bottom panel is a horizontal budget bar divided into three proportional segments: 190 picoseconds inside u_cpu_cluster, 150 picoseconds in the top-level channel, and 210 picoseconds inside u_npu_core_0, spanning a dimension line reading 550 picoseconds of usable period. A closing note explains that each block team receives its slice as an ordinary constraint set and never sees the other blocks, and that if the channel needs 200 picoseconds instead of 150 then someone must give up 50 picoseconds or the floorplan must change.
Figure 1.10 A budget is a contract, and this is what it contains. The three slices sum to the usable period exactly — which is why a budget cannot be improved for one owner without being worsened for another, or without changing the floorplan that set the channel delay in the first place.
A NOTE ON HONESTY

Budgets are built from estimated interconnect, with no real clock tree and no real routing. They are an educated forecast, not a signoff result, and they will be revised. Reporting an estimate as though it were signoff timing is one of the fastest ways for a junior engineer to lose credibility; saying “this is a planning estimate, and here is the assumption behind it” is one of the fastest ways to earn it.

A timing budget divides one clock period among separate owners so that they can work in parallel; it is an estimate, and everyone downstream needs to know that.

1.2.10 The shape of the flow

You now have every concept needed to read the flow itself. Design planning is performed during the first stage of the hierarchical flow, after the initial netlist is available from synthesis, and it does three things: it partitions the design into blocks, it generates hierarchical physical constraints, and it allocates top-level timing budgets down to the physical blocks.

Figure 1.5 lays the whole sequence out with the command that drives each step and — just as important for a beginner — what the design database has gained by the time the step is finished. Do not try to memorise it. Read it as a map, and notice three things about its shape.

First, the physical comes before the temporal: shapes, macros, power and pins are settled before timing is budgeted, because the budget depends on distances that do not exist until the shapes do. Second, abstracts appear twice, once for placement and once for timing, because the two tasks need different reduced views of the same block. Third, the sequence is a loop, not a line: a bad budget sends you back to the floorplan, and the last step of a first pass is usually the first step of a second one.

A numbered vertical flow of fourteen steps. The left column names the action and the command; the right column, connected by dotted leaders, states what the design database gains. The steps are: read the design data with read_verilog_outline, gaining an outline netlist with hierarchy and connectivity and cell detail on demand; initialise the floorplan with initialize_floorplan, gaining die and core boundary, placement rows and routing tracks; place the input-outputs and bumps with place_io, gaining legal pad and bump locations and written-out I/O constraints; explore and commit blocks with commit_block, so logical modules become physical blocks that can be planned separately; create placement abstracts with create_abstract, gaining a light view of each block with boundary, pins and blockages; read top and block power intent with load_upf, gaining supplies, power domains and voltage areas at both levels; shape the blocks with shape_blocks, so each block gets a rectangular or rectilinear shape and a location; create the initial placement with create_placement, so macros and standard cells are placed well enough to measure; plan the power network with the power planning commands, gaining rings, meshes and rails generated from pattern-based strategies; plan buses and repeaters with the interconnect planning commands, gaining bundles, topology plans, repeater locations and routing corridors; plan the hierarchical interfaces with place_pins, gaining block pins and feedthroughs placed where routing wants them; create block timing abstracts with create_abstract, gaining a timing view of each block for top-level analysis; budget the timing with estimate_timing, gaining one constraint set per block split from the top-level constraints; and write out the design data, handing block plans and constraints to the implementation teams. A closing line notes that the checking command runs between these steps, not after them.
Figure 1.5 The hierarchical planning flow, with what each step leaves behind. Later chapters of this book work through these steps in this order, so this figure is also the table of contents of your next few months.
Planning settles space before it settles time, builds reduced views of blocks so that large designs stay tractable, and expects to be run more than once.

1.3 Inputs, outputs and readiness

What has to exist before planning starts

Table 1.4 Inputs to a hierarchical planning run, and what each one is for
InputWhy planning needs itConsequence if it is wrong or missing
Gate-level netlist from synthesisThe list of cells, macros and nets to be divided and placed. Planning reads it as an outline view, which keeps the hierarchy and connectivity available while deferring cell-level detail until it is needed.No cell counts, so no honest area budget; a netlist from a different RTL revision silently plans the wrong chip.
Reference and technology dataCell and macro geometry, layer definitions, preferred routing directions and site definitions — the source of row height, track pitch and legal placement.Layer directions or tracks missing, and the floorplan cannot be initialised meaningfully.
Timing constraintsClocks, their periods and the operating conditions to analyse. Budgeting cannot divide a period it has not been told about.Unconstrained endpoints, meaningless budgets, and a plan optimised for a clock nobody will use.
Power intentSupplies, power domains and voltage areas, at the top level and at block level. Shaping and power planning both consume it.Voltage areas cannot be shaped or powered correctly; multivoltage checks fail late.
Per-block file mappingWhich constraint file and which power-intent file belong to which block. The abstract-creation steps expect this mapping to be complete.A block with no listed constraint or power file blocks abstract creation for the whole design.
Area or utilisation target per blockWhat the shaper sizes each block from.Shaping fails or produces nonsense — the single most common beginner error in this stage.
Advanced-node floorplan rules (if applicable)Node-specific spacing, enclosure, halo, width, density and area rules that a modern floorplan must satisfy.A floorplan that looks fine and violates the technology.

Assumptions you are making, whether you say so or not

Write each of these down with its value. An assumption on paper is a decision; an assumption in your head is a future argument.

Preflight checklist

BEFORE YOU START A PLANNING SESSION
  1. Netlist revision recorded, and it matches the constraint revision.
  2. Technology data loaded; layer directions set; both horizontal and vertical routing layers present.
  3. Cell count and macro inventory extracted, and the area budget computed and saved with its assumptions.
  4. Target utilisation and channel allowance chosen deliberately, and written down.
  5. Candidate partition listed module by module, with each module’s cell count, macro count and pin count.
  6. Floorplan style decided, and consistent with the amount of logic left at the top level.
  7. Per-block constraint and power-intent files listed for every block you intend to commit.
  8. The pre-floorplan validation gate run and clean.

What you get out

Planning changes the design database, and it is worth being precise about what appears in it. After a full pass you have: a die and core boundary with placement rows and routing tracks; committed blocks with boundaries, origins and pins; reduced views of each block for placement and for timing; block shapes and locations; an initial macro and cell placement; a power plan generated from patterns and strategies; planned buses, repeaters and routing corridors; placed hierarchical pins and the feedthroughs that go with them; one timing-constraint set per block; and written-out data for the implementation teams.

You also get something that is not a file: a defensible answer to the question “can this be built?”. That answer is the real deliverable.

When planning is premature, unsafe or misleading

Table 1.5 Conditions that make a planning result untrustworthy
ConditionWhy it matters
The netlist is not from a settled RTL revisionCell counts move, and every area number moves with them. Plan anyway if you must, but label the result as exploratory.
Major macros are still unknownMacro area dominates the budget. A missing 0.5 mm² memory is 5 % of this chip’s core.
No target area or utilisation for one or more blocksShaping has nothing to work from, and the failure often looks like an unrelated overlap error.
Layer directions or tracks not setRows and tracks define what “fits”. Without them, area feedback is fiction.
Constraints have unconstrained clocks or missing cornersBudgets cannot be produced for what has not been constrained, and the ones you do get will be optimistic.
The physical hierarchy disagrees with synthesisLegal, and it will plan — but scan data will not exchange between levels, and you will find out much later.
Results are being reported as signoff qualityThey are estimates. Presenting them otherwise causes decisions that cannot be justified when real timing arrives.
Planning is only as trustworthy as its inputs; state the assumptions with the result, every time.

1.4 The guided workflow

This section walks the flow end to end at survey level, then treats in detail the four commands that belong to this chapter. The deeper commands are named here so that you can see where they fit, and taught properly in the chapter that owns them — a command is best learned once, in context, not twice in outline.

1.4.1 The fourteen steps, and where each is taught

Table 1.6 The planning flow of Figure 1.5, with its commands and its home chapter
#StepCommandTaught in
1Read the design dataread_verilog_outlineChapter 4
2Initialise the floorplaninitialize_floorplanChapter 4
3Place the I/Os and bumpsplace_ioChapter 6
4Explore the hierarchy and commit blocksexplore_logic_hierarchy, commit_blockChapter 8
5Create block placement abstractscreate_abstractChapter 8
6Read top- and block-level power intentload_upfChapters 3 and 10
7Shape the blocksshape_blocksChapter 9
8Create the initial placementcreate_placementChapter 9
9Plan the power networkpower-planning commandsChapter 10
10Plan buses and repeatersinterconnect-planning commandsChapter 11
11Plan the hierarchical interfacesplace_pinsChapter 13
12Create block timing abstractscreate_abstractChapter 14
13Budget the timingestimate_timingChapter 14
14Write out the design datawrite and save commandsChapters 4 and 8

Three topics sit alongside the main line rather than inside it: blocks whose contents do not exist yet (Chapter 5), designs stacked in three dimensions (Chapter 7), and the planning of clock distribution across blocks (Chapter 12). The interface conventions, scripting and monitoring that make all of this comfortable to drive are Chapter 2.

1.4.2 Validation: the gate before every step

Design planning has a checking command, and the single most useful habit you can form in this chapter is to run it before a step rather than after it. You specify the command with the -checks option followed by one or more check keywords, and the tool performs those checks on the current design:

icc2_shell> check_design -checks {dp_pre_floorplan}

Each planning keyword guards a particular step. Table 1.7 lists them with what they examine, and Figure 1.11 shows the same information positioned along the flow.

Table 1.7 The design-planning check keywords and what each one examines
KeywordWhat it checks
dp_pre_floorplanThat the technology file information is correct, that layer directions are set, and that the design contains both horizontal and vertical layers.
dp_pre_create_placement_abstractThat the constraint mapping specifies a power-intent file for all blocks, and that the outline-view netlist files are in place for the blocks.
dp_pre_block_shapingThat a target utilisation or area exists for all black boxes; that there is at least one block or voltage area to shape; that the core area and block boundaries are valid; that the block grid is set if the design contains multiply instantiated blocks; and the multivoltage checks related to shaping.
dp_pre_macro_placementThat block shapes do not overlap; that blocks and voltage areas lie inside their parent boundaries; basic placement-constraint checking such as overlapping or out-of-bounds relative-location constraints, macro width and height against the FinFET grid, and macro orientation; that each block has a logical hierarchy; block, voltage-area and movebound utilisation; and the multivoltage checks related to placement.
dp_pre_power_insertionThat the preferred routing direction is set for the routing layers, and that tracks exist for the routing layers.
dp_pre_pin_placementPin-constraint checks — topological constraints, individual constraints, constraints propagated from individual pins, bundle and block pin constraints, size-related constraints, pin guide and pin blockage constraints, routing guide and routing blockage constraints; that each layer’s routing direction in a topological constraint is consistent with the block edge constraints; consistent edge directions in topological constraint pairs; off-edge pins that are part of a feedthrough constraint; possible overlaps with existing internal block objects such as route blockages, pin blockages, fixed pins and prerouting; plus the multiply-instantiated-block pin-placement checks.
dp_pre_push_downThe alignment checks for multiply instantiated blocks.
dp_pre_create_timing_abstractThat the constraint mapping specifies timing-constraint files for all blocks.
dp_pre_timing_estimationThat top and block levels have defined modes and corners; that top-level modes and corners have corresponding block-level ones; and that the top level contains at least one clock, at least one scenario using a non-estimated corner, and a corner with parasitic parameters. With placement abstracts present, it also confirms that the abstracts exist.
dp_pre_budgetingThat the estimated corner is available, plus the same checks as timing estimation.
dp_floorplan_rulesThe segment parity rule, the macro spacing rule, and the FinFET grid checks.
A vertical rail of eleven gate markers, each drawn as a downward triangle on a line. Beside each gate is the check keyword and the moment it guards, and to the right a panel stating what it protects. The gates in order are dp_pre_floorplan before initialising the floorplan, protecting technology data, layer directions and the presence of both horizontal and vertical layers; dp_pre_create_placement_abstract before placement abstracts, protecting power-intent files and outline netlists listed for every block; dp_pre_block_shaping before shaping blocks, protecting target area or utilisation, valid core and block boundaries and the block grid for multiply instantiated blocks; dp_pre_macro_placement before the initial placement, protecting against overlapping shapes, blocks outside their parents and unsound placement constraints; dp_pre_power_insertion before power planning, protecting preferred routing directions and tracks; dp_pre_pin_placement before placing block pins, protecting pin constraints that must agree with edge directions and existing blockages; dp_pre_push_down before pushing objects into blocks, protecting alignment between instances of a multiply instantiated block; dp_pre_create_timing_abstract before timing abstracts, protecting the list of timing-constraint files; dp_pre_timing_estimation before estimating timing, protecting modes, corners and the abstracts they need; dp_pre_budgeting before writing budgets, protecting the availability of an estimated corner; and dp_floorplan_rules whenever the floorplan changes, protecting advanced-node floorplan rules and the FinFET grid. A closing line warns that a gate that passes is not a promise of quality, only that the step is legal to run.
Figure 1.11 The gates, in flow order. Two habits follow from this figure: run the gate for the step you are about to take, and re-run dp_floorplan_rules after any floorplan edit. Both cost seconds and routinely save hours.

1.4.3 A first session, step by step

The workflow below is the one this chapter can complete on its own: understand the design, decide the partition, and prove readiness. Steps that belong to later chapters are marked as such and deliberately not expanded.

  1. Open the design. Library setup, block opening and the shell itself are Chapter 2. For now, assume a session with the design open.
  2. Read the hierarchy. Produce a hierarchy report and, if you have the graphical interface, the hierarchy browser. Record for each candidate module: cell count, macro count, pin count.
  3. Compute the area budget by hand (Table 1.2). Do not skip this because the tool can report utilisation later; the point is that you know the number before the tool tells you.
  4. Decide the partition using Table 1.3 and Figure 1.7. Write the decision and its reasons in the script as comments.
  5. Decide the floorplan style and reserve channel area consistent with the top-level logic you are leaving behind.
  6. Scope your session with set_editability if the design has several levels and you only intend to work on part of it.
  7. Run the readiness gate for the step you are about to take — here, dp_pre_floorplan.
  8. Read the message summary, not just the last line. Fix the rules that were reported, and re-run until the gate is clean.
  9. Only then proceed to floorplan initialisation (Chapter 4).

1.4.4 Command reference for this chapter

Four commands are genuinely part of this chapter’s work. Each is presented the same way: what it is for, what its syntax says in plain English, what must be true before you use it, a small realistic example, what to expect, how to verify, what goes wrong, and how to see the rest of its options.

report_hierarchy — see the structure you are about to divide

Purpose. Displays the logical and physical reference hierarchy for a block, so you can see what modules exist, which are already physical blocks, and where the leaves are.

Syntax in plain English. report_hierarchy with no arguments reports on the current block, showing both physical and logical references down to leaf level. -block names a different block to report on. -physical_context restricts the report to physical blocks and leaf modules, hiding internal modules. -hierarchical unfolds repeated blocks or modules that would otherwise be reported once. -no_leaf leaves the leaf modules out. -nosplit stops long fields from being wrapped onto a second line, which matters if you intend to post-process the report with a script.

Prerequisites. A design open in the session.

# What does the hierarchy look like, without the leaf-cell noise?
icc2_shell> report_hierarchy -no_leaf

# Only the physical picture: blocks and leaf modules, no internal modules.
icc2_shell> report_hierarchy -physical_context -no_leaf

# Unfold repeated instances instead of folding them into one line.
icc2_shell> report_hierarchy -hierarchical -no_leaf

Expected result. An indented tree. Blocks are printed with their full name, which distinguishes them from internal modules; leaf modules are shown with the library they come from. Repeated blocks or modules are folded into a single appearance unless they are bound to different views, or unless you ask for the unfolded form.

Verification step. Compare the tree against the module list you were given by the front-end team. Two mismatches matter: a module you expected to see and cannot, and a module that appears with a different reference than you expected.

Common mistakes. Reading the folded report as though it showed instance counts — a block used twice appears once by default. Reporting the wrong block because the current block is not the one you think it is. Post-processing a report captured without -nosplit and losing half of the long names to line wrapping.

Finding the rest. report_hierarchy -help lists the options; man report_hierarchy gives the full description.

get_design_checks — find out which checks exist

Purpose. Creates a collection of the available checks, both the ones predefined by the tool and any you have defined yourself. Use it when you want to know what is available rather than guessing a keyword.

Syntax in plain English. get_design_checks with a pattern returns the checks whose names match it. -filter narrows the collection using a Boolean expression over check attributes; -regexp treats the pattern as a regular expression rather than a wildcard; -nocase ignores case; -exact turns pattern matching off, which is what you need when a name itself contains * or ?; -quiet suppresses the warning when nothing matches.

Prerequisites. A session with the tool loaded. You do not need a floorplan.

# Which planning checks does this version of the tool provide?
icc2_shell> get_design_checks dp_*

# Everything, when you want to browse the whole list once.
icc2_shell> get_design_checks

# Which attributes can I filter on?
icc2_shell> list_attributes -class ems_check

Expected result. A collection of check objects. Predefined checks are those the tool ships with; user-defined checks are ones created with the check-strategy command. Some predefined checks are single checks; others are collections of several, so running one keyword can run a group.

Verification step. Confirm that the keyword you are about to pass to the checking command appears in this list. That single step removes an entire class of confusing failures.

Common mistakes. Assuming a keyword that existed in one release exists in the next; typing a keyword from memory rather than from the list; and forgetting that names are patterns by default, so a stray wildcard can return more than you meant.

Finding the rest. get_design_checks -help, then man get_design_checks.

MENTOR’S TIP — VERSION-DEPENDENT BEHAVIOUR

The set of available checks, and what each one examines, can change between tool releases. That is a good thing — checks get stronger — but it means a script that hard-codes a keyword can fail after an upgrade. Ask the tool which checks exist rather than trusting a list copied from an older project, including the list in Table 1.7.

check_design — prove the design is ready for the next step

Purpose. Runs predefined or user-defined checks on the current design. The messages produced are captured into a message database and a text log, and a summary of them is reported.

Syntax in plain English. -checks takes a list of one or more check names and is required. -ems_database names the database file the errors, warnings and information messages are stored in; if you do not give one, a default file name is used, and an existing file of that name is overwritten. -log_file names the text log to write; by default the tool generates one whose name carries a timestamp, in the working directory. -open_message_browser opens the graphical message browser on the results.

Prerequisites. The design open, and whatever data the specific check needs — technology data for the pre-floorplan check, blocks and targets for the shaping check, and so on. A check with nothing to inspect reports nothing useful.

# The gate before floorplan initialisation.
icc2_shell> check_design -checks {dp_pre_floorplan} \
               -log_file reports/ch01_pre_floorplan.log

# Two gates at once, into a named message database.
icc2_shell> check_design -checks {dp_pre_floorplan dp_floorplan_rules} \
               -ems_database reports/nimbus_pre_fp.ems \
               -log_file reports/nimbus_pre_fp.log

Expected result. A report header naming the command, the options you passed and the design, followed by the checks as they run and then a message summary: one line per rule, giving the rule identifier, its type — error, warning or information — the count, and the message text. A total line follows, and the message database is saved.

*** EMS Message summary ***
-----------------------------------------------------------------
Rule    Type  Count  Message
-----------------------------------------------------------------
...     Error   n    <one line per rule that fired>
...     Warn    n    <one line per rule that fired>
-----------------------------------------------------------------
Total N EMS messages : n errors, n warnings, n info.

Verification step. Two questions, in this order. Is the error count zero? And of the warnings, which ones are about the step you are about to run? A warning that names the very data the next command consumes is not a warning; it is an error that has not happened yet.

Common mistakes. Running it after a step instead of before. Reading only the total line — the rule identifiers are the actionable part. Letting the default database name overwrite the previous run’s evidence when you wanted to compare two runs. Passing a keyword that does not exist in your release. And treating a clean gate as proof of a good floorplan: it proves legality, not quality.

Finding the rest. check_design -help for the options, man check_design for the description, and get_design_checks for the keywords.

set_editability — decide which part of a big design you are working on

Purpose. Changes the hierarchical edit control of specified blocks, or their reference edit lock. In a design with several levels of physical hierarchy this is how you make one region editable for planning and leave the rest alone.

Syntax in plain English. -blocks lists the blocks whose editability changes, relative to the current top-level context; with no -blocks, the current block is affected. -value true makes them editable — the default — and -value false makes them uneditable. -from_level applies the value from a given design depth downward, and -to_level from a given depth upward; each of these is mutually exclusive with the other and with -blocks. -edit_reference_lock switches the meaning from hierarchical edit control to locking or unlocking the physical blocks for edit. -verbose prints more detail. The command returns the number of blocks whose control changed.

Prerequisites. A design with the blocks in question present in the current context.

# Work on the CPU cluster only; leave the rest of the design alone.
icc2_shell> set_editability -blocks {u_cpu_cluster} -value true -verbose

# Freeze everything from the second level of hierarchy downward.
icc2_shell> set_editability -from_level 2 -value false

Expected result. An integer count of the blocks that changed, and a design in which only the intended part can be edited.

Verification step. Attempt a harmless edit inside a block you intended to freeze and confirm that the tool refuses it, and one inside a block you intended to open and confirm that it succeeds. Two seconds of checking is cheaper than an afternoon of wondering why an edit did nothing.

Common mistakes. Combining -blocks with a level option — they are mutually exclusive. Forgetting that the default is true, so a call meant to freeze something opens it instead. Confusing hierarchical edit control with the reference edit lock: the first governs this top-level context, the second locks the block itself. And leaving a design frozen at the end of a session, so that the next engineer inherits a design that mysteriously refuses to change.

Finding the rest. set_editability -help, then man set_editability.

HOW TO ASK THE TOOL INSTEAD OF GUESSING

Three habits cover most of what this book cannot: help command for a one-line description, command -help for the list of supported options, and man command for the full page. Use them whenever a book — including this one — and your installed version disagree. The version in front of you is the one that is right.

This chapter’s commands describe and verify rather than change: read the hierarchy, ask which checks exist, run the gate, and scope your session.

1.5 Worked example: the first planning session on Nimbus-8

The situation

You have joined the physical design team for Nimbus-8, an edge-inference system-on-chip. Synthesis has produced a first gate-level netlist. The architects want to know two things by Friday: how big the die will be, and how the work will be divided between the four engineers on the team. Nobody has drawn a floorplan yet.

The inputs you have been given are the netlist, the reference and technology data for an advanced FinFET node, a constraint file with four clocks, and a power-intent description with two supplies and one switchable area. The DDR PHY is a hard macro that has already been characterised. There is no timing result of any kind yet, and there will not be one until a plan exists.

Initial conditions and assumptions

Table 1.8 Recorded assumptions for this session (every later number depends on these)
AssumptionValue
Average standard-cell area for this design mix0.350 µm²
SRAM macro footprint (all 72 are the same compiled instance)0.0320 mm²
DDR PHY footprint0.544 mm² (1.60 mm × 0.34 mm)
Row height / routing-track pitch of the teaching library0.576 µm / 0.048 µm
Target block internal utilisation0.75
Core offset for power rings and I/O structures0.12 mm per side
Clock to be budgeted firstclk_cpu, 1.60 GHz → 625 ps

Step 1 — Read the hierarchy before touching anything

# What am I actually dealing with?
icc2_shell> report_hierarchy -no_leaf

From the report, and from per-module cell and macro counts, you build the inventory in Table 1.9. This table is the whole basis of the partition decision, so it is worth ten minutes of care.

Table 1.9 Module inventory from the netlist, with the area each module needs
ModuleCellsSRAMCell areaMacro areaNeeds at 0.75
u_cpu_cluster4.60 M241.610 mm²0.768 mm²3.171 mm²
u_npu_core_01.45 M120.508 mm²0.384 mm²1.189 mm²
u_npu_core_11.45 M120.508 mm²0.384 mm²1.189 mm²
u_isp1.85 M200.648 mm²0.640 mm²1.717 mm²
u_periph_bus0.29 M40.102 mm²0.128 mm²0.306 mm²
u_pmu0.05 M00.018 mm²0.023 mm²
u_ddr_phy_wrap0.02 M00.007 mm²0.544 mm²0.553 mm²
clock/reset/test glue0.19 M00.067 mm²stays at top
Total9.90 M723.465 mm²2.848 mm²

Two facts jump out of that table. The CPU cluster is 2.7 times the size of the next largest candidate. And three modules — the peripheral bus, the power-management unit and the PHY wrapper — are each too small to justify their own block.

Step 2 — The first partition attempt, and why it is wrong

The obvious first cut is one block per top-level module: seven blocks, no thought required. Walk Figure 1.7 over it and it fails three of the five questions.

Two die plates side by side with an arrow labelled revise between them. The left plate, headed first cut v1, seven blocks, no grouping, no split, shows a wide flat CPU cluster across the top, two separate NPU blocks, an ISP, a PHY wrapper, and two very small blocks labelled periph and pmu, with four numbered markers keyed to a list below: the CPU cluster is 2.60 by 1.22 millimetres so its tallest SRAM bank does not fit; the two NPU cores are separate references so they must be planned, budgeted and checked twice; three blocks under 0.4 square millimetres add boundary, pins and abstracts for very little logic; and no channel is left for the 0.19 million cells of top-level glue. The right plate, headed revised cut v2, five blocks, one of them a parent, two of them one MIB, shows the final Nimbus-8 arrangement with a squarer CPU cluster, two NPU cores of one reference, the ISP, a grouped SoC periph block, the DDR PHY macro along the bottom and shaded channel regions, with a list noting that the CPU cluster is 2.00 by 1.59 millimetres and hosts two committed children, that one NPU reference is placed twice giving one plan, one budget and one set of pins, that the three small modules are grouped into u_soc_periph of 0.34 square millimetres, and that 2.09 square millimetres of channel is left for glue, buses and repeaters. A closing note observes that nothing about the netlist changed between the two pictures, only where the boundaries were drawn.
Figure 1.14 Before and after, on the same die. The netlist is identical in both pictures; the difference is entirely in where the boundaries were drawn — and it changes the number of abstracts, budgets, pin sets and checks the team will carry for the rest of the project.

Step 3 — Size the core from the revised partition

With the partition settled, redo the arithmetic in the order that matters: cells and macros first, then a first core estimate, then an honest core after channel allowance.

# Area that must be placed
A_std   = 9.90e6 x 0.350 um2            = 3.465 mm2
A_sram  = 72 x 0.0320 mm2               = 2.304 mm2
A_phy   = 1 x 0.544 mm2                 = 0.544 mm2
A_place                                 = 6.313 mm2

# First estimate: what would a 0.70 core look like?
A_core(0.70) = 6.313 / 0.70             = 9.019 mm2  -> 3.003 mm square

# Block shapes at 0.75 internal utilisation
cpu 3.171 + npu 1.189 x 2 + isp 1.717 + periph 0.339 + phy 0.544
                                        = 8.149 mm2

# A channelled style needs channel area for 0.19 M cells of glue,
# plus buses, repeaters and PG access. Choose 3.20 mm square:
A_core  = 3.20 x 3.20                   = 10.240 mm2
channel = 10.240 - 8.149                = 2.091 mm2   (20.4% of the core)
U_core  = 6.313 / 10.240                = 0.617

# Die, with 0.12 mm of core offset on each side
die     = (3.20 + 0.24) squared         = 3.44 x 3.44 mm = 11.83 mm2

Now you can answer the architects’ first question with a number and a reason: 3.44 mm square, because 6.313 mm² of cells and macros must be placed, 8.149 mm² of block shapes hold them at 0.75 internal utilisation, a channelled style needs about a fifth of the core as channel, and the core offset adds 0.12 mm on every side.

Step 4 — Prove readiness before initialising the floorplan

# Which planning checks exist in this release?
icc2_shell> get_design_checks dp_*

# Scope the session to the part of the hierarchy being planned.
icc2_shell> set_editability -blocks {u_cpu_cluster} -value true -verbose

# The gate that guards floorplan initialisation.
icc2_shell> check_design -checks {dp_pre_floorplan} \
               -log_file reports/nimbus_pre_fp.log

Suppose the summary comes back with a small number of errors and a larger number of warnings. Read it like this, in plain English:

Table 1.10 Reading a check summary: what each line is telling you to do
TypeWhat it means hereWhat you do
ErrorThe next step cannot run correctly on this data — for example, a routing layer with no preferred direction.Fix it now. Errors from a pre-step gate are not advisory.
WarningSomething is unusual or incomplete. Some warnings are irrelevant to the step you are about to take; others name exactly the data it will consume.Triage by relevance to the next command, not by count.
InfoA statement about the design, such as a structure not being present.Read once. Keep the log; these lines are useful evidence later.
THE THIRD CATEGORY NOBODY WARNS YOU ABOUT

Errors stop you. Warnings ask for judgement. But the most dangerous planning result is the one that produces no messages at all and a poor plan: a legal floorplan with a block shaped 3:1, or a core at 0.617 utilisation with all the slack in the wrong corner. No gate will complain. Only measurement and a second opinion catch it — which is what the engineering-judgement step below is for.

Step 5 — What a senior engineer looks at next

With a clean gate and a defensible die size, the plan is not finished; it is ready to be criticised. These are the questions a senior engineer asks, in this order, and each of them is the subject of a later chapter:

  1. Are the block aspect ratios sane? The CPU cluster at 2.00 mm × 1.59 mm is fine; at 2.60 mm × 1.22 mm it was not, because its tallest macro bank did not fit. Macro-driven shape constraints are Chapter 9.
  2. Is the channel where the traffic is? 2.09 mm² of channel is worthless if it sits in the corner while the buses run across the middle. Bus and repeater planning is Chapter 11.
  3. Can the pins get out? Count the interface signals per block and compare with the boundary length available at your usable layers. Pin and feedthrough planning is Chapter 13.
  4. Does the MIB constrain anything unacceptably? Both NPU instances share one pin plan; if their neighbours differ, one instance will have a longer route. Chapter 13 again.
  5. Where will the clocks cross? Four clocks and two blocks that share one of them means clock distribution must be planned across boundaries, not per block. That is Chapter 12.
  6. Is the budget survivable? 190 / 150 / 210 ps looks balanced; whether the 150 ps channel share is realistic depends on the distance between the two block pins, which the floorplan has just fixed. Budgeting is Chapter 14.
  7. What happens when the DDR PHY grows? Hard IP changes late. Ask now which direction it can grow in without redrawing the plan.
The output of a first planning session is a number with a reason behind it, a partition with a justification, and a list of the seven things you have not yet checked.

1.6 Failure modes and debugging

Every entry below follows the same five-part shape: symptom, likely cause, diagnostic check, correction, prevention. Read them once now and again after your first real planning session, when at least three of them will have happened to you.

Table 1.11 Ten failures that catch beginners, and how to work through them
SymptomLikely causeDiagnostic checkCorrectionPrevention
Block shaping fails; blocks overlap or fall outside the parent boundary A block has neither a target area nor a target utilisation, so the shaper has nothing to size it from Run the shaping gate and read the rule identifiers; confirm every block, including black boxes, has a target Give every block a target area or utilisation, then re-run the gate before re-running shaping Treat “every block has a target” as part of committing a block, not as a later step
Two instances of the same block end up misaligned No block grid was set for a design containing multiply instantiated blocks The shaping gate checks for a block grid when MIBs are present; the push-down gate checks alignment Set the block grid, re-shape, and re-check alignment before pushing anything down Identify MIBs during partitioning — before shaping, not after
Floorplan initialisation produces rows but no usable tracks Layer directions not set, or the design lacks both horizontal and vertical layers The pre-floorplan gate reports exactly this; also inspect the technology data Fix the technology setup, then re-initialise the floorplan Make the pre-floorplan gate the first command of every planning script
Area feedback looks wonderful and is wrong Macros were omitted from the area budget, or an average cell area from a different design was reused Recompute by hand: cell count × average area + macro area; compare with the reported utilisation Rebuild the budget with the real macro inventory and re-size the core Keep the area calculation and its assumptions in a file next to the scripts
Abstract creation stops before it starts The per-block file mapping does not name a power-intent file, or an outline netlist, for some block The pre-abstract gate names the blocks with missing files Complete the mapping for every block, then re-run Generate the mapping from the block list programmatically so it cannot go stale
Budgeting produces nothing, or produces budgets nobody can meet Modes and corners are missing at one level, or the top level has no clock, no non-estimated corner, or no parasitic data Run the timing-estimation and budgeting gates; they check precisely these conditions Complete the mode, corner and scenario setup at both levels and re-run Set up modes and corners before the first budgeting attempt, not in response to its failure
An edit appears to do nothing The block is not editable in the current context, or its reference is edit-locked Re-issue the editability command with verbose output and read the count of blocks changed Open the intended scope, make the edit, and restore the scope afterwards Set editability explicitly at the top of a script and reset it at the end
Scan-chain data will not exchange between block and top level The physical hierarchy does not match the hierarchy used in synthesis Compare the committed block list against the synthesis hierarchy, module by module Align the two hierarchies — which usually means changing the physical partition Agree the hierarchy with the synthesis owner before committing any block
Everything is legal and the plan is still bad Legality is not quality: extreme aspect ratios, channels in the wrong place, pins on the wrong edge Measure: aspect ratio per block, channel area versus where the buses run, pin count versus boundary length Change the plan, not the die; re-shape and re-place, then compare against the previous pass Add “what would I criticise if this were someone else’s plan?” to your own review
Advanced-node rule violations appear after a small floorplan edit Node-specific floorplan rules and grid alignment were satisfied before the edit and not re-checked after it Re-run the floorplan-rules gate after every floorplan change, however small Repair the reported violations and re-check Bind the rules gate to the end of any script that edits the floorplan

The misleading one, in detail

The first row of Table 1.11 deserves its own walkthrough, because its apparent cause and its real cause point in opposite directions. Shaping fails. Two blocks overlap, one sits outside its parent, and the floorplan looks perfectly reasonable on screen. The obvious reading is that the core is too small — so you enlarge the die by 8 % and run again. It fails again, and now you also have more white space to justify.

The real cause is that one block had no target area and no target utilisation, so the shaper had nothing to size it from, and the two identical NPU instances had no block grid to align to. Neither of those is an area problem. Both are named directly by the shaping gate, in seconds, if you run it.

A three-panel diagnosis plate connected by arrows. The first panel, headed SYMPTOM, reads: block shaping stops with an error, two blocks overlap and one sits outside its parent boundary, and the floorplan looks fine on screen. The second panel, headed THE OBVIOUS GUESS, reads: the core is too small, so you enlarge the die by 8 percent and run again, and it still fails, now with more white space to explain. The third panel, headed THE REAL CAUSE, reads: one block had no target area and no target utilisation so the shaper had nothing to size it from, and the two identical NPU instances had no block grid to align to. Below, a four-step diagnostic order: re-run the shaping gate with check_design minus checks dp_pre_block_shaping; read the message summary because the rule identifiers name the missing constraint class; fix the constraint rather than the area by giving every block a target and setting the block grid for the multiply instantiated block; and re-run the gate and then the step, because a clean gate before a long command saves an hour of runtime. A closing panel states the lesson: an error message tells you where the tool gave up, not where you went wrong, and enlarging the die is attractive because it is easy, measurable and always does something, which is exactly why it hides missing-constraint bugs.
Figure 1.12 A diagnosis plate for the failure most likely to cost you a day. The lesson generalises: an error message tells you where the tool gave up, which is rarely where you went wrong.
Diagnose from the rule identifiers in the message summary, and never spend area to fix a constraint bug.

1.7 Hands-on mini lab

Goal

Produce a defensible die size and a justified partition for a small synthetic design, and prove that the design is ready for floorplan initialisation. No proprietary data and no completed floorplan are needed; the arithmetic is the lab.

Supplied assumptions

Table 1.12 Lab design “Vega-2” — everything you are given
ModuleCellsSRAM macrosInterface signals
u_dsp_core_00.90 M8420
u_dsp_core_10.90 M8420
u_codec2.60 M16610
u_io_bridge0.18 M2240
u_rtc0.02 M040
clock/reset glue0.10 M0

Average standard-cell area 0.350 µm²; SRAM macro 0.0320 mm² each; target block internal utilisation 0.75; core offset 0.10 mm per side; one clock at 1.25 GHz; the top-level glue must stay at the top level.

Steps

  1. Compute the cell area, macro area and total area that must be placed. Show units at every step.
  2. Compute a first core estimate at a target utilisation of 0.70, and state the square core side that follows.
  3. Compute the area each module needs at 0.75 internal utilisation, and total the block shapes.
  4. Decide the partition. Apply Figure 1.7 to every module and write one sentence of justification for each decision. Expect to divide one module and group two.
  5. Choose a channel allowance consistent with keeping 0.10 M cells at the top level, and state the resulting core, die and core utilisation.
  6. In a session with any small design open, list the available planning checks, then run the pre-floorplan gate and capture the log:
    icc2_shell> get_design_checks dp_*
    icc2_shell> check_design -checks {dp_pre_floorplan} \
                   -log_file reports/vega2_pre_fp.log
  7. Read the summary and classify every line as error, warning or information, and — for each warning — as relevant or not relevant to floorplan initialisation.

Expected observations

VERIFICATION CHECKLIST
  1. Every number carries a unit, and every area is in mm² or µm² consistently.
  2. Cell area plus macro area equals your stated total area to place.
  3. Your core side is stated to three decimal places before you round it, and the rounding is deliberate.
  4. Each partition decision has a written reason that names one of the four factors.
  5. Your channel allowance is a number, not the word “some”.
  6. The check log exists on disk, and you can say what each of its lines means.
  7. You can state, in one sentence, why the die is the size you chose.

Stretch task

Redo steps 1 to 5 with a target utilisation of 0.80 instead of 0.70, and with the codec growing by 15 % late in the project. Report the two die sizes side by side, and write two sentences on which risk you would rather carry: a larger die now, or a re-plan in month four. There is no single right answer — the exercise is to make the trade explicit, which is exactly what you will be asked to do in a real review.

1.8 Interview preparation

Sixteen questions, grouped by level. Read the question, answer it out loud, and only then read the model answer — the gap between the two is the part worth studying. Every model answer ends with what the question is really testing, because interviewers ask about design planning to find out how you think about tradeoffs, not whether you remember option names.

Beginner

BEGINNER

Q1. What is design planning, and what decision does it exist to support?

It is the stage between synthesis and implementation in which you divide a design into physically implementable pieces, size and place those pieces, plan their power and interfaces, and allocate timing budgets to them. It exists to support one decision above all: is this implementation strategy feasible — this die size, this partition, this floorplan — before anyone spends weeks of compute finding out. For large designs it also enables divide and conquer, so separate teams and separate tool runs can work on separate blocks in parallel.

What is being tested: whether you see planning as decision support or as “drawing rectangles”. A weak answer lists activities without naming the purpose, and cannot explain why the stage is worth its schedule.

BEGINNER

Q2. Explain the difference between the die and the core, and say what lives between them.

The die is the whole rectangle of silicon. The core is the region inside it where logic cells may be placed, set back from the die edge by the core offset. Between the two sits the ring that carries power rings, input/output structures and the seal ring that protects the die when it is separated from the wafer. No standard cells go there. On this book’s teaching design the core is 3.20 mm square, the offset is 0.12 mm per side, so the die is 3.44 mm square: the ring is 1.59 mm² — about 13 % of the die you pay for.

What is being tested: vocabulary precision, and whether you know that area you cannot place cells in still costs money. Weak answers use “die” and “core” interchangeably, which makes every later area statement ambiguous.

BEGINNER

Q3. Define core utilisation and state what it includes.

Core utilisation is the total area occupied by all standard cells and macro cells divided by the total core area, expressed between 0 and 1. It includes macros — which is the detail people forget — and it describes the area at the current stage, not the final area, because optimisation, clock-tree synthesis and hold fixing all add cells afterwards. A utilisation of 0.80 means 80 % of the core is used for cell placement now, with the rest available for routing and for what comes later.

What is being tested: whether you can be precise about a number you will quote daily. A weak answer says “how full the chip is”, which does not tell the interviewer whether you count macros or when the number is measured.

BEGINNER

Q4. What is the difference between a logical module and a physical block?

A logical module is a construct in the netlist, written for readability, reuse and verification; it has no physical properties. A physical block is a module you have chosen to plan, shape, place, route and hand over as a unit. The transition happens when you commit the module: it then has a boundary, an origin, pins where its nets cross that boundary, an area target and its own constraints, and it can be worked on separately. Blocks are committed early, so that reduced views of them can drive the initial floorplan and the first budgets.

What is being tested: whether you understand that physical hierarchy is a decision, not a property of the RTL. The misconception is that the RTL hierarchy “is” the physical hierarchy.

BEGINNER

Q5. What are placement rows and routing tracks, and why does a planner care about both?

Placement rows rule the core into stripes as tall as the standard cells, and a standard cell may only sit on a row, aligned to it. Routing tracks are the evenly pitched lines in the metal layers that wires are expected to follow. Rows determine how much logic fits; tracks determine how much wiring fits. A plan that satisfies one and ignores the other fails late: full rows with no track capacity is an unroutable design, and abundant tracks with insufficient rows is wasted silicon. Both come from the technology data, which is why the pre-floorplan check insists that layer directions are set and that both horizontal and vertical layers exist.

What is being tested: whether you connect area to routability. Weak answers describe rows only, which is the classic sign of someone who has read about placement but not about congestion.

BEGINNER

Q6. Why is a hard macro treated differently from a standard cell during planning?

A hard macro arrives pre-built: fixed size, fixed internal layout, usually much taller than a row, and it blocks the rows it covers. You place it; you cannot reshape or resynthesise it. Consequently macros drive the plan rather than follow it: they set the minimum height or width a block must have, they dictate where pins can be, they create channels around themselves, and their area is committed before any optimisation happens. On the teaching design, macros are 2.85 mm² of 6.31 mm² that must be placed — 45 % of it — so treating them as an afterthought would make every area estimate meaningless.

What is being tested: whether you appreciate that a large fraction of a modern die is not optimisable at all. The weak answer is “it is just a bigger cell”.

Intermediate

INTERMEDIATE

Q7. Which factors decide where a physical partition boundary goes?

Four. Size: aim for blocks of similar size, grouping small modules and dividing large ones where appropriate. Function: partition along the functional units used for verification and simulation, while watching top-level connectivity and block pin counts to avoid congestion and timing trouble. Floorplan style: different styles require different hierarchies — an abutted style has no top-level logic, a channelled style has a small or large amount. Common hierarchy with synthesis: if scan-chain description data must be exchanged between block and top level, the physical hierarchy must match the one used in the synthesis tool’s topographical mode. In practice size and grouping are decided first because they change every later answer.

What is being tested: whether your partitioning is principled or aesthetic. Weak answers stop at “similar size” and miss the synthesis-hierarchy constraint, which is the one that bites months later.

INTERMEDIATE

Q8. A design has a multiply instantiated block. What does that buy you, and what does it cost you?

It buys you one plan instead of many: one shaping, one placement, one pin plan, one budget, one set of checks, reused at every instance — a genuine reduction in runtime and human effort. It costs you freedom, because everything about the interface must be legal for every instance simultaneously. Pin placement determines a set of positions that works for all instances and makes them identical on each; feedthroughs created across the block exist on every instance; and alignment between instances has to be maintained, which is why a block grid is required when a design contains MIBs and why alignment is checked before objects are pushed down into blocks.

What is being tested: whether you can state a tradeoff in both directions. Many candidates recite the runtime benefit and cannot name a single cost, which suggests they have never planned one.

INTERMEDIATE

Q9. What is a feedthrough, and why would you plan one deliberately?

A feedthrough is a path through a block for a signal that the block does not use — in at one boundary, out at another. You plan them because the alternative is worse: without a feedthrough, a net crossing the die must detour around every block in its way, spending wire length, delay and channel routing resource, usually in the places where the channels are already busiest. Pin placement creates feedthroughs across the hierarchy, including across the instances of a multiply instantiated block, determines which ones can be reused by more than one net, and ties unused ones off to power or ground as required.

What is being tested: whether you think about the top level as a routing problem. The weak answer treats feedthroughs as a nuisance imposed on block owners rather than a deliberate top-level decision.

INTERMEDIATE

Q10. Why does the flow settle shapes, macros, power and pins before budgeting timing?

Because a budget is a statement about distance. The delay of the top-level portion of a path depends on where the two block pins are, which depends on where the blocks are and how they are shaped, which depends on macro placement and on the power plan that consumes routing resource. Budget first and you are dividing a period using distances that do not exist yet. This is also why budgets are estimates: even with shapes and pins settled there is no real clock tree and no real routing, so the numbers will be revised — and should be presented as forecasts, not results.

What is being tested: whether you understand flow ordering as causality rather than convention. A weak answer says “that is the order in the flow diagram”.

INTERMEDIATE

Q11. Compare an abutted floorplan with a channelled one. When would you choose each?

An abutted floorplan places blocks directly against each other with no top-level logic between them. It is area-efficient and gives short block-to-block connections, but it demands that every cell be pushed down into some block, and it makes block interfaces stiff: a late change at the interface has nowhere to go. A channelled floorplan leaves gaps that hold top-level logic — a little or a lot — which costs core area but gives you somewhere to put glue logic, buses, repeaters and late changes; a narrow-channel style sits between the two. Choose abutted when the hierarchy is clean, the design is area-critical and the interfaces are stable; choose channelled when significant glue remains at the top, when late changes are likely, or when top-level buses need room. The teaching design keeps 0.19 M cells of clock, reset and test logic at the top, so it must be channelled.

What is being tested: whether you connect the style to the partition. A candidate who says “abutted is better because it saves area” has not asked where the top-level cells will live.

Scenario and debugging

SCENARIO / EXPERT

Q12. What would you do if block shaping failed with overlapping blocks and one block outside its parent boundary — and enlarging the die did not help?

Stop enlarging the die. Re-run the shaping readiness check and read the rule identifiers in the message summary. That check verifies, among other things, that a target utilisation or area exists for all black boxes, that there is at least one block or voltage area to shape, that the core area and block boundaries are valid, and that a block grid is set if the design contains multiply instantiated blocks. Missing targets and a missing block grid both produce symptoms that look like an area shortage. Fix the constraint the check names, re-run the check until it is clean, then re-run shaping. Area is the last thing to change, not the first, because it costs money on every die and it hides the real bug.

What is being tested: debugging discipline under pressure. The misconception is that an error message points at its cause; it points at where the tool gave up.

SCENARIO / EXPERT

Q13. What would you do if your first plan gave a 2.9 mm² block and the team insisted the die could not grow?

Attack the plan before the area. First, verify the arithmetic and its assumptions — average cell area, macro inventory, the utilisation target — because a stale average is the most common cause of a block that is “too big”. Second, look for a better division: a block that large next to much smaller ones is a division candidate, and splitting it into two committed children often improves both shaping and parallel work. Third, examine the channel allowance: is a fifth of the core really needed as channel, or can some glue be pushed down and the style tightened. Fourth, ask whether macros can be shared or a smaller memory configuration used, since macros are 45 % of the placed area here. Only when all four are exhausted do I bring the tradeoff to the team explicitly: a larger die now, or a slower schedule and a re-plan later — and I would present both with numbers.

What is being tested: whether you can generate options instead of escalating immediately. A weak answer is “tell them it has to grow”.

SCENARIO / EXPERT

Q14. What would you do if every planning check passed and a senior engineer still rejected your floorplan?

Accept the premise: the checks prove legality, not quality. I would ask what they measured, and then measure the same things myself — block aspect ratios against the shape their macros need, channel area against where the top-level buses actually run, pin count per block against the boundary length available on usable layers, and the budget split against the physical distance between the block pins it assumes. A floorplan can be entirely legal and still be a bad plan: 3:1 blocks, channels in the corner, pins on the wrong edge, a MIB whose pin plan suits one instance’s neighbours and not the other’s. Those are review findings, not check findings, which is why a plan should always be reviewed by someone who did not draw it.

What is being tested: whether you know the limits of automated checking, and whether you take review as information rather than insult.

SCENARIO / EXPERT

Q15. You inherit a design where an edit in a block silently does nothing. How do you diagnose it?

I would suspect scope before I suspected the edit. In a multi-level design, blocks and levels can be enabled or disabled for planning, and a block can also be edit-locked at its reference. I would re-issue the editability command for the block I intend to change, with verbose output, and read the returned count of blocks whose control actually changed — a count of zero is the answer. Then I would make the edit, confirm it took effect, and restore the original scope at the end of the session, because leaving a design frozen is how the next engineer inherits the same mystery. The habit that prevents it is setting editability explicitly at the top of every script and resetting it at the end.

What is being tested: whether you check tool state before doubting your own commands, and whether you clean up after yourself.

SCENARIO / EXPERT

Q16. Compare running a readiness check before a step with running it after. Why does the order matter so much?

The checks are named for what they guard — the pre-floorplan gate, the pre-shaping gate, the pre-pin-placement gate — because each verifies the data its step is about to consume. Run before, the check costs seconds and either lets you proceed or names the missing input. Run after, the check costs the runtime of a long command first, and then still names the same missing input — except now you also have a wrong result on disk that somebody may already have looked at. There is one thing the “after” order is good for: re-running the floorplan-rules check after any floorplan edit, because that is a change that can invalidate a previously clean result. In short: gates before steps, rules after edits.

What is being tested: whether you can justify a habit rather than just having one. A strong answer also notes the one case where checking afterwards is correct.

1.9 Chapter close

Sign-off checklist for this stage of planning

BEFORE YOU CALL THE PARTITION AND DIE SIZE DECIDED
  1. Cell count, macro inventory and average cell area recorded, with their source.
  2. Area that must be placed computed, in mm², and checked by a second person.
  3. Target utilisation stated deliberately, and the resulting first core estimate written down.
  4. Channel allowance chosen as a number, consistent with the logic left at the top level.
  5. Core and die dimensions stated, with the core offset that separates them.
  6. Every candidate module walked through the four partitioning factors, with a written reason.
  7. Multiply instantiated blocks identified and marked as one reference, not several.
  8. Small modules grouped; oversized modules divided into committed children.
  9. Floorplan style chosen, and consistent with the partition.
  10. Physical hierarchy agreed with the synthesis owner if scan data must be exchanged.
  11. Every block that will be shaped has a target area or utilisation.
  12. The pre-floorplan gate is clean, and its log is saved with the project.
  13. Assumptions file committed alongside the scripts.

Key-concept flashcards

Design planning exists to answer which question?Is this implementation strategy feasible — and how can the work be divided so that many people and processes can proceed in parallel?
Floorplanning is which four activities?Partition logical modules into physical blocks; size and place them; place macros and standard cells at floorplan level; create a power plan.
Core utilisation formula?(standard-cell area + macro area) ÷ core area, a value between 0 and 1, measured at the current stage.
Die minus core equals?The core-offset ring: power rings, I/O structures and the seal-ring zone. No standard cells.
A module becomes a block when?When you commit it — after which it has a boundary, an origin, pins, an area target and its own constraints.
Four partitioning factors?Size; function; floorplan style; common hierarchy with the synthesis tool’s topographical mode.
Abutted versus channelled?Abutted has no top-level logic between blocks; channelled has a small or large amount of it, and needs channel area for it.
MIB in one line?One block reference placed several times: plan once, but every pin and feedthrough must be legal on every instance.
Feedthrough in one line?A path through a block for a signal the block does not use, planned to avoid detours around it.
What is a timing budget?A division of the usable clock period between the launching block, the top level and the capturing block, issued to each as ordinary constraints.
Why physical before temporal?Because budgets depend on distances, and distances do not exist until shapes, macros, power and pins are settled.
What does a clean readiness gate prove?That the next step is legal to run — not that the floorplan is any good.
The one habit worth most in this chapter?Run the gate for the step you are about to take, and read the rule identifiers rather than the last line.
The one number worth computing by hand?Area that must be placed, before the tool tells you — so that you can recognise a wrong answer when you see one.

Compact glossary

Table 1.13 Chapter 1 glossary
TermMeaning as used in this book
AbstractA reduced view of a block containing only what a given task needs — boundary, pins and blockages for placement, or timing information for analysis.
Abutted floorplanA style in which blocks touch and no top-level logic sits between them.
Aspect ratioThe ratio of a shape’s width to its height. Extreme values make macros and pins hard to accommodate.
Black boxA module whose contents do not exist yet, planned from an area or utilisation target and a timing model. The reserved area is spent the moment you type it — not a placeholder. Chapter 5.
BlockA physical unit of hierarchy created by committing a logical module; it can be planned and implemented separately.
Block gridA grid that instances of a multiply instantiated block are aligned to; required when a design contains such blocks.
Block originThe coordinate reference from which a block’s internal objects are measured, as distinct from its boundary.
Budget (timing)The share of a clock period allocated to one block or to the top level, issued as ordinary timing constraints.
ChannelSpace between blocks, used for top-level logic, buses, repeaters and routing.
Channelled floorplanA style in which blocks are separated by channels holding a small or large amount of top-level logic.
CommitThe act of turning a logical module into a physical block.
CongestionRouting demand exceeding available track capacity in a region. A router result, not an arithmetic ratio.
CoreThe region inside the die where cells may be placed.
Core offsetThe distance between the core boundary and the die edge.
Core utilisationStandard-cell plus macro area divided by core area.
DieThe whole rectangle of silicon, core plus surrounding ring.
FeedthroughA path through a block for a signal the block does not use.
FinFET gridA technology grid that cell and macro dimensions and placements must respect at advanced nodes.
FloorplanningPartitioning logical modules into physical blocks, sizing and placing them, placing macros and cells at floorplan level, and creating a power plan.
Glue logicCells that remain at the top level rather than inside any block — typically clock, reset and test logic.
Hard macroA large pre-built object such as an SRAM, placed rather than synthesised, which blocks the rows it covers.
Hierarchy browserThe graphical view of the design hierarchy that reports per-module data such as utilisation, cell count and pin count.
Logical hierarchyThe module structure of the netlist, with no physical meaning.
MIBMultiply instantiated block: one block reference placed more than once, with identical pin placement on every instance.
Outline viewA form of the netlist that preserves hierarchy and connectivity while deferring cell-level detail.
Physical hierarchyThe block structure you choose for planning and implementation; it may have several levels.
Placement rowA stripe of the core, one standard-cell height tall, on which standard cells must sit.
Power planThe rings, meshes, rails and straps that deliver current, planned as reusable patterns bound to regions by strategies.
Routing trackAn evenly pitched line in a metal layer that wires are expected to follow.
Seal ringThe protective structure at the die edge, outside the core.
Sibling interfaceA connection between two blocks at the same level of hierarchy.
Standard cellA small library cell, one row tall, placed in millions.
Sub-chipA block that is itself a parent of other blocks, in a design with more than two levels of physical hierarchy.
Voltage areaA region of the floorplan operated on a particular supply, arising from the design’s power intent.

Five-question self-check

  1. A design has 6.4 M standard cells averaging 0.40 µm², plus 40 macros of 0.05 mm² each. What area must be placed, and what square core would a target utilisation of 0.75 imply?
  2. Your partition leaves 0.25 M cells at the top level. Which floorplan style is now impossible, and why?
  3. Name two things that change in the design database when you commit a module.
  4. Two instances of one block need pins in different places to suit their different neighbours. What is the legal outcome, and what does that tell you about MIBs?
  5. A readiness gate reports zero errors and forty warnings. What do you do next, and what have you not proved?

Answers.

1. Cell area = 6.4 × 10⁶ × 0.40 µm² = 2.560 mm². Macro area = 40 × 0.05 mm² = 2.000 mm². Area to place = 4.560 mm². At 0.75, core = 4.560 ÷ 0.75 = 6.080 mm², so a square core of √6.080 = 2.466 mm on a side. Note that macros are 44 % of the placed area, so the macro list is the number to double-check first.

2. An abutted style, because there is no space between abutted blocks for those 0.25 M cells to live in. Either accept a channelled style and reserve channel area for them, or push them down into blocks and re-examine the partition.

3. Any two of: it acquires a boundary; it acquires an origin; pins appear where its nets cross the boundary; it becomes separately openable and plannable; it takes its own area target and constraints.

4. The legal outcome is a single pin placement that works for every instance and is identical on each — so a position that suits only one instance is not a legal position at all. It tells you that a MIB trades interface freedom for planning effort, and that both instances’ neighbourhoods must be considered when the pin plan is made.

5. Next: triage the forty warnings by relevance to the step you are about to run, and fix the ones that name data that step consumes. Not proved: that the floorplan is good. A clean gate is a statement about legality, not quality — aspect ratios, channel placement, pin feasibility and budget realism all still need measuring and reviewing.

One-page recap

A one-page recap map with six labelled clusters arranged around a small central die plate captioned the design plan. The clusters read: WHAT IT IS, listing assess feasibility early, divide and conquer a large design, partition, size, place and power, and an iterative loop not one pass. WHAT IT NEEDS, listing netlist and reference libraries, timing constraints and power intent, a target area or utilisation per block, and a floorplan style decision. HIERARCHY, listing logical module is not equal to physical block, commit turns one into the other, multiply instantiated block equals one plan and many placements, and multiple levels are supported. WHAT IT PRODUCES, listing block shapes, pins and abstracts, a power plan and top-level routes, one timing budget per block, and an honest verdict on the floorplan. VALIDATION, listing check before each step not after, gates are legality not quality, and read the rule identifiers not the first line of the log. THE HABITS TO KEEP, listing write down every assumption, measure area before drawing a die, never fix a constraint bug with area, and re-check after every floorplan change.
Figure 1.13 The chapter on one page. If you can reconstruct the six clusters from memory, you are ready for the next chapter.

Where the next chapter goes, and why

You now know what a design plan contains, how to divide a netlist into blocks, how to size a core from measured area, and how to prove that a step is legal to run. Every one of those activities was described here as something you decide — and every one of them has to be typed into a tool that runs it, logs it, and lets you repeat it tomorrow without repeating the thinking.

That is the subject of Chapter 2. Before you can plan a real chip you need to be at home in the environment: the interfaces available to you, how commands are entered and interrupted, how to ask the tool about itself, how application options change its behaviour, how scripts and setup files make a session reproducible, where the command log lives when you need to reconstruct what you did, and how work is run in parallel and monitored when a design is too large for one process. Those are not administrative details. They are the difference between an engineer who can do this once and an engineer who can do it every day, on a design too big to hold in their head.