Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/dalance/svls

SystemVerilog language server
https://github.com/dalance/svls

language-server rust systemverilog verilog

Last synced: about 2 months ago
JSON representation

SystemVerilog language server

Awesome Lists containing this project

README

        

# svls

SystemVerilog language server

[![Actions Status](https://github.com/dalance/svls/workflows/Regression/badge.svg)](https://github.com/dalance/svls/actions)

[![Crates.io](https://img.shields.io/crates/v/svls.svg)](https://crates.io/crates/svls)
[![svlint](https://snapcraft.io/svls/badge.svg)](https://snapcraft.io/svls)
[![AUR version](https://img.shields.io/aur/version/svls?logo=Arch-Linux)](https://aur.archlinux.org/packages/svls/)

![test](https://user-images.githubusercontent.com/4331004/68925756-23478f00-07c7-11ea-84f3-2afd23ed2764.gif)

## Feature

* Linter based on [svlint](https://github.com/dalance/svlint).

## Installation

### Download binary

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

### snapcraft

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

```
sudo snap install svls
```

### Cargo

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

```
cargo install svls
```

## Configuration

### Language server

svls uses `.svls.toml` at the root of repository.
The example of `.svls.toml` is below:

```toml
[verilog]
include_paths = ["src/header"]
defines = ["DEBUG", "VAR=1"]
plugins = ["path/to/libfoo.so", "path/to/libbar.so"]

[option]
linter = true
```

#### `[verilog]` section

`include_paths` is include paths from the root of repository.
`defines` is define strings.
`plugins` is paths to svlint plugins from the working directory.

#### `[option]` section

`linter` shows whether linter feature is enabled.

### Linter

Linter uses `.svlint.toml` at the root of repository.
If `.svlint.toml` can't be used, all lint rules are enabled.
Please see [svlint#configuration](https://github.com/dalance/svlint/blob/master/MANUAL.md#configuration) for the detailed information.

## Usage

### Visual Studio Code

Please install [svls-vscode](https://marketplace.visualstudio.com/items?itemName=dalance.svls-vscode) extension from marketplace.

### Vim/Neovim with [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)

```viml
let g:LanguageClient_serverCommands = {
\ 'systemverilog': ['svls'],
\ }
```

### Vim/Neovim with [vim-lsp](https://github.com/prabirshrestha/vim-lsp)

```viml
if executable('svls')
au User lsp_setup call lsp#register_server({
\ 'name': 'svls',
\ 'cmd': {server_info->['svls']},
\ 'whitelist': ['systemverilog'],
\ })
endif
```

### Vim/Neovim with [coc.nvim](https://github.com/neoclide/coc.nvim)

In configuration file
```json
"languageserver": {
"svls": {
"command": "svls",
"filetypes": ["systemverilog"]
}
}
```

### Neovim with [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig)

In configuration file
```lua
{
"neovim/nvim-lspconfig",
opts = {
servers = {
svls = {
root_dir = function(fname)
return require("lspconfig.util").find_git_ancestor(fname)
end,
cmd = { "svls" },
filetypes = { "verilog", "systemverilog" },
},
},
},
}
```

### Emacs with [lsp-mode](https://github.com/emacs-lsp/lsp-mode)

```emacs-lisp
(use-package flycheck
:ensure t
:defer t
:init (global-flycheck-mode t))

(use-package company
:ensure t
:defer t
:init (global-company-mode t)
:config
;; Company Flx adds fuzzy matching to company, powered by the sophisticated
;; sorting heuristics in =flx=
(use-package company-flx
:ensure t
:after company
:init (company-flx-mode t))
;; Company Quickhelp
;; When idling on a completion candidate the documentation for the
;; candidate will pop up after `company-quickhelp-delay' seconds.
(use-package company-quickhelp
:after company
:ensure t
;; :init (company-quickhelp-mode t)
:hook (prog-mode . (lambda ()
(when (window-system)
(company-quickhelp-local-mode))))
:config
(setq company-quickhelp-delay 0.2
company-quickhelp-max-lines nil)))

(use-package lsp-mode
:defer t
:ensure t
:commands lsp
:config
(setq lsp-log-io nil
lsp-auto-configure t
lsp-auto-guess-root t
lsp-enable-completion-at-point t
lsp-enable-xref t
lsp-prefer-flymake nil
lsp-use-native-json t
lsp-enable-indentation t
lsp-response-timeout 10
lsp-restart 'auto-restart
lsp-keep-workspace-alive t
lsp-eldoc-render-all nil
lsp-enable-snippet nil
lsp-enable-folding t)
;;; lsp-ui gives us the blue documentation boxes and the sidebar info
(use-package lsp-ui
:defer t
:ensure t
:after lsp
:commands lsp-ui-mode
:config
(setq lsp-ui-sideline-ignore-duplicate t
lsp-ui-sideline-delay 0.5
lsp-ui-sideline-show-symbol t
lsp-ui-sideline-show-hover t
lsp-ui-sideline-show-diagnostics t
lsp-ui-sideline-show-code-actions t
lsp-ui-peek-always-show t
lsp-ui-doc-use-childframe t)
:bind
(:map lsp-ui-mode-map
([remap xref-find-definitions] . lsp-ui-peek-find-definitions)
([remap xref-find-references] . lsp-ui-peek-find-references))
:hook
((lsp-mode . lsp-ui-mode)
(lsp-after-open . (lambda ()
(lsp-ui-flycheck-enable t)
(lsp-ui-sideline-enable t)
(lsp-ui-imenu-enable t)
(lsp-lens-mode t)
(lsp-ui-peek-enable t)
(lsp-ui-doc-enable t)))))
;;; company lsp
;; install LSP company backend for LSP-driven completion
(use-package company-lsp
:defer t
:ensure t
:after company
:commands company-lsp
:config
(setq company-lsp-cache-candidates t
company-lsp-enable-recompletion t
company-lsp-enable-snippet t
company-lsp-async t)
;; avoid, as this changes it globally do it in the major mode instead (push
;; 'company-lsp company-backends) better set it locally
:hook (lsp-after-open . (lambda()
(add-to-list (make-local-variable 'company-backends)
'company-lsp)))))

(use-package verilog-mode
:defer t
:config
(require 'lsp)
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection '("svls"))
:major-modes '(verilog-mode)
:priority -1
))
:hook (verilog-mode . (lambda()
(lsp)
(flycheck-mode t)
(add-to-list 'lsp-language-id-configuration '(verilog-mode . "verilog")))))
```

### Emacs with [verilog-ext](https://github.com/gmlarumbe/verilog-ext)

```elisp
(require 'verilog-ext)
(verilog-ext-mode-setup)
(verilog-ext-eglot-set-server 've-svls) ;`eglot' config
(verilog-ext-lsp-set-server 've-svls) ; `lsp' config
```

### Helix

In `languages.toml`:

```toml
[language-server.svls]
command = "svls"

[[language]]
name = "verilog"
language-servers = ["svls"]
```