Why Your pll_locked Assertion is Failing: SVALint Liveness Rules

As we gear up for the 63rd Design Automation Conference (DAC) next week, the engineering team at AsFigo (in collaboration with VerifWorks) is rolling out a major extension to SVALint—our blazing-fast, Verible-backed SystemVerilog Assertion linter.

Among our new suite of functional correctness checks, one major hazard we are targeting is the misapplication of liveness operators in dynamic simulation environments: specifically, bounded weak-strong patterns like eventually s_always.

The Trap: A Common Scenario with pll_locked

Consider a standard verification check for a clock generation block. An engineer writes an assertion expecting that within a reasonable window after reset, the PLL locks and remains permanently stable:

// Risky Assertion Style
property p_pll_stable;
  @(posedge clk) disable iff (!rst_n) 
    eventually [1:10] s_always pll_locked;
endproperty : p_pll_stable
a_p_pll_stable :
assert property (p_pll_stable) else begin
`uvm_error("a_p_pll_stable", "PLL went out of lock");

On paper, this looks correct. But in a full-chip simulation lifecycle, this assertion is a ticking time bomb.

Why This Style Fails in Simulation SVA

1. Testbench Phase Shifts & Mode Changes

Modern hardware blocks transition through multiple dynamic phases: boot-up, active processing, low-power entry/exit, and multi-mode clock switching. If your testbench later triggers a power-gating sequence or re-initializes the PLL, the s_always pll_locked condition is broken, resulting in a false simulation failure.

2. The Illusion of Finality

Assertions meant to verify stabilization often accidentally morph into permanent lock detectors. In dynamic simulation runs, expecting a signal to never change again until simulation finish ignores the reality of multi-scenario verification flows.

The SVALint Solution

To eliminate these noise-heavy failures from your assertion logs, the new release of SVALint flags these hazardous patterns automatically out-of-the-box:

  • [FUNC_AVOID_EV_S_ALW]: Detects bounded weak-strong patterns (eventually s_always).
  • Companion Rules: Automatically audits equivalent pitfalls like s_eventually always, s_eventually s_always, and eventually always.

Recommendation: Instead of enforcing unyielding, permanent stability via weak-strong temporal chains, bound your stabilization windows strictly on both sides or verify transient behavior using bounded cadence checks.

Catch us at DAC next week to see SVALint live and learn how automated structural linting can protect your assertion coverage metrics.

Comments

Popular posts from this blog

Cracking the UVM-Verilator Code: 50+ IPs, AI Guardrails, and the Open-Source North Star

Call for Collaboration: Seeking Public UVM Environments for Verilator 5.0+ Porting

Breaking the License Barrier: The World’s First UVM + Verilator Hands-On Bootcamp - Mar-1, Sunday 3-5 PM PST