Cover the answer column, set a 90-second timer per prompt, speak aloud with the four framework steps, and compute the number. Score yourself with the rubric afterwards.
# | Prompt | Answer |
|---|---|---|
1 | Same-edge flops, period 1.25 ns, data arrives at 1.02 ns, setup 0.06 ns, capture clock 0.05 ns later than launch. Setup slack? | +0.22 ns: 1.25 + 0.05 - 0.06 - 1.02 |
2 | Minimum data arrival 0.18 ns, hold time 0.05 ns, capture clock 0.10 ns late. Hold slack? | +0.03 ns: 0.18 - 0.05 - 0.10 |
3 | Prompt 1 with 0.04 ns of clock uncertainty on setup. New slack? | +0.18 ns |
4 | Launch on rising, capture on falling edge, period 1.0 ns, path 0.42 ns, setup 0.05 ns. Slack? | +0.03 ns: 0.5 - 0.05 - 0.42 |
5 | Shared clock path 0.30 ns, late derate 1.08, early 0.92. What does CRPR credit back? | 0.048 ns: 0.30 × 0.16 |
6 | AND clock gate, period 2.0 ns, enable launched by a falling-edge flop at 1.0 ns, path 0.60 ns, gating setup 0.10 ns. Setup slack? | +0.30 ns: 2.0 - 0.10 - 1.0 - 0.60 |
def r(x): return round(x, 3)
a1 = 1.25 + 0.05 - 0.06 - 1.02
a2 = 0.18 - 0.05 - 0.10
a3 = a1 - 0.04
a4 = 1.0 / 2 - 0.05 - 0.42
a5 = 0.30 * (1.08 - 0.92)
a6 = 2.0 - 0.10 - 1.0 - 0.60
assert [r(a1), r(a2), r(a3), r(a4), r(a5), r(a6)] == [0.22, 0.03, 0.18, 0.03, 0.048, 0.30]
print("PASS: answers", [r(a1), r(a2), r(a3), r(a4), r(a5), r(a6)])Prompt 1: states the capture edge, notes the skew helps setup and costs hold, and gives the hold side unprompted.
Prompt 4: names the half-cycle budget and says what a falling-edge capture does to every path into it.
Prompt 5: explains why the credit exists (a shared buffer cannot be both slow and fast).
Prompt 6: names the gating phase rule and the other check (hold against the falling edge).
-0.02 ns: 0.18 - 0.05 - 0.15, a hold violation.