GLS-07: Common Issues Part 2 — VLSI Trainers
VLSI Trainers GLS Series · 7 / 7
Gate-Level Simulation · Article 7 of 7

GLS-07: Common Issues Part 2

Four more GLS issues: diagnosing timing failures vs annotation problems, glitch suppression cancellation, pulse error warnings, and SDF delays not appearing in waveforms. Followed by the complete NTC warning reference table.

Issue 5 — Timing Failure Debugging

Issue 5 Timing violation reported — is it real or an annotation problem? $setuphold violation

Symptom

During simulation the tool reports a timing check violation. The message includes the check type, instance, simulation time, and file/line of the specify block entry:

Warning! Timing violation
  $setuphold<setup>( posedge CK:25 NS, negedge D:15330 PS,
    10.09 : 10090 PS, 0.00 : 0 FS );
  File: ./stdcell_lib.v, line = 9817
  Scope: tb_top.dut.u_cpu.count_reg[0]
  Time: 25 NS

Reading the message: the setup check fired at 25 ns on count_reg[0]. Clock rose at 25 ns. Data D had a negative edge at 15.330 ns — only 9.67 ns before the clock edge, violating the 10.09 ns setup requirement.

Two possible root causes

  • Genuine design problem: The data path from the driving flip-flop is too long — combinational logic delay exceeds the available setup slack. Requires an ECO from the backend team.
  • Annotation problem: The wrong delay was annotated — causing a false violation that would not occur in silicon. Requires investigation of the SDF annotation chain.
Figure 1 — Timing violation: genuine design problem vs annotation problem debug path
Waveform at the failing flip-flop: 14ns 15ns 16ns 25ns (CK↑) CK D setup window D changes (15.33ns) 9.67ns — violates 10.09ns setup SDF delay visible in waveforms? YES Genuine timing failure Report to backend → ECO NO Annotation problem Check elaboration log SDFNEP / SDFNET? How to check: probe the path in waveform viewer Measure D-to-output delay at driving cell. If it matches SDF value → real failure. If zero or default → annotation issue. Check elaboration log for SDFNEP/SDFNET. Use -sdf_verbose and -dumptiming to confirm annotated value on the specific arc.

Timing violation triage. CK rises at 25 ns; D transitions at 15.33 ns (9.67 ns before clock edge), violating the 10.09 ns setup requirement. Key question: does the waveform show the SDF-annotated delay? YES → genuine failure, report to backend for ECO. NO → annotation problem, search elaboration log for SDFNEP/SDFNET on the driving cell.

Resolution Step-by-step debug of a timing failure

Step 1 — Read the violation message carefully

Note the clock edge time and data edge time. Calculate actual margin: clock_time − data_transition_time. Compare against the required setup from the message.

Step 2 — Probe the waveform

Add CK, D, Q and the driving cell output to the waveform viewer. Zoom to the violation time. Measure whether the delay matches the SDF-annotated value for that path.

Step 3 — If delay matches SDF: genuine failure

Report to the backend team with the instance path, SDF delay value, and violation slack. They will investigate placement, routing, and buffer insertion and provide an ECO.

Step 4 — If delay does not match SDF: annotation problem

Search the elaboration log for SDFNEP or SDFNET on the driving cell. If found, the cell is using its specify block default (not the SDF value). Resolve the annotation mismatch as described in GLS-06, then re-run to confirm the violation disappears.

# Search elaboration log for a specific instance:
grep -i "SDFNEP\|SDFNET" sdf_annotate.log | grep "count_reg"

# Confirm what delay was actually annotated:
grep "count_reg" timing_dump.txt
# Look for: pdelay anno='y' (annotated) or anno='n' (not annotated)

Issue 6 — Glitch Suppression Cancellation

Issue 6 Glitch suppression cancelled — scheduled event for NTC delayed signal was lost NTC glitch

Symptom

Warning! Glitch suppression
  Scheduled event for delayed signal of net "DD" at time 6 FS
  was canceled!

Root cause

Specific to NTC (Negative Timing Check) delayed signals. When a flip-flop has a negative setup or hold value in the SDF, the simulator generates internally delayed versions of clock and data signals (DD = delayed data) for timing check evaluation.

The cancellation happens when a new input event arrives while a previously scheduled output event is still pending. The new event supersedes the old one, cancelling the old scheduled output event. This occurs specifically when rise and fall delays for the NTC net are different — a rising transition is scheduled to complete at T₁ but a falling transition supersedes it before T₁, cancelling the rising event.

Figure 2 — NTC delayed signal glitch cancellation: asymmetric rise/fall delays cause event cancellation
0 2fs 4fs 6fs 8fs 10fs 12fs D (input) pulse: 0→1→0 DD expected rise delay=2fs: rises at t=4fs fall delay=4fs: falls at t=6fs DD actual event at 6fs cancelled by new input event

NTC glitch cancellation. D (blue) has a brief pulse 0→1→0. DD expected (green dashed) should rise 2 fs after D rises, then fall 4 fs after D falls. Because D falls before the rising event on DD resolves, the new falling input event cancels the scheduled rising output event. DD actual (red) never fully transitions — the warning reports this cancellation at 6 fs.

Resolution Three options: verbose inspection, monitors, or nontcglitch switch

Option 1 — Inspect with verbose NTC mode

Add -ntc_verbose for detailed information about NTC delay calculations. Compare rise and fall delays to understand why they differ.

elaborate tb_top -sdf_cmd_file sdf_cmd_file -ntc_verbose

Option 2 — Add monitors

Place $monitor on the primary inputs driving the affected NTC net and on the DD signal itself. This lets you trace the sequence of events and compare input transition times against calculated delay values.

Option 3 — Use nontcglitch switch

The -nontcglitch switch suppresses glitch events on NTC nets. Use when warnings are numerous and not indicating a real design problem.

elaborate tb_top -sdf_cmd_file sdf_cmd_file -nontcglitch
When to investigate vs suppress: If the cancellation affects a flip-flop on a critical path, investigate before suppressing. If cancellations are on NTC signals for fully-waived paths (e.g. CDC synchronisers), suppression is acceptable with documentation.

📡Issue 7 — Pulse Flagged as Error

Issue 7 Pulse narrower than path delay flagged as error — StE or XtX on gate output pulse_e / pulse_r

Symptom

Warning! Pulse flagged as an error, value = StE
  File: ./stdcell_lib.v, line = 35, pos = 6
  Node: tb_top.dut.u_logic.g15.Z
  Time: 18754652 PS + 0

StE = Strength to Error — pulse below error threshold propagated as X. XtX = output stays at X throughout the pulse cycle.

Root cause

When a pulse is narrower than the gate’s propagation delay, the inertial delay model rejects it. Two configurable thresholds control this:

  • Reject limit (pulse_r): Pulses narrower than this % of path delay are silently absorbed. Default: 0%.
  • Error limit (pulse_e): Pulses between reject and error limits propagate as X with a warning. Default: 100%.

With pulse_r=0 and pulse_e=100, every pulse shorter than 100% of the path delay generates this warning and an X on the output.

Figure 3 — Pulse reject and error limits: three zones of pulse handling
Zone 1: Rejected < pulse_r % Absorbed silently No output, no warning Zone 2: Error Zone (X) pulse_r % to pulse_e % Output becomes X Warning: “Pulse flagged as error” Zone 3: Propagates > pulse_e % Pulse propagates normally Delayed to output — no warning pulse_r threshold pulse_e threshold Pulse width as percentage of path delay (0% = instantaneous, 100% = full delay width)

Three pulse handling zones. Zone 1 (green): below pulse_r — absorbed silently. Zone 2 (red): between pulse_r and pulse_e — output forced to X with warning. Zone 3 (blue): above pulse_e — propagates normally. With default pulse_r=0, pulse_e=100, every pulse narrower than the full path delay enters Zone 2.

Resolution Adjust thresholds or suppress error messages

Option 1 — Adjust pulse_r and pulse_e thresholds

# Maximum sensitivity (default): every sub-delay pulse flagged
elaborate tb_top ... -pulse_r 0 -pulse_e 100

# Typical production: reject below 50%, flag 50-100%
elaborate tb_top ... -pulse_r 50 -pulse_e 100

# Suppress all pulse error messages (not recommended for signoff):
elaborate tb_top ... -pulse_r 100 -pulse_e 100

Option 2 — Suppress pulse error message display only

Use -epulse_no_msg to keep X-on-output behaviour but suppress the warning message from the log.

elaborate tb_top ... -epulse_no_msg
Consult the library vendor: Recommended pulse_r and pulse_e values are specific to each cell type and process node. The PDK release notes typically include recommended GLS pulse rejection settings for that library.

🔎Issue 8 — SDF Delays Not Appearing in Waveforms

Issue 8 Annotation reports success but waveforms show zero delay on cell outputs zero-delay waveform

Symptom

After a successful SDF-annotated GLS run, probing a cell output in the waveform viewer shows it transitioning at the exact same time as its input — zero propagation delay — even though the SDF contains a non-zero delay for that arc.

Five root causes and resolutions

Cause 1 — SDFNEP/SDFNET warnings on that specific path.
Check elaboration log for annotation warnings on the failing instance. If present, the SDF annotation failed silently — the specify block default (often 0) is being used. Fix: resolve annotation mismatch as in GLS-06.

Cause 2 — Pulse rejection absorbing the transition.
If the input pulse is narrower than the cell delay, inertial delay rejects it entirely. Set -pulse_r 0 -pulse_e 0 to force all pulses through, or widen the stimulus pulse.

Cause 3 — Timescale/precision mismatch (most common cause).
The SDF specifies delays in ps but simulation precision is ns. A 250 ps delay becomes 0.25 ns which rounds to 0 at 1 ns precision. The annotator reports success but the simulator rounds it to zero.

# Symptom: annotation log shows IOPATH A->Y = (250:310:420)
# Waveform shows zero delay. Timescale is 1ns/1ns.

# Fix: set precision fine enough for SDF delays:
compile ... -timescale 1ns/1ps   # 1ps precision -> 250ps representable
compile ... -timescale 1ns/100fs  # even finer if SDF delays in fs

Cause 4 — Module-level timescale overrides command-line timescale.
If a module has its own `timescale directive with coarser precision, that module’s instances use the coarser precision regardless of the command-line setting. Fix: use -override_precision.

compile ... -timescale 1ns/1ps -override_precision

Cause 5 — Annotated delay is genuinely zero in the SDF.
Use -sdf_verbose and check if the log shows IOPATH A→Y = (0:0:0). If yes, the zero is coming from the SDF itself — report to the backend team for investigation.

Figure 4 — Timescale precision mismatch: how 250 ps rounds to zero at 1 ns precision
-timescale 1ns/1ps (1ps precision) — CORRECT SDF: 250ps Stored: 0.250ns = 250 units ✓ Waveform shows 250ps delay -timescale 1ns/1ns (1ns precision) — WRONG SDF: 250ps 0.250ns → rounds to 0 ✗ Waveform shows zero delay

Timescale precision mismatch. With 1ps precision (top), 250 ps stored correctly and visible in waveforms. With 1ns precision (bottom), 250 ps = 0.25 ns rounds to 0 — annotation reports success but delay is silently discarded. Always ensure simulation precision is at least as fine as the smallest SDF delay value.

📋NTC Warning Reference Table

NTC (Negative Timing Check) warnings arise when setup or hold values in the SDF or specify block contain negative numbers. Advanced-node standard cell libraries frequently include negative timing check values. The following table is the complete reference for NTC-related warnings:

MnemonicTrigger conditionEffectResolution
SDFNL2Sum of the two limits in $setuphold or $recrem is less than zero (e.g. setup=−6, hold=−4, sum=−10)Negative limit set to zero. Iteration continues.Confirm library characterisation is correct. If intentional, waive.
SDFINDAttempt to annotate a negative delay to a UDP primitive. UDPs cannot accept negative delays.Value clamped to zero.Verify library model. UDPs should not have negative path delays.
NONTCTLSum of the two limits is negative. NTC algorithm cannot converge.Simulation proceeds; limits adjusted.Use -ntc_tolerance with a positive value to allow convergence.
NTCTLERThe -ntc_tolerance value is not a valid positive number.Tolerance ignored; default (0) used.Correct the value: must be a positive time value with unit (e.g. 10ps).
NGLIM2Both limits in $setuphold or $recrem are negative.Both limits set to zero.Investigate library. Both limits negative may indicate a characterisation error.
NTCWIDNTC net has different rise and fall delays exceeding the limit of a $width check controlled by that net.$width check may fire spuriously.Check if the $width check is meaningful. Consider adding to tfile if spurious.
NTCNNCConvergence could not be achieved during NTC delay calculation.Simulation continues with approximated values.Use -ntc_tolerance. If persistent, investigate the specific $setuphold values.
NTCDNGNegative values on both reference and data limits for different edges — causes non-convergence.Timing check limits zeroed; check may not fire correctly.Report to library vendor. Different-edge negative values for both limits is a characterisation problem.
NTCRLXNon-convergence due to non-overlapping two-limit constraints. Limits relaxed by 2 precision units.Limits slightly adjusted; simulation continues.Usually benign. Verify relaxed limits do not change timing check outcome for critical paths.
NTCELXSame as NTCRLX but relaxation required exceeded a permissible percentage — limits changed significantly.Large adjustment to limits; timing check reliability reduced.Investigate. Large limit changes indicate inconsistent NTC values. Report to library vendor.
NTCPATNTC delay is larger than some portion of an enclosing path delay. NTC delay may visibly affect output transition timing.Output transitions may be delayed beyond path delay alone.Verify the affected path is not on a critical timing arc.
SDFNCAPSource and destination for interconnect annotation are not hierarchically connected by a wire — unidirectional continuous assignment detected.Port annotation placed at destination; source annotation skipped.Review netlist connectivity. Usually benign for unidirectional assigns.
SDFNSBA module being annotated has no specify block.Annotation silently fails for that module.Add a specify block to the cell model, or confirm the cell genuinely has no timing (e.g. tie cell).
All NTC warnings should be reviewed, not blindly suppressed. NTC warnings indicate the simulator adjusted or discarded a timing check value. For non-critical nets this is often acceptable and can be waived. For paths at setup/hold margins, any NTC adjustment could mask or generate false violations. Identify which instances generated NTC warnings, determine if they are on critical paths, and decide waive vs investigate.

🔬VLSI Connections

🔬 Timing violation triage at tape-out — the signoff decision process

In the final weeks before tape-out, GLS timing violations must be triaged with discipline. Every failing instance falls into one of three categories: genuine timing failure (backend ECO required), known acceptable violation (CDC, false path — tfile waiver with documentation required), or annotation artefact (investigation required before categorisation). The danger is misclassifying a genuine failure as an annotation artefact to avoid an ECO cycle. Any violation where the waveform correctly shows the SDF-annotated delay AND the actual slack is negative is a genuine failure — no exceptions. Verification leads should track the ratio of genuine failures to annotation artefacts — a high artefact rate indicates a library model or SDF quality problem.

🔬 Pulse warnings and combinational glitch analysis in GLS

Pulse-flagged-as-error warnings (Issue 7) are often the only simulation-time indicator of combinational glitches on control signals. A glitch on a clock enable or asynchronous reset shorter than the cell propagation delay will be rejected by inertial delay and appear as a pulse warning with X on the gate output. If that X reaches a flip-flop clock enable, it creates an X that propagates through the flip-flop and contaminates downstream logic. Teams doing formal glitch analysis should cross-check formal results against GLS pulse warnings — any path that formal declares glitch-free but GLS flags deserves investigation.

🔬 NTC in advanced-node standard cell libraries

Negative timing check values are increasingly common in 7nm, 5nm, and 3nm standard cell libraries. A negative hold time (e.g. −20ps) means the cell allows data to change up to 20 ps before the clock edge and still latches correctly. This happens because at advanced nodes, cells are aggressively sized to reduce setup time and the hold margin is built into the cell’s internal timing. NTC warnings are a normal feature of advanced-node GLS. The key question is always: did the NTC algorithm converge (NTCNNC/NTCDNG absent or resolved)? If yes, timing checks are working correctly even though the underlying values are negative.

Summary — GLS-07 key points: Issue 5: read violation message anatomy; determine genuine vs annotation problem by probing waveform — SDF delay reflected = genuine ECO needed; zero/wrong = annotation problem, search log for SDFNEP/SDFNET. Issue 6: NTC delayed signals with asymmetric rise/fall delays generate cancelled events; debug with -ntc_verbose; suppress with -nontcglitch. Issue 7: pulses narrower than gate delay generate X with warning; controlled by pulse_r and pulse_e; suppress messages with -epulse_no_msg. Issue 8: five root causes — SDFNEP/SDFNET; pulse rejection; timescale precision mismatch (most common — 250ps rounds to 0 at 1ns); module timescale overrides (-override_precision); genuinely zero in SDF. NTC table: 13 mnemonics — SDFNL2 through SDFNSB.
🎉 GLS Series complete! All seven articles cover the complete gate-level simulation workflow — from why GLS exists alongside STA and equivalence checking (GLS-01), through simulation modes and delay models (GLS-02), SDF back-annotation (GLS-03), disabling timing checks (GLS-04), first-time flow setup (GLS-05), and the most common issues (GLS-06, GLS-07). Every concept applies directly to running and signing off GLS in a production VLSI project.
GLS-06: Common Issues Part 1 ☰ Series Index 🎉 Series complete
Scroll to Top