# svlint

SystemVerilog linter

[![Actions Status](https://github.com/dalance/svlint/workflows/Regression/badge.svg)](https://github.com/dalance/svlint/actions)
[![Snap Status](https://build.snapcraft.io/badge/dalance/svlint.svg)](https://build.snapcraft.io/user/dalance/svlint)
[![codecov](https://codecov.io/gh/dalance/svlint/branch/master/graph/badge.svg)](https://codecov.io/gh/dalance/svlint)

[![Crates.io](https://img.shields.io/crates/v/svlint.svg)](https://crates.io/crates/svlint)
[![svlint](https://snapcraft.io/svlint/badge.svg)](https://snapcraft.io/svlint)

![svlint](https://user-images.githubusercontent.com/4331004/67759664-377b5480-fa83-11e9-895f-7deef6dde516.png)

## Installation

### Download binary

Download from [release page](https://github.com/dalance/svlint/releases/latest), and extract to the directory in PATH.

### snapcraft

You can install from [snapcraft](https://snapcraft.io/svlint)

```
sudo snap install svlint
```

### Cargo

You can install by [cargo](https://crates.io/crates/svlint).

```
cargo install svlint
```

## Usage

### Configuration

First of all, you must put a configuration file `.svlint.toml` to specify enabled rules.
Configuration file is searched to the upper directory until `/`.
So you can put configuration file (`.svlint.toml`) on the repository root like `.gitignore`.

The example of configuration file is below:

```toml
[option]
exclude_paths = ["ip/.*"]

[rules]
non_ansi_module = true
wire_reg = true
```

The complete example can be generated by `svlint --example`

#### `[option]` section

`exclude_paths` is a list of regular expression. If a file path is matched with the list, the file is skipped to check.

#### `[rules]` section

By default, all rules are disabled. If you want to enable some rules, `true` can be specified.

#### Configuration update

If svlint is updated, `.svlint.toml` can be updated to the latest version by `svlint --update`.

### Rules

All rules are [here](./RULES.md).
Suggesting a new rule through [Issues](https://github.com/dalance/svlint/issues) or [Pull requests](https://github.com/dalance/svlint/pulls) is welcome.

### Plugin

svlint supports rule plugin. A sample project is below:

https://github.com/dalance/svlint-plugin-sample

### Filelist

svlint supports filelist like major EDA tools.
The following features are supported.

* Substitute environment variables
* Specify include directories by `+incdir`
* Define Verilog define by `+define`
* Include other filelists by `-f`

An example is below:

```
xxx.sv
${XXX_DIR}/yyy.sv
$(XXX_DIR)/zzz.sv
+incdir+$(PWD)/header/src
+define+SYNTHESIS
-f other.f
```

### Option

```
svlint 0.2.12

USAGE:
    svlint [FLAGS] [OPTIONS] <files>...

FLAGS:
        --example    Prints config example
    -h, --help       Prints help information
    -s, --silent     Suppresses message
    -1               Prints results by single line
        --update     Updates config
    -V, --version    Prints version information
    -v, --verbose    Prints verbose message

OPTIONS:
    -c, --config <config>           Config file [default: .svlint.toml]
    -d, --define <defines>...       Define
    -f, --filelist <filelist>...    File list
    -i, --include <includes>...     Include path
    -p, --plugin <plugins>...       Plugin file

ARGS:
    <files>...    Source file
```

