Difficulty: Hard · Puzzle 6 of 6 · Topic: Deadlock Scenario Puzzles: Objection and Phase Stalls
Top-level virtual sequence finishes, but phase still blocked by nested child sequence. Objection trace points to child object that no longer logs progress.
class child_seq extends uvm_sequence #(my_item);
virtual task body();
starting_phase.raise_objection(this);
if (!wait_for_link_up(1000)) begin
\`uvm_error("LINK", "link never up")
disable fork; // bug: exits scope without drop
end
starting_phase.drop_objection(this);
endtask
endclassNested sequence error handling often bypasses final cleanup.
1) Confirm unresolved objection owner from trace belongs to child_seq instance.
2) Inspect error path and find disable/return path that skips drop_objection.
3) Rework body into guarded flow with guaranteed drop in final block.
4) Add timeout-specific cleanup and propagate failure upward cleanly.
5) Add regression where link never comes up and assert phase still exits.Answer: Bug: child raises objection then exits via disable path before drop. Fix: ensure drop executes in all error/timeout exits and avoid non-local exits that bypass cleanup.
When parent completes, engineers assume all child objections are gone; not true.
How would you report child failure to parent while still preserving objection symmetry?