This release is a pre-release and may not be stable for production use.
LabVIEW FPGA HDL Tools
Pre-release command-line tools (nihdl) for building customized FPGA designs
for use with the ni/flexrio repository. They move, generate, and process the
files needed to take a top-level HDL design to a LabVIEW FPGA bitfile through
either of two compile flows (see below).
The two compile flows
nihdl supports two ways to turn a top-level HDL design into a LabVIEW FPGA
bitfile. Both start by extending the board's open-source top-level HDL, and both
run Vivado in the end — they differ in what compiles the bitfile:
- Vivado compile flow — extend the design in HDL and compile the bitfile
directly in Vivado (
gen-vivado→compile-vivado). The host talks to your logic over registers and DMA FIFOs via the NI-RIO driver — no LabVIEW required. - LabVIEW FPGA compile flow — package your HDL as a custom LabVIEW FPGA
target (
gen-target→install-target), then write a VI and let LabVIEW FPGA compile the bitfile (it runs Vivado under the hood).
Host-side note: to communicate with the compiled
.lvbitxfrom a LabVIEW FPGA host VI, open it with Open Dynamic Bitfile Reference (wire in the bitfile path and a matching FPGA Interface Dynamic Refnum) — the standard Open FPGA VI Reference node does not work with these custom targets. See Vivado Compile Flow → Opening the bitfile from a LabVIEW FPGA host VI.
In short: in the Vivado flow you drive Vivado; in the LabVIEW FPGA flow LabVIEW FPGA drives Vivado for you. See Theory of Operation for the full story.
Documentation
| Doc | What's in it |
|---|---|
| Theory of Operation | The architecture, the supported workflows, and how the pieces fit together. Start here. |
| Vivado Compile Flow | End-to-end walkthrough: extend the HDL, generate a Vivado project, and compile a .lvbitx directly in Vivado. |
| LabVIEW FPGA Target and Compile Flow | End-to-end walkthrough: build and install a custom LabVIEW FPGA target, then compile in LabVIEW FPGA. |
| ModelSim Simulation Flow | End-to-end walkthrough: build the Xilinx sim libraries, create the ModelSim project, and run a testbench. |
| Command Reference | Every nihdl command, its options, the command flow, and per-command required settings. |
| Settings Reference | The nihdlsettings.py model: hooks, context, --set overrides, and the full list of setters. |
| LVTargetCustomIO Reference | The custom I/O CSV format used to define HDL ↔ LabVIEW FPGA signals. |
| Generated VHDL | What VHDL the tools generate (window wrappers, PkgNiHdlSettings) and why — single-sourcing the facts shared by the HDL and the LabVIEW FPGA target. |
| Window Netlist and Constraints | How the LabVIEW Window netlist is produced/consumed and how XDC constraints are processed for each compile flow (including the current_instance scoping rules). |
Prerequisites
External tools
You need the external tools your flow uses:
- Vivado — for
gen-vivado,check-vivado, andcompile-vivado(use the version your FlexRIO release targets). - LabVIEW + LabVIEW FPGA and the LabVIEW FPGA Compilation Tool for
Vivado — for
gen-lvbitxand custom LabVIEW FPGA targets. - ModelSim — only for simulation (
gen-modelsim,sim-modelsim,launch-modelsim,compile-modelsim-lib).compile-modelsim-libalso needs Vivado to compile the Xilinx simulation libraries. - Git and Python — the tools support Python 3.10–3.14; CI tests on 3.10 through 3.14 (3.11 is also used for static analysis).
Installing the tools
nihdl is published to PyPI
and is normally installed into a per-target Python virtual environment by the
host repository's setup script. From a target folder that contains
nihdlsettings.py (for example,
c:/dev/github/flexrio-custom/targets/pxie-7903custom), run:
nisetup
This creates and activates a virtual environment and installs the version of
labview-fpga-hdl-tools pinned in the repository's dependencies.toml. Re-run
nisetup in every new terminal — the environment is only active for the current
session, and you'll see the environment name (for example, (flexrio-custom))
in your prompt when it is active.
To install the package directly instead (for example, outside a flexrio-custom checkout):
pip install labview-fpga-hdl-tools
Required Files
Every target folder must contain a nihdlsettings.py file. It configures all
paths, tool locations, and project settings via setter calls, and defines hook
functions that run before/after each command. The CLI exits with an error if it
is not found.
A complete starter template lives at
labview_fpga_hdl_tools/nihdlsettings_default.py — copy it into your target
folder as nihdlsettings.py and customize it. See the
Settings Reference for details.
All nihdl commands are run from the target folder unless noted otherwise:
nihdl --help
By default nihdl prints results inline and collects any warnings and errors
into a single summary at the end. Add -v (--verbose) to any command for full
step-by-step status with warnings and errors also shown inline; the end summary
still appears, so verbose is additive to the default. See the
Command Reference for details.
Quickstart: the Vivado compile flow
Run these from your target folder (the one with nihdlsettings.py), with the
Python environment active (run nisetup once per terminal — see
Prerequisites):
# 1. Pull in GitHub dependencies declared in dependencies.toml
nihdl install-deps
# 2. Create the Vivado project from your settings + HDL file lists
# (this also runs gen-hdl and gen-xdc automatically)
nihdl gen-vivado --overwrite
# 3. Fast RTL elaboration check before a full compile
nihdl check-vivado
# 4. Full compile to a bitstream and LabVIEW FPGA bitfile
# (this runs gen-lvbitx automatically at the end)
nihdl compile-vivado
Open the project interactively at any point with nihdl launch-vivado.
Full walkthrough: Vivado Compile Flow.
The LabVIEW FPGA compile flow (custom target)
To expose your HDL to LabVIEW FPGA as a custom target, define your I/O in the custom I/O CSV, then:
# Generate target support files (BoardIO/Clock XML, Window VHDL, plugin content)
nihdl gen-target
# Close ALL LabVIEW instances, then install the generated plugin into your LabVIEW FPGA install
nihdl install-target
Close LabVIEW around
install-target. Close all LabVIEW instances before running it, and (re)start LabVIEW afterward — LabVIEW only scans for target plugins at startup.
Full walkthrough: LabVIEW FPGA Target and Compile Flow.
Simulating with ModelSim
# Create the ModelSim project and compile all VHDL, then run the testbench
nihdl gen-modelsim --overwrite
nihdl sim-modelsim # or: nihdl launch-modelsim (GUI; --batch for headless)
Full walkthrough: ModelSim Simulation Flow — including the Xilinx simulation libraries and how the pass/fail verdict works.
For the complete command list, options, and required settings, see the Command Reference.
Validating Without External Tools
To exercise settings and file generation without launching Vivado or ModelSim,
set skip flags in your nihdlsettings.py:
def pre_all(context):
config = context.config
# ... configure settings ...
config.set_skip_vivado(True)
config.set_skip_modelsim(True)
Troubleshooting / FAQ
Error: Settings file not found: ...nihdlsettings.py
Run the command from the target folder that contains nihdlsettings.py, or pass
--config path/to/nihdlsettings.py.
A command reports a missing required setting.
Each command validates the settings it needs before running. Check the
Per-Command Setting Requirements
table and confirm the corresponding setter is called in pre_all(). Remember
that relative paths resolve from the nihdlsettings.py file's directory.
A relative path isn't resolving the way I expect.
All hooks run with the working directory set to the nihdlsettings.py file's
directory, and path setters resolve relative paths from there. Use forward
slashes (/) on every platform.
launch-vivado / check-vivado / compile-vivado can't find the project.
Run nihdl gen-vivado --overwrite first; these commands require an existing
.xpr.
gen-lvbitx warns it isn't in the right place.
It is intended to run from VivadoProject/<project>.runs/impl_1. It also needs
to locate createBitfile.exe; it auto-discovers the latest installed LabVIEW
(2023–2030), or set set_labview_path(...) to point at a specific install.
A dependency file collides by name with a target-specific copy.
Use add_exclude_hdl_file_list(...) to drop the unwanted copy from the
assembled HDL file list.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file labview_fpga_hdl_tools-2.0.0.dev5.tar.gz.
File metadata
- Download URL: labview_fpga_hdl_tools-2.0.0.dev5.tar.gz
- Upload date:
- Size: 88.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec52d0f9907d3df0bd5b7516e00f367854c96a179dde046787ef31fb6fe1884d
|
|
| MD5 |
580de121ee2dc8bbb69409b66d7643de
|
|
| BLAKE2b-256 |
67117b08f4bf15d698c0d752b742a0f0f1a1514557c5fe6a278f953a7a2a99e7
|
Provenance
The following attestation bundles were made for labview_fpga_hdl_tools-2.0.0.dev5.tar.gz:
Publisher:
publish.yml on ni/labview-fpga-hdl-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
labview_fpga_hdl_tools-2.0.0.dev5.tar.gz -
Subject digest:
ec52d0f9907d3df0bd5b7516e00f367854c96a179dde046787ef31fb6fe1884d - Sigstore transparency entry: 2334929323
- Sigstore integration time:
-
Permalink:
ni/labview-fpga-hdl-tools@ae4f521ebfc22d928fc8c9783d7e7862eae94092 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ni
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ae4f521ebfc22d928fc8c9783d7e7862eae94092 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file labview_fpga_hdl_tools-2.0.0.dev5-py3-none-any.whl.
File metadata
- Download URL: labview_fpga_hdl_tools-2.0.0.dev5-py3-none-any.whl
- Upload date:
- Size: 103.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3f334dbb1fd8e16737797c1f626ef3bec36dbfa5cd788bc0c7b10dba1304062c
|
|
| MD5 |
81654989018886531be7b0c2fd0efabb
|
|
| BLAKE2b-256 |
43ee72e508af756fd4f65362d2cf168aab2dbb29b2b58bb62d739004ffa40f1f
|
Provenance
The following attestation bundles were made for labview_fpga_hdl_tools-2.0.0.dev5-py3-none-any.whl:
Publisher:
publish.yml on ni/labview-fpga-hdl-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
labview_fpga_hdl_tools-2.0.0.dev5-py3-none-any.whl -
Subject digest:
3f334dbb1fd8e16737797c1f626ef3bec36dbfa5cd788bc0c7b10dba1304062c - Sigstore transparency entry: 2334929339
- Sigstore integration time:
-
Permalink:
ni/labview-fpga-hdl-tools@ae4f521ebfc22d928fc8c9783d7e7862eae94092 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ni
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ae4f521ebfc22d928fc8c9783d7e7862eae94092 -
Trigger Event:
workflow_dispatch
-
Statement type: