Part 7 · Environment & Tests · Intermediate

Clock and Reset Generation: Stable Bring-Up Contracts

Build deterministic reset release and multi-clock startup rules that keep monitors and checkers consistent.

Core Contract

Keep this startup boundary deterministic, observable, and fail-fast.

Treat startup as reusable infrastructure: ownership, ordering, and liveness checks must be explicit.

diagram
[UVM][ENV] timing contract

clock stable
  -> reset assert/deassert policy
  -> agent startup gates
  -> first traffic and first check

policy drift causes flakiness
diagram
[UVM][ENV] boundary model

boundary A: ownership and lifecycle
boundary B: publication and path scope
boundary C: first-activity liveness proof

fix the first broken boundary first
  • Document ownership and ordering assumptions in code, not only slides.

  • Make startup diagnostics actionable and low-noise.

  • Prefer deterministic startup defaults over convenience shortcuts.


Reference Implementation

systemverilog
timeunit 1ns;
timeprecision 1ps;

logic clk;
logic rst_n;

initial clk = 0;
always #4ns clk = ~clk;

initial begin
  rst_n = 0;
  repeat (12) @(posedge clk);
  rst_n <= 1;
end

property rst_release_on_edge;
  @(posedge clk) $rose(rst_n) |-> rst_n;
endproperty

assert property (rst_release_on_edge)
  else $error("reset release policy violated");
diagram
[ENV] implementation audit

- critical startup assumptions validated?
- missing-state paths fail immediately?
- diagnostics include component path and context?
- minimal smoke seed can exercise this boundary?
diagram
[UVM][ENV] startup observability

track timestamps/counters for:
  reset release
  first sequence launch
  first monitor publish
  first checker compare

these markers reduce triage latency dramatically
  • Keep startup code simple enough to audit in code review.

  • Use fatal failures for non-recoverable startup contract violations.

  • Expose startup metrics in report_phase for CI artifacts.


Debug Workflow

Triage order

  1. Reproduce with one seed and startup tracing enabled.

  2. Verify startup boundary counters and first-activity markers.

  3. Classify failure by boundary before deep waveform analysis.

  4. Fix root boundary and rerun identical seed to confirm.

bash
simv +UVM_TESTNAME=smoke_test        +UVM_VERBOSITY=UVM_LOW        +UVM_CONFIG_DB_TRACE        +UVM_OBJECTION_TRACE
diagram
[UVM][ENV] quick diagnosis

fails before build:
  run_test/factory/config publish issue

build passes, no traffic:
  reset/sequence launch gating issue

monitor active, checker idle:
  connect/subscriber pipeline issue

Key takeaways

  • Clock/reset policy is startup infrastructure, not incidental code.

  • Documented reset semantics must align with monitor/checker gates.

  • Simple assertions catch timing-policy drift quickly.

  • A deterministic startup workflow improves regression trust and team velocity.

Common pitfalls

  • Multiple reset drivers and hidden startup races.

  • Undocumented async/sync release behavior differences.

  • No reset-aware state flush in passive components.

  • Skipping startup smoke and finding setup regressions only in long runs.


Applied Patterns

Use this reusable grid before landing startup-related changes.

diagram
[UVM][ENV] startup pattern grid

contract:
  ownership + ordering + liveness documented

implementation:
  fail-fast checks and deterministic defaults

observability:
  milestone counters and concise logs

verification:
  smoke seed + boundary-first triage + closure checklist
systemverilog
function void startup_health_report();
  `uvm_info("STARTUP_SUMMARY",
    $sformatf("rst=%0t seq=%0t mon=%0t cmp=%0t",
      first_reset_release_time,
      first_sequence_start_time,
      first_monitor_publish_time,
      first_scoreboard_compare_time),
    UVM_LOW)
endfunction
  • Treat startup updates as infrastructure API changes.

  • Keep code and checklist language aligned.

  • Require stable startup summaries in regression logs.