blob: 8fe2666c0484a7b3815877d53d5eb0a2c27c30ee [file] [log] [blame] [view]
# SystemVerilog Language Server
The language server can be hooked up to your IDE or text editor to provide
assistance while programming. It helps highlight syntax errors or lint
violations and provides fixes for issues if they are available.
The language server is part of the Verible suite and called
`verible-verilog-ls`.
### This is work in progress
There are a few changes in the review pipeline, so here is the current
progress
- [x] Publish diagnostics for syntax errors and lint rules
- [x] Use lint configuration from `.rules.verible_lint` instead of all enabled
- [x] Provide code actions for autofixes provided by lint rules
- [x] Generate file symbol outline ('navigation tree')
- [x] Provide formatting.
- [x] Highlight all the symbols that are the same as current under cursor.
- [ ] Take scope and type into account to only highlight _same_ symbols.
- [ ] Provide useful information on hover
([#1187](https://github.com/chipsalliance/verible/issues/1187))
- [x] Find definition of a symbol even if in another file (check [Configuring the Language Server for a project](#configuring-the-language-server-for-a-project)).
- [x] Find references of a symbol even if in another file (check [Configuring the Language Server for a project](#configuring-the-language-server-for-a-project)).
- [ ] Find declaration of a symbol even if in another file.
([#1189](https://github.com/chipsalliance/verible/issues/1189))
- [ ] Provide Document Links (e.g. opening include files)
([#1190](https://github.com/chipsalliance/verible/issues/1190))
- [ ] Rename refactor a symbol
## Configuring the Language Server for a project
### Adding `verible.filelist` for project-wide symbol discovery
`verible-verilog-ls` by default loads and analyses only currently edited files in the editor.
To be able to utilize such features as going to definition, going to references, printing hover info project-wide, add a `verible.filelist` file to the project.
`verible.filelist` is a file containing a list of design files (listed line by line).
It is used to collect data necessary to build a symbol table and other helper structures to allow Language Server to find symbols' origin and type to support afore-mentioned features.
If a list of files used in design is already present, it can just be linked in the project root under name `verible.filelist`.
Otherwise, it can be easily created using such tools as `find`, e.g.:
```bash
find . -name "*.sv" -o -name "*.svh" -o -name "*.v" | sort > verible.filelist
```
The paths in the `verible.filelist` can be either relative to the location of the file or absolute.
It is possible to change the default name of the filelist with the `--file_list_path <new-file-name>` flag.
### Project Root
The Language Server looks for the `verible.filelist` file in the project root.
#### From Editor
The project root is typically determined by the editor and sent to the language server.
The provided workspace directory can vary between editors, usually it is a directory:
* Where the editor was started,
* Where the editor found the root of the project (e.g. based on `.git` directory)
* That is provided by the user in the project's settings in the editor.
#### Fallback
If there is no valid project root directory provided by the editor, Verible falls back to use the current directory.
You can override the project root that is used with the environment variable `VERIBLE_LS_PROJECTROOT_OVERRIDE`.
If that is set, it takes precedence over the editor-provided project root.
### Adding project-specific linter configuration
By default, Language Server publishes all possible linting issues for a given document.
It is possible to disable certain linter warnings for a given project using the `.rules.verible_lint` file.
It is a simple file that consists of comma-separated or newline-separated settings for rules, e.g.:
```
-module-filename
+posix-eof
-no-tabs
```
Disables the check for matching module and file name, tabs instead of spaces and enables rule disallowing ending file without an empty newline.
For more information on linter setup and available flags, check [SystemVerilog Style Linter](../lint/README.md).
Possibly the easiest way to introduce per-project linter configuration for the Language Server would be to run it with `--rules_config_search` path.
It will search for the `.rules.verible_lint` file up in the directory hierarchy with respect to the file's current path.
It is also possible to provide a direct path to the linter configuration, e.g.:
```bash
verible-verilog-ls --rules_config <path-to-config>
```
Or provide rules configuration directly, e.g.:
```bash
verible-verilog-ls --rules=+line-length=length:80,-no-tabs
```
### Other customizations of the Language Server
To check other configuration options for the `verible-verilog-ls`, run:
```bash
verible-verilog-ls --helpfull
```
## Hooking up to editor
After [installing the verible tools](../../../README.md#installation), you
can configure your editor to use the language server.
This will be specific to your editor. In essence, you need to tell
it to start the `verible-verilog-ls` language server whenever it works with
Verilog or SystemVerilog files.
Here are a few common editors, but there are many more that support language
servers. If you have configured it for your editor, consider sending
a pull request that adds a section to this README (or file an issue an
mention what you had to do and we add it here).
In alphabetical order
### Emacs
The `lsp-mode` needs to be installed from wherever you get your emacs
packages.
Here is a simple setup: put this in your `~/.emacs` file
and make sure the binary is in your `$PATH` (or use full path).
```elisp
(require 'lsp-mode)
(add-to-list 'lsp-language-id-configuration '(verilog-mode . "verilog"))
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "verible-verilog-ls")
:major-modes '(verilog-mode)
:server-id 'verible-ls))
(add-hook 'verilog-mode-hook 'lsp)
```
It is also possible to automatically configure `eglot` and `lsp-mode` using
the [verilog-ext](https://github.com/gmlarumbe/verilog-ext.git) package:
```elisp
(require 'verilog-ext)
(verilog-ext-mode-setup)
(verilog-ext-eglot-set-server 've-verible-ls) ;`eglot' config
(verilog-ext-lsp-set-server 've-verible-ls) ; `lsp' config
```
### Kakoune
First, go to [kak-lsp](https://github.com/kak-lsp/kak-lsp) project and follow the installation and configuration steps.
Then, either find a `kak-lsp.toml` language server configuration file or create a new one in the `~/.config/kak-lsp` directory (using [a default template](https://github.com/kak-lsp/kak-lsp/blob/master/kak-lsp.toml) from the project repository).
After this, in the `kak-lsp.toml` file create a new entry:
```toml
[languages.verilog]
filetypes = ["v", "sv"]
roots = ["verible.filelist", ".git"]
command = "verible-verilog-ls"
offset_encoding = "utf-8"
```
To add additional configuration arguments to the `verible-verilog-ls`, add `args` list, e.g.:
```toml
args = ["--rules_config_search"]
```
Later, in the `kakrc` file (usually located in `~/.config/kak/kakrc`), adjust a hook for enabling Language Server to start for `verilog` language, e.g.:
```kak
hook global WinSetOption filetype=(rust|python|go|javascript|typescript|c|cpp|verilog) %{
lsp-enable-window
}
```
### Kate
https://docs.kde.org/trunk5/en/kate/kate/kate-application-plugin-lspclient.html
First, enable LSP by checking `Settings > Configure Kate > Plugins > LSP Client`
Then, there is a new `{} LSP Client` icon appearing on the left of the configure dialog. In the _User Server Settings_ tab, enter the lsp server configuration
to get it started up on our Verilog/SystemVerilog projects.
```json
{
"servers": {
"verilog": {
"command": ["verible-verilog-ls"],
"root": "",
"url": "https://github.com/chipsalliance/verible"
},
"systemverilog": {
"command": ["verible-verilog-ls"],
"root": "",
"url": "https://github.com/chipsalliance/verible"
}
}
}
```
It is possible to provide additional flags and arguments in `command` entry as list, e.g. `["verible-verilog-ls", "--rules_config_search"]`.
### Neovim
Make sure to have version `0.5.0` or newer and install the [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig/) plugin.
You can install it with the popular [vim-plug](https://github.com/junegunn/vim-plug) plugin manager by adding the following code to your ~/.config/nvim/init.vim file:
```vim
call plug#begin()
Plug 'neovim/nvim-lspconfig'
call plug#end()
```
Then to install it open neovim and type: ``` :PlugInstall ```
After installing nvim-lspconfig, enable the verible config by appending the following script to your ~/.config/nvim/init.nvim file:
```lua
lua << EOF
-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
-- Enable completion triggered by <c-x><c-o>
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local bufopts = { noremap=true, silent=true, buffer=bufnr }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
vim.keymap.set('n', '<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, bufopts)
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
vim.keymap.set('n', '<space>a', vim.lsp.buf.code_action, bufopts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
vim.keymap.set('n', '<space>f', vim.lsp.buf.formatting, bufopts)
end
local lsp_flags = {
-- This is the default in Nvim 0.7+
debounce_text_changes = 150,
}
require'lspconfig'.verible.setup {
on_attach = on_attach,
flags = lsp_flags,
root_dir = function() return vim.loop.cwd() end
}
EOF
```
This script initializes the verible language server in neovim and also enables shortcuts for functionalities such as auto-fix (space + a).
See https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#verible for configuration options.
### Sublime
Consult https://lsp.readthedocs.io/
Installation steps
1. Enable package control if not already `Tools > Install Package control...`
2. Install LSP base package: `Preferences > Package Control` search for
`Install Package`. Confirm, then search for `LSP`.
3. Also, while at it, if you haven't already, install the `SystemVerilog`
package, which gives you general syntax highlighting.
4. Go to `Preferences > Package Settings > LSP > Settings`. It opens
a global setting file and a user setting skeleton. Put the following
in your user `LSP.sublime-settings`; it already provides the empty outer
braces, you need to add the `"clients"` section.
```json
// Settings in here override those in "LSP/LSP.sublime-settings"
{
"clients": {
"verible-verilog-ls": {
"command": ["verible-verilog-ls"],
"enabled": true,
"selector": "source.systemverilog"
}
}
}
```
There is a `Tools > LSP > Troubleshoot Server Configuration` which might
be helpful in case of issues.
To customize the Language Server with additional flags, type the command flags in the `command` list, e.g. `["verible-verilog-ls", "--rules_config_search"]`.
### Vim
To make LSP work in Vim a dedicated LSP plugin is required.
The recommended plugin is [vim-lsp](https://github.com/prabirshrestha/vim-lsp), which is compatible with Vim8 and later releases.
Please refer to its README for installation guides and configuration recommendations.
To enable Verible with the following plugins, add the corresponding snippet to your configuration file (e.g. ``~/.vimrc``):
Configure with [vim-lsp](https://github.com/prabirshrestha/vim-lsp):
```viml
if executable('verible-verilog-ls')
au User lsp_setup call lsp#register_server({
\ 'name': 'verible-verilog-ls',
\ 'cmd': {server_info->['verible-verilog-ls']},
\ 'allowlist': ['verilog', 'systemverilog'],
\ })
endif
```
Make sure ``verible-verilog-ls`` is available in your ``PATH`` and can be executed.
Alternatively modify the snippet above to use an absolute path.
To add configuration flags to customize the Language Server, add them to the list in the `server_info`.
Alternatively, Verible can be configured with [lsp](https://github.com/yegappan/lsp), which is written in vim9script and compatible with `vim v9+`.
Configure with [lsp](https://github.com/yegappan/lsp):
```viml
call LspAddServer([#{
\ name: 'verible-verilog-ls',
\ filetype: ['systemverilog', 'verilog'],
\ path: 'verible-verilog-ls',
\ args: []
\ }])
```
Add configuration flags to args (eg. `args: ['--column_limit=80']`).
### VSCode
#### Use released extension
You can install the extension directly from the [VSCode marketplace](https://marketplace.visualstudio.com/items?itemName=CHIPSAlliance.verible).
To install the extension launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
```
ext install CHIPSAlliance.verible
```
#### Build yourself
This is based on the VSCode [packaging extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#packaging-extensions) guide.
First [install the verible tools](../../README.md#installation) and [vscode](https://code.visualstudio.com/Download).
For the following, you need a recent version of both
[nodejs](https://nodejs.org/) and [npm](https://www.npmjs.com/).
Change into the [vscode/](./vscode) subdirectory and run the following:
```bash
npm install
npm run vsix
code --install-extension verible.vsix
```
[release]: https://github.com/chipsalliance/verible/releases
#### Configuring Language Server arguments
To configure the extension, in Extensions list select Verible, and select `Extension Settings`.
In there you can find an `Arguments` setting, where you can add command-line arguments for `verible-verilog-ls` executable, e.g.:
* `--rules_config_search` - search recursively for linter configuration, starting from edited file's directory.
* `--rules_config="<path-to-config>"` - use linter configuration in a specified path
* `--wrap_end_else_clauses` - splits `end else` into separate lines.
* `--indentation_spaces=4` - indent width specified for the formatter.
There should be one flag per item.
For more language server options, check:
```bash
verible-verilog-ls --helpfull
```