The Sign-Off Argument
Compute the depth a bounded proof must reach, expose a hidden over-constraint with a cover, and write the one-page argument a lead can accept or reject.
- Lesson
- F7.3
- Time
- 25 min
- Runs on
- SymbiYosys
- Check
- 5 questions
Two blocks reached review with the same line: "bounded proof, depth 12, no failures". The lead asked how deep a trace must be to show the worst bug. One block needed depth 11 and was accepted; the other needed depth 17 and was sent back.
A Bounded PASS Needs a Second Number
Depth 12 against the required depth 11 of the TMO = 6 block with the late-error bug.
Linear scale. 0 to 20 steps.
- Checked bound
- 12
- Required bound
- 11
- First reported failure
- 10
- Claim
- Counterexample found
Measured: depth 12 gives FAIL at reported step 10. The bound covers the bug.
Depth 12 against the required depth 17 of the TMO = 12 block with the late-error bug.
Linear scale. 0 to 20 steps.
- Checked bound
- 12
- Required bound
- 17
- First reported failure
- 16
- Claim
- Counterexample found
Measured: depth 12 gives BMC PASS to depth 12; depth 20 gives FAIL at reported step 16. The bound stopped short.
A bounded PASS means nothing on its own. It becomes an argument next to the required depth: the shortest trace from reset that could show a violation. Reached above required is a bounded sign-off. Reached below it is a PASS and nothing more.
The Required-Depth Worksheet
| Line of the worksheet | TMO = 6 | TMO = 12 |
|---|---|---|
| Reset step | 1 | 1 |
| Request accepted | 1 | 1 |
| Deepest counter in the cone: the timeout | 6 | 12 |
| Longest tail of the transaction: the late cycle | 1 | 1 |
The property's own window: |=> | 1 | 1 |
| SBY: depth N checks samples up to N − 2 | 1 | 1 |
| Required depth | 11 | 17 |
Measured: smallest failing bmc depth | 11 (depth 10 passes) | 17 (depth 16 passes) |
Filled before running, then checked against a depth sweep on the buggy block. The counter comes from the cone map (F7.1), not from the whole design.
Three lines carry the design: the deepest counter the property depends on, the longest transaction, and the property's own window (A2.1). The rest is bookkeeping. The engine agreed with the worksheet to the step.
Same Depth, Two Verdicts
| Run on tmo_blk | Measured result |
|---|---|
TMO = 6, bug, bmc depth 12 | FAIL at reported step 10 |
TMO = 12, bug, bmc depth 12 | BMC PASS to depth 12 |
TMO = 12, bug, bmc depth 20 | FAIL at reported step 16 |
| TMO = 12, bug, k-induction depth 12 | UNKNOWN at k = 12 (base case passed, induction step failed) |
TMO = 12, bug, abc pdr | FAIL at reported step 17 |
TMO = 12, fixed, abc pdr | Prove PASS (abc pdr) |
Reset assumed in step 0, smtbmc yices unless named.
Measured, TMO = 12, bmc depth 20: FAIL at reported step 16. The request in the late cycle is dropped, so pending stays low.
When prove closes, the depth argument is unnecessary: the proof holds for all time. When it does not close, the report says "bounded, depth D, required R". A report that says only PASS has left the argument out.
k-induction at depth 12 returns UNKNOWN on the buggy block: no proof and no failure. PDR finds the counterexample, and on the fixed block it closes the proof, which needs no worksheet at all.
The Hidden Over-Constraint
Grant assumed within four cycles
assume property (@(posedge clk) pending && cnt >= 3 |-> grant_in);
cover property (@(posedge clk) !rst && pending && cnt == TMO - 1 && !grant_in);
Buggy block: Prove PASS (abc pdr). Timeout cover: Cover unreached within depth 20.
No extra assumption
cover property (@(posedge clk) !rst && pending && cnt == TMO - 1 && !grant_in);
Timeout cover: Cover reached, reported step 14. The buggy block fails.
One innocent-looking assumption made the timeout unreachable, and the proof of a buggy block passed. The cover caught it. Every assumption in a sign-off needs a reason from the spec and a cover that stays reachable under it.
The Four Cs
Read the diagram as text
- Constraints: every assumption, its reason, and a cover reached under it
- Checkers: the spec checklist and a mutation score with its sample (F7.2)
- Complexity: per property: full proof, or bounded with its worksheet; each abstraction with its soundness note
- Coverage: the cone map, white logic named (F7.1); cover depths
- One-page sign-off: the four lists, the depth bar per property, suite version, date
- Constraints → One-page sign-off
- Checkers → One-page sign-off
- Complexity → One-page sign-off
- Coverage → One-page sign-off
A gap in any list is a reason to reject, however green the runs are.
| Sign-off line | Accepted? |
|---|---|
Proven: abc pdr, SBY v0.70-9-g79fc9ed, 2026-11-08 | yes |
| Bounded, depth 20, required 17, worksheet attached | yes |
| Bounded, depth 12, required 17 | no: prove, or run deeper |
| All properties PASS | no: mode and depth missing |
The verdict words of this track, with the numbers that make them reviewable.
Each card is a list a reviewer can check line by line. Constraints come first, because one bad assumption voids every result after it, as the grant assumption just showed.
Required depth is the floor. A common margin is twice the deepest cover, so that two operations back to back fit inside the bound.
Asked in Interviews
| Question | Answer |
|---|---|
| When can a block be signed off with formal alone? | When every property is proven or bounded above its required depth, the assumptions are listed and justified with covers reachable under them, the cone map is dispositioned, and the mutation score is quoted with its sample. |
| What is a bounded-proof argument? | The required depth from the deepest counter in the cone, the longest transaction and the property window, set against the depth reached. Here 12 covers TMO = 6 (needs 11) and not TMO = 12 (needs 17). |
| What are the four Cs of formal sign-off? | Constraints, checkers, complexity and coverage: the four lists a reviewer reads before accepting a block. |
Try It
The lab is tmo_blk with TMO = 6 and the late-error bug, bmc at depth 12: FAIL at reported step 10 in 0.5 s. The rule in concurrent SVA; the design runs it as req_q and an immediate assertion.
assert property (@(posedge clk) disable iff (rst) req && !pending |=> pending);Fill the worksheet first
Before running, compute the required depth for TMO = 6 and TMO = 12. Then run and compare the failing step.
Accept or reject?
Set
localparam TMO = 12;and run at depth 12. Write the sign-off line for that PASS, then rerun at the depth your worksheet asks for.Find the over-constraint
Add the assumption that the grant comes within four cycles, switch to
abc pdr, then turn the check into the timeout cover. Read both.
design.sv
props.sv
Use assert property (@(posedge clk) ...);. Leave blank for immediate assertions in the design.
Inputs are free unless constrained. Run to find a counterexample or check a proof.
Model: one positive-edge clock, binary data. Sampled history requires declaration-initialized variables; primary-input history is unsupported.
SBY summary and log
Check Yourself
Remember
- A bounded PASS is an argument only next to its required depth.
- Required depth: the deepest counter in the cone, the longest transaction, the property window, plus the engine offset; check it with a depth sweep.
- Every assumption needs a reason and a cover reachable under it; one over-constraint can make a buggy block prove.
- The four Cs: constraints, checkers, complexity, coverage. A sign-off line names mode, depth, required depth, tool version and date.