Skip to content

Features

VHDL Auto-Completion

The extension provides smart auto-completion as you type in VHDL files.

Suggested completions:

CategoryExamples
VHDL keywordsentity, architecture, signal, process, rising_edge, std_logic, case, when, for, loop (~80 keywords)
Local symbolssignals, variables, constants, and ports declared in the current file
Entitiesworkspace entity names (suggested after entity, component, architecture ... of)
Packagespackage names (suggested after use work.)
Package symbolssymbols inside a package (suggested after use work.pkgname.)

Context-aware filtering: when typing in an entity/component/architecture context, only entity names are shown — VHDL functions like rising_edge are excluded.

Variable CompletionEntity Completion


VHDL Navigation

Navigate through your VHDL project with full Ctrl+Click support.

Supported navigation:

  • entities
  • packages
  • package symbols
  • signals, variables, and constants declared in architectures
  • FPGA pin assignments
vhdl
entity work.uart_tx
vhdl
use work.pulse_pkg.all;

Jump directly to the declaration.

VHDL Outline (Document Symbols)

View the structure of your VHDL file in the Outline panel (Ctrl+Shift+O) or editor breadcrumb:

VHDL Outline

Entities use the Class (orange diamond) icon. Architecture-local signals, variables, constants, processes, and instantiations appear as children under the architecture block.

Supports: entities, architectures, packages, ports, generics, signals, constants, types, labelled processes, component declarations, direct entity instantiations, component instantiations.


FPGA Pin Integration

VHDL Essentials understands your .qsf constraints and links them directly to VHDL signals.

Pin Hover Information

Hover a top-level signal to instantly see the assigned FPGA pin.

Pin Hover


QSF Navigation

Ctrl+Click on a VHDL signal to jump directly to the corresponding pin assignment inside the .qsf file.

Integrated FPGA-aware navigation between:

  • VHDL
  • Quartus constraints
  • package symbols

Quartus Project Explorer

Dedicated FPGA project TreeView integrated inside VSCode.

Features:

  • Top-level entity detection
  • Pin assignment explorer (each pin shows blue plug icon)
  • Fit resource summary (logic elements, pins, registers, etc. with color-coded usage)
  • QuestaSim scripts explorer
  • Testbench management
  • Left-click on any file → opens it
  • Left-click on a pin assignment → opens .qsf at the pin line
  • Right-click on a testbench → Generate QuestaSim DO
  • Right-click on a .do file → Run QuestaSim simulation

Context Menu

Fit Resource Summary

After a successful (or failed) Quartus build, the tree view displays a Fit Summary section parsed from <output_dir>/<project>.fit.summary. Each resource (logic elements, pins, registers, PLLs, memory bits, etc.) is shown with its usage:

  • 🟢 Green check — usage below 70%
  • 🟡 Orange warning — usage between 70% and 90%
  • 🔴 Red error — usage at or above 90%

The summary is ordered by usage descending (most critical first), and the parent node shows $(pass) or $(error) depending on the Fitter status.

Fit Resource Summary


Quartus Workflow Integration

Run your FPGA workflow directly from VSCode.

Supported actions:

  • Build
  • Flash
  • Simulation launch
  • Questa .do generation

Integrated status bar controls:

Quick Commands

Integrated Build and Flash Output

VHDL Essentials provides integrated build execution and live tool output directly inside VSCode.

Quartus Build


Diagnostics

VHDL Essentials validates your code on multiple levels.

FPGA Pin Diagnostics

  • A top-level signal has no assigned FPGA pin → Warning
  • Constraints are missing from the .qsf → Warning
  • Same PIN_xx assigned to multiple signals → Error
  • Same signal assigned to multiple pins → Warning

VHDL Code Linters

  • Duplicate declarations — duplicate signal, variable, or port names in the same scope
  • Sensitivity list — signals read inside a process but missing from the sensitivity list
  • Syntax scopes — unclosed if, process, for/while loops, mismatched end labels
  • Port map validation — missing ports and undeclared formals detected in direct entity instantiations
  • Undeclared identifiers — identifiers used but never declared flagged as errors
  • Package body completeness — function/procedure declared in a package but not implemented in its body

All diagnostics appear in the Problems panel (Ctrl+Shift+M) with clear messages.

Code Actions (Quick Fixes)

Press Alt+Enter on any lint warning to apply an automatic fix:

DiagnosticFix action
Missing port in port mapAdd portName => open aligned after the last mapping
Undefined port in port mapRemove the entire mapping line
Duplicate signal/variable/port declarationRemove the duplicate line
Unused signal/variable/constantRemove the declaration line
Undeclared identifierAdd signal/variable/constant declaration with the identifier name
Missing/extra signal in sensitivity listAdd or remove the signal inline
Duplicate QSF pin assignmentRemove the duplicate line
Duplicate QSF signal assignmentQuickPick to choose which line to keep
QSF tab/spacesNormalize to spaces
Missing semicolonAdd ;
Wrong end keyword / nameSuggest correct keyword and name
Unclosed scopeAdd end <type>; after the block
else/elsif without ifWrap in if ... then ... end if;
when outside case/generateWrap in case ... is ... end case;
Package function/procedure stubGenerate stub in package body
Unassigned port without PINGenerate set_location_assignment stub

Code ActionsPackage Body Warning

Unused declarations, undeclared identifiers & TODO markers

Warns when a signal, variable, or constant is declared but never used (unused names are grayed out at 40% opacity). Detects identifiers used in expressions but never declared — flagged as errors to catch typos and missing declarations early. Scans for TODO, FIXME, HACK, XXX, and NOTE markers inside VHDL comments — shown as Info diagnostics with gold (#FFD700) highlighting.

Declarations inside VHDL comments (-- signal foo...) are correctly ignored by the linter. Package-scoped declarations are excluded from unused-signal checks (consumed cross-file via use work.pkg.all).

Unused declarations and TODO markers


Real-Time VHDL Syntax Checking

The extension validates VHDL syntax in real time as you type, highlighting errors directly in the editor.

Checked patterns:

  • Unclosed scopes — missing end for if, process, for...loop, while...loop, case, generate, block
  • Wrong loop terminationfor/while loops must close with end loop; (not end while;)
  • Missing semicolons — detected on statement lines (skips component instantiation)
  • Unexpected end — stray end without a matching open scope
  • Function/procedure body — declaration without is does not open a scope
  • Component instantiationlabel : entity work.xxx recognized, no false warnings

Syntax Check

No configuration needed — works out of the box on all .vhd and .vhdl files.


Semantic Highlighting

The extension provides semantic highlighting for:

  • entities
  • packages
  • imported package symbols
  • FPGA pin-aware signals

Highlighting only appears when declarations actually exist inside the indexed workspace.

QSF Highlighting


Automatic Workspace Indexing

Workspace-wide indexing for:

  • .vhd and .vhdl files
  • VHDL entities
  • packages
  • package symbols

The index updates automatically when files are created, deleted, or modified.


VHDL Snippets

Type a prefix and press Tab to expand into common VHDL constructs.

PrefixExpands to
entityEntity declaration with port list
archArchitecture body
pkgPackage declaration
pkgbPackage body
processSynchronous process with async reset
proc_nrSynchronous process (clock only)
proc_combCombinational process
fsmFinite state machine (register + next-state + output)
instDirect entity instantiation with port map
compComponent declaration
tbComplete testbench template
clockClock generation (clk <= not clk after 10 ns)
stimStimulus process
sigSignal declaration
sigvVector signal declaration
varVariable declaration
constConstant declaration
typeEnumerated type declaration
subtypeSubtype declaration
caseCase/when statement
forFor loop
ifIf/elsif/else statement
funcFunction body
procProcedure body
func_declFunction prototype (for packages)
proc_declProcedure prototype (for packages)
forgFor generate
ifgIf generate
cntCounter with reset and enable
srShift register
othersOthers aggregate (others => '0'/'1')
waitWait for/on/until
assertAssert/report with severity