A language server for systemverilog that has been tested to work with coc.nvim, VSCode, Sublime Text 3 and emacs
- Auto completion (no need for ctags or other such mechanisms)
- Go to symbol in document
- Go to symbol in workspace folder (indexed modules/interfaces/packages)
- Go to definition (works for module/interface/package names and for ports too!)
- Hover over help
- Signature help
- Fast indexing
- Verilator linting on the fly
- Code snippets for many common blocks
- Code formatting with verible-verilog-format
- Elaborate syntax highlighting (for VSCode)
The code has been tested to work with below tool versions
- vim 8.2
- coc.nvim 0.0.80-2cece2600a
- VSCode 1.52.0
- Sublime Text 3.2.2
- emacs 26.1
- lsp-mode 20210513.1723
- Verilator 4.008
- Verible v0.0-1114-ged89c1b
- For coc.nvim
npm install -g @imc-trading/svlangserver
- Update .vim/coc-settings.json
- For VSCode
- Install the extension from the marketplace.
- Update the settings
- For Sublime Text 3
- Install the systemverilog package in sublime text
npm install -g @imc-trading/svlangserver
- Update the LSP settings (
Preferences -> Package Settings -> LSP -> settings
) and the sublime-project files
- For emacs
- Install lsp-mode
npm install -g @imc-trading/svlangserver
- Update .emacs/init.el
To get the snippets, git clone this repo and copy the snippets directory wherever applicable
NOTE: This has been tested with npm version 6.14.11 and node version 14.15.5
systemverilog.includeIndexing
: Array, Globs defining files to be indexedsystemverilog.libraryIndexing
: Array, Globs defining library files to be added to verilator linting. It's useful when module name is not equal to filename.systemverilog.excludeIndexing
: Array, Exclude files from indexing based on globsystemverilog.launchConfiguration
: String, Command to run for launching verilator linting- Default: verilator --sv --lint-only --Wall
- If not in path, replace verilator with the appropriate command
systemverilog.lintOnUnsaved
: Boolean, Lint even unsaved files- Default: true
systemverilog.defines
: Array, Defines for the project. Used by the language server as well as verilator linting- Default: empty
systemverilog.formatCommand
: String, verible-verilog-format command for code formatting- Default: verible-verilog-format
- If not in path, replace verible-verilog-format with the appropriate command
systemverilog.disableCompletionProvider
: Boolean, Disable auto completion provided by the language server- Default: false
systemverilog.disableHoverProvider
: Boolean, Disable hover over help provided by the language server- Default: false
systemverilog.disableSignatureHelpProvider
: Boolean, Disable signature help provided by the language server- Default: false
systemverilog.disableLinting
: Boolean, Disable verilator linting- Default: false
- Example coc.nvim settings file
For project specific settings this file should be at
{ "languageserver": { "svlangserver": { "command": "svlangserver", "filetypes": ["systemverilog"], "settings": { "systemverilog.includeIndexing": ["**/*.{sv,svh}"], "systemverilog.excludeIndexing": ["test/**/*.sv*"], "systemverilog.defines" : [], "systemverilog.launchConfiguration": "/tools/verilator -sv -Wall --lint-only", "systemverilog.formatCommand": "/tools/verible-verilog-format" } } } }
<WORKSPACE PATH>/.vim/coc-settings.json
- Example vscode settings file
For project specific settings this file should be at
{ "systemverilog.includeIndexing": ["**/*.{sv,svh}"], "systemverilog.excludeIndexing": ["test/**/*.sv*"], "systemverilog.defines" : [], "systemverilog.launchConfiguration": "/tools/verilator -sv -Wall --lint-only", "systemverilog.formatCommand": "/tools/verible-verilog-format" }
<WORKSPACE PATH>/.vscode/settings.json
- Example Sublime Text 3 settings files
- The global LSP settings file: LSP.sublime-settings
{ "clients": { "svlangserver": { "enabled": true, "command": ["svlangserver"], "languageId": "systemverilog", "scopes": ["source.systemverilog"], "syntaxes": ["Packages/SystemVerilog/SystemVerilog.sublime-syntax"], "settings": { "systemverilog.disableHoverProvider": true, "systemverilog.launchConfiguration": "/tools/verilator -sv --lint-only -Wall", "systemverilog.formatCommand" : "/tools/verible-verilog-format" } } } }
- The project specific settings go in
<PROJECT>.sublime-project
{ "folders": [ { "path": "." } ], "settings": { "LSP": { "svlangserver": { "settings": { "systemverilog.includeIndexing": [ "**/*.{sv,svh}", ], "systemverilog.excludeIndexing": ["test/**/*.sv*"], "systemverilog.defines": [], } } } } }
- The global LSP settings file: LSP.sublime-settings
- Example settings for emacs
- Below content goes in .emacs or init.el
(require 'lsp-verilog) (custom-set-variables '(lsp-clients-svlangserver-launchConfiguration "/tools/verilator -sv --lint-only -Wall") '(lsp-clients-svlangserver-formatCommand "/tools/verible-verilog-format")) (add-hook 'verilog-mode-hook #'lsp-deferred)
- The project specific settings go in .dir-locals.el
((verilog-mode (lsp-clients-svlangserver-workspace-additional-dirs . ("/some/lib/path")) (lsp-clients-svlangserver-includeIndexing . ("src/**/*.{sv,svh}")) (lsp-clients-svlangserver-excludeIndexing . ("src/test/**/*.{sv,svh}"))))
- Below content goes in .emacs or init.el
systemverilog.build_index
: Instructs language server to rerun indexing
- Editor is not able to find language server binary.
- Make sure the binary is in the system path as exposed to the editor. If the binary is installed in custom directory, expose that path to your editor
- Not getting any diagnostics
- Make sure the launchConfiguration setting has been properly set to use verilator from the correct installation path
- Diagnostics show Cannot find file containing module 'module_name'
- Make sure all submodules can be found by includeIndexing
- If the issue still remains, it may due to different naming of module and file, or a file containing multiple modules. Make sure these files can be found by libraryIndexing.
- Check settings used by the language server
- for coc.nvim: Use the command
:CocCommand workspace.showOutput
and then select svlangserver - for vscode: Check the SVLangServer output channel
- for sublime: Open the command palette in the tools menu and select
LSP: Toggle Log Panel
- for emacs: Check the
*lsp-log*
buffer
- for coc.nvim: Use the command
- Language server doesn't understand most verification specific concepts (e.g. classes).
Rewrite parser to make it much more robust
Although most of the code is written from scratch, this VSCode-SystemVerilog extension was what I started with and developed on.
See the changelog for more details
- Bug fixes
- Updated instructions to use published packages
- Add support for Sublime LSP and Emacs
- Initial release