EDA Tools & Debug

Synopsys Verdi — Use It at Full Potential

The industry standard for ASIC/VLSI waveform debug. Most engineers use 20% of what Verdi can do. This guide covers everything — from FSDB setup to Temporal Flow View root-cause debug, UVM transactions, and Tcl automation.

FSDB & VCS Integration nWave Mastery Temporal Flow View Cross-Probing UVM Transaction Debug Tcl Automation Keyboard Shortcuts
Contents
  1. What Is Verdi?
  2. Launch Commands
  3. FSDB Setup with VCS
  4. nWave — Waveform Viewer
  5. Temporal Flow View (TFV)
  6. Cross-Probing
  7. nSchema — Schematic View
  8. UVM Transaction Debug
  9. Tcl Automation
  10. Keyboard Shortcuts
  11. Pro Tips
  12. FAQ

1 What Is Verdi and Why It's the Industry Standard

Verdi (formerly by SpringSoft, acquired by Synopsys) is the debug platform used in virtually every professional ASIC tape-out flow. Where a generic waveform viewer shows you what a signal's value is, Verdi shows you why — tracing causality backward through logic, time, and clock domains to the exact root cause of a bug.

Core
nWave — Waveform Viewer
Production-grade waveform display with signal groups, radix, analog view, markers, and delta cursor. Reads FSDB, VCD, SHM, VPD.
Power Feature
Temporal Flow View (TFV)
Traces a bad signal value backward through combinational and sequential logic to find root cause — across multiple clock cycles.
Debug
nTrace — Source Viewer
Cross-probes between waveform and HDL source. Click a signal in nWave → jumps to the exact RTL assignment that drove it.
Schematic
nSchema — Schematic Viewer
RTL and gate-level schematic with active-value annotation at cursor time. Traces paths forward and backward through logic.
Verification
UVM Transaction Debug
Transaction bars in nWave, sequence viewer, field inspection. Turns abstract protocol traffic into readable data records.
Automation
Tcl Scripting
Full Tcl API for signal loading, grouping, radix, markers, zoom, and session save/restore. Automate your debug setup across regressions.
VCS compile (-kdb)
./simv (dumps FSDB)
verdi -ssf sim.fsdb
nWave + TFV debug

2 Launch Commands — Every Variant You Need

Bash — Verdi Launch Options
# Minimal: just open FSDB (no cross-probe, no schematic)
verdi -ssf sim_dump.fsdb &

# With RTL sources — enables full cross-probe to source code
verdi -sverilog -f flist.f -ssf sim_dump.fsdb &

# With KDB (fastest; reuses compiled design database)
verdi -kdb sim.kdb -ssf sim_dump.fsdb &

# Specify top module explicitly
verdi -sverilog design.v tb.v -top tb_top -ssf sim_dump.fsdb &

# Restore a saved session (loads signals, groups, radix)
verdi -ssf sim_dump.fsdb -nologo -play wave_session.tcl &

# Open with multiple FSDB files (compare runs side-by-side)
verdi -ssf run1.fsdb run2.fsdb &

# Batch mode — run Tcl script without GUI (for CI/automation)
verdi -batch -play check_signals.tcl -ssf sim_dump.fsdb
Alias tip: Add this to your ~/.bashrc or ~/.tcshrc:
alias vd='verdi -kdb sim.kdb -ssf sim_dump.fsdb -play wave_session.tcl &'
One command to instantly re-open your last debug state.

3 FSDB Setup — Getting the Right Waveform Data

FSDB (Fast Signal DataBase) is Synopsys's waveform format. Compared to VCD, it is 5–10× smaller, supports incremental loading (view while sim runs), and uniquely supports multi-dimensional arrays, SVA results, and UVM transactions. Always prefer FSDB over VCD when using VCS + Verdi.

Step 1 — Compile with FSDB PLI support

Bash — VCS Compile with FSDB + KDB
vcs -full64 -sverilog \
    -debug_access+all \        # enables full signal visibility
    -kdb \                     # build knowledge database for Verdi
    -lca \                     # required for KDB
    -P $VERDI_HOME/share/PLI/VCS/LINUX64/novas.tab \
    $VERDI_HOME/share/PLI/VCS/LINUX64/pli.a \
    -f flist.f \
    -o simv

Step 2 — Add FSDB dump calls to testbench

SystemVerilog — Testbench FSDB Dump
initial begin
  // Basic: dump all signals from tb_top downward, all hierarchy
  $fsdbDumpfile("sim_dump.fsdb");
  $fsdbDumpvars(0, tb_top);         // 0 = all levels of hierarchy

  // Dump multi-dimensional arrays (memories, packed arrays)
  $fsdbDumpMDA();

  // Dump SVA assertion pass/fail events
  $fsdbDumpSVA();

  // Dump interface signals (SystemVerilog interfaces)
  $fsdbDumpvars(0, tb_top.u_axi_if);

  // Optional: stop dumping after N ns to limit file size
  #5_000_000;
  $fsdbDumpoff;
end

// Selective scope dump — only signals under dut, 1 level deep
initial begin
  $fsdbDumpfile("dut_only.fsdb");
  $fsdbDumpvars(1, tb_top.u_dut);   // 1 = top level of u_dut only
end
File size tip: Dumping the entire testbench hierarchy can produce multi-GB FSDB files. Dump selectively: use scoped $fsdbDumpvars, use $fsdbDumpoff/$fsdbDumpon to pause during idle time, and use depth=1 for modules you only need to inspect at the top level.

FSDB vs VCD at a Glance

FeatureFSDBVCD
File size5–10× smallerLarge
Multi-dim arrays$fsdbDumpMDANot supported
SVA results$fsdbDumpSVANot supported
UVM transactionsSupportedNot supported
Incremental loadYes (view while simulating)No
Reload in VerdiFastSlow

4 nWave — Mastering the Waveform Viewer

nWave is Verdi's primary waveform window. Most engineers know how to scroll and zoom — here's everything else.

Adding Signals

Signal Groups

Radix & Display Format

Right-click → RadixWhat it shows
HexDefault for buses — compact, shows all bits
Dec / Signed DecUnsigned or 2's complement integer value
BinFull bit-by-bit view — good for small buses
OctOctal — useful for 3-bit groups
ASCIIText view — perfect for byte streams and UART data
AnalogDraws as a line graph — great for ADC outputs and counters

Cursors & Markers

Zoom Controls

Waveform color coding: Right-click any signal → Properties → Color. Color your clocks yellow, data buses blue, error signals red — saves significant debug time in crowded waveforms.

5 Temporal Flow View — Root-Cause Debug in Seconds

TFV is Verdi's most powerful feature and the one most engineers underuse. It answers the question "This signal is wrong — what drove it to this value, through what logic, starting when?" automatically.

How to Open TFV

1
In nWave, click to place your cursor at the bad timestamp — the moment when the signal has the wrong value.
2
Right-click on the signal (or the specific waveform value region). The context menu appears.
3
Select "Trace X Value" (if the signal is X) or "Show Driver" (for 0/1 values to trace the driver path).
4
The TFV window opens and displays a logic cone diagram: the signal at center, its driver on the left, drivers of drivers further left — like a reverse dependency tree through time.
5
Click any node in the TFV diagram to trace further back. Verdi crosses clock boundaries, traverses flip-flops, and annotates each node with its value at the cursor time.

TFV for X-Propagation Debug

X-propagation is one of the most common RTL bugs — an undefined value spreads through the design and corrupts output. TFV makes tracing it mechanical:

TFV time travel: TFV is not just a structural trace — it shows values at the specific simulation time you clicked. It traverses flip-flops backward through clock cycles automatically, so you can trace an X that entered a register 5 cycles ago to the combinational logic that first produced it.

TFV for CDC Debug

When a signal crosses a clock domain and its synchronized value is wrong, TFV traces backward through the synchronizer flip-flop chain to the original source domain — across the asynchronous boundary — to show exactly which source-domain value was (or wasn't) captured.

6 Cross-Probing — Waveform ↔ Source ↔ Schematic

Cross-probing is what turns Verdi from a waveform viewer into a full debug environment. Any click in one window instantly highlights the corresponding element in all other open windows.

Action in…Result in…
Click signal name in nWavenTrace highlights the RTL assignment driving the signal
Click a net in nSchemanWave highlights that signal; nTrace shows its RTL
Click a line in nTrace (source)nWave highlights the signal; nSchema shows it in context
Right-click signal → "Find in Source"nTrace opens at the exact assignment or port declaration
Right-click signal → "Show in Schema"nSchema opens with the signal's gate/RTL context
Enabling cross-probe: You must launch Verdi with RTL source files (-sverilog -f flist.f) or a KDB (-kdb sim.kdb) for cross-probe to work. Without source, only waveform viewing is available.

nTrace — Source Code Viewer

7 nSchema — Schematic View

nSchema renders your RTL or gate-level netlist as an interactive schematic, with all nets annotated with their values at the current cursor time. It's the fastest way to understand unknown logic without reading code.

Gate-level vs RTL schematic: After synthesis, load the gate-level netlist in Verdi with post-synthesis simulation results to see actual standard cells in nSchema. Pre-synthesis, you see RTL-level operators (adders, muxes, registers) which are easier to understand but don't reflect the actual implementation.

8 UVM Transaction Debug

For UVM testbenches, Verdi can display transactions as bars in nWave — above the raw signal waveforms — showing what protocol traffic occurred, at what time, with all field values visible on click.

Enable Transaction Recording in UVM

SystemVerilog — Enable UVM Transaction Recording
// In test or env: enable recording for all components
uvm_config_db#(uvm_object_wrapper)::set(
  this, "*", "recording_detail", UVM_FULL);

// In driver/monitor: record each transaction
task run_phase(uvm_phase phase);
  my_seq_item txn;
  forever begin
    seq_item_port.get_next_item(txn);
    void'(begin_tr(txn, "my_driver"));  // start transaction record
    drive_item(txn);
    end_tr(txn);                         // end transaction record
    seq_item_port.item_done();
  end
endtask

// In testbench top: add transaction FSDB recording
initial begin
  $fsdbDumpfile("sim_dump.fsdb");
  $fsdbDumpvars(0, tb_top);
  $fsdbDumpon;
  // UVM transaction bars appear automatically in nWave
end

Using Transaction Debug in nWave

Protocol debug shortcut: Display both raw signal waveforms and transaction bars for the same interface. Click a transaction bar that shows an error response → cursor jumps to that time → raw signals below show exactly which handshake failed.

9 Tcl Automation — Script Your Debug Setup

Every action in Verdi's GUI can be scripted in Tcl. The killer workflow: write a wave_session.tcl that loads all your key signals with groups and radix settings, then launch Verdi with -play wave_session.tcl. Instant consistent debug environment every run.

Tcl — Complete wave_session.tcl Template
## wave_session.tcl — auto-generated session for tb_top

# ── Clocks & Reset ───────────────────────────────────────────────
wvCreateGroup -win $_nWave0 "Clocks & Reset"
wvGetSignal   -win $_nWave0 {tb_top.clk}
wvGetSignal   -win $_nWave0 {tb_top.rst_n}
wvSetColor    -win $_nWave0 -signal {tb_top.clk} -color yellow

# ── AXI Master Interface ─────────────────────────────────────────
wvCreateGroup -win $_nWave0 "AXI Write Address"
wvGetSignal   -win $_nWave0 {tb_top.awvalid}
wvGetSignal   -win $_nWave0 {tb_top.awready}
wvGetSignal   -win $_nWave0 {tb_top.awaddr[31:0]}
wvSetRadix    -win $_nWave0 -signal {tb_top.awaddr[31:0]} -hex

wvCreateGroup -win $_nWave0 "AXI Write Data"
wvGetSignal   -win $_nWave0 {tb_top.wvalid}
wvGetSignal   -win $_nWave0 {tb_top.wready}
wvGetSignal   -win $_nWave0 {tb_top.wdata[31:0]}
wvGetSignal   -win $_nWave0 {tb_top.wstrb[3:0]}
wvSetRadix    -win $_nWave0 -signal {tb_top.wdata[31:0]} -hex
wvSetRadix    -win $_nWave0 -signal {tb_top.wstrb[3:0]}  -bin

# ── DUT Internal State ───────────────────────────────────────────
wvCreateGroup -win $_nWave0 "DUT State Machine"
wvGetSignal   -win $_nWave0 {tb_top.u_dut.state[3:0]}
wvSetRadix    -win $_nWave0 -signal {tb_top.u_dut.state[3:0]} -dec

# ── Zoom and go to start ─────────────────────────────────────────
wvZoomFull    -win $_nWave0
wvGoToTime    -win $_nWave0 0ns

# Save after loading (so -play wave_session.tcl + Ctrl+W works)
# wvSaveFile -win $_nWave0 -file wave_session.tcl

Essential Tcl Commands

CommandWhat it does
wvOpenFile -win $_nWave0 dump.fsdbLoad an FSDB file into nWave
wvCloseFile -win $_nWave0Close current FSDB (before reload)
wvGetSignal -win $_nWave0 {path.sig}Add a signal to nWave
wvCreateGroup -win $_nWave0 "Label"Create a collapsible group
wvSetRadix -win $_nWave0 -signal {sig} -hexSet radix: -hex / -dec / -bin / -oct / -ascii
wvSetColor -win $_nWave0 -signal {sig} -color yellowSet signal color
wvZoomFull -win $_nWave0Fit all waveforms in view
wvGoToTime -win $_nWave0 500nsMove cursor to timestamp
wvAddMarker -win $_nWave0 1000ns "TX_START"Add a named marker
wvSaveFile -win $_nWave0 -file wave.tclSave current layout as Tcl script
wvSelectSignal -win $_nWave0 {sig}Select a signal (for batch ops)
Auto-record session: Verdi records all GUI actions as Tcl in a session log. Go to File → Record Session to start recording, do your signal setup manually, then stop. The generated Tcl is your reusable wave_session.tcl.

10 Keyboard Shortcuts — Complete Cheat Sheet

nWave Navigation

FFit all signals in view
ZZoom in at cursor
z / Shift+ZZoom out
GGo to time dialog
HomeJump to time 0
EndJump to end of simulation
/ Move cursor one step
Ctrl+← / Ctrl+→Previous / next edge of selected signal
Shift+ClickPlace delta cursor (shows time difference)
Double-Click signalZoom to fit that signal's transitions

Signal Management

Ctrl+FFind / search signals
Ctrl+ASelect all signals
DeleteRemove selected signal(s)
Ctrl+GAdd selected signals to group
Ctrl+MAdd marker at cursor time
Ctrl+Shift+MCycle through markers
Ctrl+WSave waveform session (wave.tcl)
Ctrl+ZUndo last action

Debug & Cross-Probe

TOpen Temporal Flow View for selected signal
SShow selected signal in nSchema
Ctrl+Click signalCross-probe to source in nTrace
Ctrl+DShow driver of selected signal
Ctrl+LShow load (fanout) of selected signal
F5Reload FSDB (after re-running simulation)

11 Pro Tips — What Most Engineers Never Discover

1. Reload FSDB Without Restarting Verdi

After a re-run, you don't need to close and reopen Verdi. Use F5 or File → Reload FSDB. Your signal groups, radix, colors, and markers are preserved. In Tcl:

Tcl — Reload FSDB
wvCloseFile -win $_nWave0
wvOpenFile  -win $_nWave0 sim_dump.fsdb

2. Delta Cycle View for Reset Debug

At time 0, many signals transition in the same simulation timestep through delta cycles. Enable View → Show Delta Cycle to see these sub-step transitions — essential for debugging X→0 initialization issues at reset release.

3. KDB Reuse Across Sessions

The KDB (sim.kdb/ directory) is generated once during compile. Reuse it without recompiling by launching: verdi -kdb sim.kdb -ssf new_dump.fsdb. Only recompile when RTL changes.

4. Value Change Search

Instead of scrolling to find when a signal changed: right-click the signal → Search Value Change → specify direction and value. Verdi jumps cursor to the next transition matching your criteria. Critical for finding the first assertion of an error flag in a long simulation.

5. Compare Two Simulation Runs

Load two FSDB files simultaneously: verdi -ssf run1.fsdb run2.fsdb. Both sets of signals appear in the signal panel — add corresponding signals from each run into adjacent rows in nWave to visually diff behavior between a passing and failing simulation.

6. Annotate RTL with Simulation Values

In nTrace (source viewer), go to View → Annotate Values. Every signal declaration in the source file is annotated with its value at the current cursor time — like a live linting of your RTL with actual runtime data.

7. Assertion Debug with $fsdbDumpSVA

When you dump SVA results with $fsdbDumpSVA(), assertion pass/fail events appear as special markers in nWave. Click a failing assertion marker → TFV shows exactly what signal violated the property and when.

12 FAQ

What is the difference between FSDB and VCD?

FSDB is Synopsys's proprietary waveform format — 5–10× smaller than VCD, supports multi-dimensional arrays ($fsdbDumpMDA), SVA assertion pass/fail events ($fsdbDumpSVA), and UVM transaction data. FSDB also supports incremental loading, so Verdi can display waveforms while simulation is still running. Always prefer FSDB when using VCS + Verdi; use VCD only when sharing waveforms with tools that don't support FSDB.

What is Temporal Flow View and how do I use it?

TFV is Verdi's root-cause debug engine. Place your cursor at the bad timestamp, right-click the suspicious signal, and select "Trace X Value" (for X) or "Show Driver" (for 0/1). Verdi opens a flow diagram showing the entire logic cone that produced the bad value — working backward through gates and flip-flops, across clock cycles, to the original source. Click any node to trace further. It's the fastest way to find X propagation sources and unexpected logic values.

How do I reload FSDB without restarting Verdi?

Press F5 or use File → Reload FSDB. In Tcl: wvCloseFile -win $_nWave0 then wvOpenFile -win $_nWave0 sim_dump.fsdb. Your signal groups, radix, colors, and markers remain intact. A common workflow: have a shell alias that re-runs the simulation and sends a Tcl reload command to the running Verdi session.

What is KDB and when should I use it?

KDB (Knowledge DataBase) is a compiled design representation stored to disk by VCS when you pass -kdb at compile time. Instead of re-parsing RTL source files every time you open Verdi, you point to the KDB with verdi -kdb sim.kdb for instant startup. KDB also enables better cross-probe accuracy and is required for some advanced Verdi features like formal result viewing. Recompile KDB only when RTL changes; reuse it across all debug sessions for the same build.

How do I keep FSDB file size manageable on large designs?

Use depth-limited scope dumps: $fsdbDumpvars(1, tb.dut) dumps only the top level of dut, not its sub-modules. Call $fsdbDumpoff during simulation phases you don't need (e.g., memory initialization). For targeted debug, dump only the module hierarchy relevant to your bug. You can also add multiple selective $fsdbDumpvars calls covering specific sub-modules at full depth while keeping everything else shallow.

How do I debug X-propagation using Verdi?

Find the output signal with an unexpected X, right-click the X waveform region → "Trace X Value". Verdi opens TFV and shows exactly which gate or flip-flop is driving X, with all its inputs annotated. Common X sources: uninitialized registers (add initial blocks or check reset), case without default (all outputs need explicit assignment), multi-driver conflicts (check multiple assign driving same net), or interface signals not driven during reset. Enable View → Show Delta Cycle to see X→0 transitions at reset release.

Can I use Verdi with simulators other than VCS?

Yes. Verdi reads VCD (produced by any simulator), and can read FSDB from Cadence Xcelium and Mentor Questa via their respective PLI/DPI integrations. The Novas PLI library (novas.tab + pli.a) can be linked into most simulators to enable FSDB dumping. Cross-probe works best with VCS+KDB. With other simulators you can still use nWave for waveform viewing and TFV for logic tracing, but the source-level cross-probe requires the design to be loaded separately with -sverilog -f flist.f.