The reports in the earlier articles had a row called clock reconvergence pessimism, and its value was always zero. With on-chip variation derates it is no longer zero, and it is one of the most useful rows in a timing report. Common path pessimism removal, CPPR, also called CRPR, takes back a margin that the derates added by mistake. This article explains where that pessimism comes from, how the credit is calculated, and shows the effect on setup and hold slack with real numbers.
8 min read | Intermediate
What You'll Learn
- Explain what the common part of two clock paths is and why derating it is wrong
- Calculate the CPPR credit from the late and the early delay of the common part
- Read the CPPR row in a setup report and in a hold report
- Compare the slack with and without CPPR
The Common Part of the Clock Path
The launch flip-flop and the capture flip-flop get their clock from the same source. In a real clock tree, the clock first goes through some shared buffers, and then it splits and goes to the two flip-flops through separate branches. The shared part is the common path. In the clock tree used in the earlier examples, the root buffer is common to both flip-flops:
Now think about the derates. For setup, the launch clock path is late and the capture clock path is early. If STA applies this to the whole of both paths, it counts the root buffer as slow for the launch and as fast for the capture. But it is the same physical buffer, and one buffer on one chip has one delay. It cannot be slow for one flip-flop and fast for the other at the same moment. This is pessimism, and it has nothing to do with the real variation between different cells.
The Credit
CPPR finds the last point that both clock paths share, and it gives back the difference of the two delays of the common part. In our example, the root buffer has a late delay of 0.1113 ns and an early delay of 0.0911 ns:
CPPR credit = late arrival at the common point - early arrival at the common point
= 0.1113 - 0.0911 = 0.0202 ns
The branches that are not shared, one buffer for the launch flip-flop and two for the capture flip-flop, keep their derates. These differences are real, because different cells vary differently. Only the common part is corrected.
In the Reports
The credit appears in the row clock reconvergence pessimism of the capture clock path. For the setup check of the example, it is added to the required time:
2.0000 2.0000 clock clk (rise edge)
0.0911 2.0911 ^ root/X (sky130_fd_sc_hd__clkbuf_4)
0.0643 2.1554 ^ b2a/X (sky130_fd_sc_hd__clkbuf_1)
0.0638 2.2191 ^ b2b/X (sky130_fd_sc_hd__clkbuf_1)
0.0000 2.2191 ^ r2/CLK (sky130_fd_sc_hd__dfxtp_1)
0.0202 2.2393 clock reconvergence pessimism
-0.1029 2.1364 library setup time
2.1364 data required time
1.6396 slack (MET)
The credit of +0.0202 ns moves the capture clock later, which gives the data more time. Without CPPR, the required time would be 2.1162 ns and the setup slack 1.6194 ns. For hold, the credit has the opposite sign, because the capture clock path is late and the launch clock path is early. It is subtracted from the required time:
0.2678 ^ r2/CLK (sky130_fd_sc_hd__dfxtp_1)
-0.0202 0.2476 clock reconvergence pessimism
-0.0300 0.2176 library hold time
0.2176 data required time
0.1945 slack (MET)
| Check | With CPPR (ns) | Without CPPR (ns) | Credit (ns) |
|---|---|---|---|
| Setup slack | 1.6396 | 1.6194 | +0.0202 |
| Hold slack | 0.1945 | 0.1743 | +0.0202 |
Both slacks improve by the same amount. In OpenSTA, CPPR is on by default. The variable sta_crpr_enabled can be set to 0 to switch it off, which is how the numbers without CPPR were produced.
When the Credit Is Zero
With no derates, the late and the early delay are equal, and the credit is zero. This is the case for all the examples before the chapter about variation. The same happens for a path whose launch and capture flip-flops are the same cell, or for an input port path, where there is no common clock path. And with ideal clocks, there are no clock cells at all.
Why It Matters
The credit is small in this example, 0.0202 ns, because the common path is a single buffer. In a real chip, the clock tree has many levels, and two flip-flops of the same block often share most of them. The common part can be hundreds of picoseconds long, and the credit is a percentage of it, for example 20 percent for a late derate of 1.1 and an early derate of 0.9. Without CPPR, many paths between flip-flops that are close together would fail for the wrong reason. The paths where it matters most are those between flip-flops that are physically close: they share a lot of the clock tree and have very little real clock variation between them.
Common Mistakes
Mistake #1: Switching CPPR off to be conservative
The credit is not a risk. It removes a case that cannot happen. Without it, the report is more pessimistic than the chip, and the fixes cost area and power.
Mistake #2: Expecting a credit with ideal clocks
With ideal clocks or without derates, the credit is zero. A zero value in the row does not mean that CPPR is off.
Quick Check: The common buffer has a late delay of 0.150 ns and an early delay of 0.130 ns. What is the CPPR credit?
0.150 - 0.130 = 0.020 ns.
Practice Exercise
Challenge: Find the Credit
This is a pencil and paper exercise. A clock reaches two flip-flops through a common buffer and two separate branches. The common buffer has a delay of 0.200 ns. The derates are early 0.9 and late 1.1. For the setup check, the data arrives at 0.900 ns, and the capture edge, with the early derate, is at 2.0 + 0.470 ns. The library setup time is 0.100 ns. Find the CPPR credit and the setup slack with and without it.
Hint
The late delay of the common buffer is 0.200 x 1.1 and the early delay is 0.200 x 0.9.
Solution
The credit is 0.220 - 0.180 = 0.040 ns. Without CPPR, the required time is 2.470 - 0.100 = 2.370 ns and the slack is 2.370 - 0.900 = 1.470 ns. With CPPR, the required time is 2.470 + 0.040 - 0.100 = 2.410 ns and the slack is 1.510 ns.
Summary
- The launch and the capture clock paths share a part of the clock tree.
- Derating the shared part both late and early is impossible, because it is the same cell, so it adds pessimism.
- CPPR gives back the difference between the late and the early delay of the common part: 0.1113 - 0.0911 = 0.0202 ns in the example.
- The credit is added to the setup slack and to the hold slack, and it shows in the row
clock reconvergence pessimism. - It is zero without derates, for ideal clocks, and when there is no common clock path.
- Keep CPPR on. Switching it off only makes the report more pessimistic.