Our List of VHDL, Verilog and SystemVerilog Lint Tools

Last update: August 2022

Over the years, we’ve been looking at a number of tools to check the quality of the generated code for our web-based AXI4 register generator. Here’s a compiled list of what we have found so far. Not all tools listed below are pure linters: some are HDL editors/IDEs, others are simulators with linting capabilities. The tools are listed in alphabetical order:

Aldec ALINT-PRO

AMIQ DVT Eclipse IDE, an Eclipse-based HDL editor with linting capabilities. The same company provides a SystemVerilog Testbench Linter called Verissimo.

BluePearl Analyze RTL

GHDL, a free VHDL simulator (using the -s switch).

HDL Works HDL Companion.

Siemens EDA HDL Designer has a built-in DesignChecker tool.

Mentor Graphics Questa CDC, a tool for clock-domain crossing verification.

Real Intent Ascent

Sigasi Studio, an Eclipse-based HDL editor, has built-in linting checks such as incomplete sensitivity lists and dead code detection.

Siemens EDA Questa Lint

slang, a software library that provides various components for lexing, parsing, type checking, and elaborating SystemVerilog code.

svlint, an open-source SystemVerilog linter.

Synopsys SpyGlass

TerosHDL, an open-source IDE with code linting capabilities.

Verible has a SystemVerilog style linter (verible-verilog-lint).

Verific INVIO, a framework for building custom EDA tools.

Verilator, a free Verilog simulator has built-in linting checks.

VHDL Style Guide (VSG), a tool for enforcing VHDL coding styles.

VHDL-Tool, a VHDL syntax checking, type checking and linting tool.

Xilinx Vivado Design Suite has a lot of built-in DRCs including clock-domain crossings.

Know a tool that’s not in this list? Please let us know.

How To Integrate an airhdl Register File in Xilinx Vivado 2015.3

AirHDL is a free, web-based EDA tool for managing Xilinx ZYNQ and MicroBlaze register files. In this post, I will show you how to integrate an AirHDL-generated register file in a Xilinx ZYNQ design using Vivado 2015.3.

For the purpose of this article, I will use the “Base Zynq” example project that comes with Vivado. It’s a block diagram design of a simple Zynq processsing system with two peripherals: a GPIO and a block memory.

2016-01-18_10-37-14

What we’re going to do is add a custom bus peripheral component with an AirHDL-generated register file to this design.

In Vivado, open the “Address Editor” view and look for a free address range for the register map that you’ll create in AirHDL.

2016-01-18_10-42-51

I will use 0x4200_0000.

In AirHDL, create a new register map called “myMap” and make sure to use the base address you selected before (in my case: 0x4200_0000) as the regitster map’s base address:

2015-12-26_17-44-47

Add a few registers to the newly created register map. I will add a read-write “control” register with a 1-bit “value” field and a read-only “status” register with also a 1-bit “value” field. In AirHDL, each register field will map to a separate port in the generated RTL component.2015-12-26_17-48-38For every register map that you create, AirHDL generates a number of different output products that you can download:

  • C Header
  • VHDL Package
  • VHDL Component
  • VHDL Instantiation Template
  • VHDL Testbench
  • HTML Documentation
  • IP-XACT Specification
  • JSON Specification

For the purpose of the integration into a Xilinx Vivado hardware design, the only files that you need are the VHDL Package and the VHDL Component. Download these and save them into an empty folder on your hard drive (e.g. e:\temp\mymap).

2015-12-26_18-06-50

Back in Vivado, select Tools > Create and Package IP…

Select “Package a specified directory” and select the directory containing the downloaded AirHDL files (in my case: e:\temp\mymap).

2016-01-18_10-44-58

In the automatically created IP project, check that the ports and interfaces are correct. In particular you’ll expect that the slave AXI interface and the the clock and reset signals have been detected correctly, and that the user I/Os corresponding to each register field appear in the list:

2016-01-18_10-46-42

Also note that for processor-writable registers, AirHDL generates a “strobe” port that signals when the register value has been updated by the CPU.

Click “Package IP”

Back in your Vivado “Base Zynq” project, click “Add IP” and select the “myMap_regs” component:

2016-01-18_10-51-34

In the block diagram editor, click “Run Connection Automation”. This will connect our component’s AXI-interface to the AXI interconnect:

2016-01-18_10-52-35

Open the “Address Editor” view and update the “Offset Address” and “Range” properties of the “myMap_regs” component using the value found in the AirHDL register map view (for the range, use the next higher choice available):

2016-01-18_10-54-51

In the block diagram, select the “control_value” and “status_value” ports of the “myMap_regs” component, right-click and select “Make External”. This will create top-level input and output ports and connect them to the register fields.

2016-01-18_10-56-08

You’re done! You can now run the synthesis and implementation to generate the bitstream.