| # Verible |
| |
| |
| |
| [](https://opensource.org/licenses/Apache-2.0) |
| [](https://github.com/chipsalliance/verible/actions/workflows/verible-ci.yml) |
| [](https://codecov.io/gh/chipsalliance/verible) |
| |
| <!--* |
| freshness: { owner: 'hzeller' reviewed: '2022-08-31' } |
| *--> |
| |
| The Verible project's main mission is to parse SystemVerilog (IEEE 1800-2017) |
| (as standardized in the [SV-LRM]) for a wide variety of applications, including |
| developer tools. |
| |
| It was born out of a need to parse *un-preprocessed* source files, which is |
| suitable for single-file applications like style-linting and formatting. In |
| doing so, it can be adapted to parse *preprocessed* source files, which is what |
| real compilers and toolchains require. |
| |
| The spirit of the project is that no-one should ever have to develop a |
| SystemVerilog parser for their own application, because developing a |
| standard-compliant parser is an enormous task due to the syntactic complexity of |
| the language. Verible's parser is also regularly tested against an ever-growing |
| suite of (tool-independent) language compliance tests at |
| https://symbiflow.github.io/sv-tests/. |
| |
| A lesser (but notable) objective is that the language-agnostic components of |
| Verible be usable for rapidly developing language support tools for other |
| languages. |
| |
| ### Installation |
| |
| For simple installation, we provide regular [binary releases]. |
| |
| If you prefer to build and install the binaries locally yourself, see |
| details below in the [Developers](#developers-welcome) section. |
| |
| ## SystemVerilog Developer Tools |
| |
| ### Parser |
| |
| [Learn more about the parser implementation here](./verilog/parser). |
| |
| We provide a standalone [`verible-verilog-syntax`](./verilog/tools/syntax) tool |
| to help with visualizing the syntax structure as understood by the lexer and |
| parser. This is very useful tor troubleshooting and understand the internal |
| representations seen by the other tools. |
| |
| The tool has an ability of exporting a concrete syntax tree in JSON format, |
| making use of it in external tools easy. There is also a |
| [Python wrapper module and a few example scripts](./verilog/tools/syntax/export_json_examples). |
| |
| ### Style Linter |
| |
| [`verible-verilog-lint`](./verilog/tools/lint) identifies constructs or patterns |
| in code that are deemed undesirable according to a style guide. The main goal is |
| to relieve humans the burden of reviewing code for style compliance. Many |
| [lint rules][lint-rule-list] use syntax tree pattern matching to find style |
| violations. |
| |
| Features: |
| |
| * Style guide citations in diagnostics |
| * Rule deck configurability |
| * Waiver mechanisms: in-file, external waiver file |
| * [Github SystemVerilog linter action][github-lint-action] available. |
| |
|  |
| |
| Documentation: |
| |
| * [Style linter user documentation](./verilog/tools/lint) |
| * [Generated lint rule documentation][lint-rule-list] |
| |
| ### Formatter |
| |
| The [`verible-verilog-format`](./verilog/tools/formatter) formatter manages |
| whitespace in accordance with a particular style. The main goal is to relieve |
| humans of having to manually manage whitespace, wrapping, and indentation, and |
| to provide a tool that can be integrated into any editor to enable |
| editor-independent consistency. |
| |
| Features (various degress of work-in-progress): |
| |
| * Corrects indentation |
| * Corrects inter-token spacing, with syntax context awareness |
| * Line-wrapping to a column limit |
| * Support for incremental formatting, only touched changed lines. |
| * Interactive formatting: accept or decline formatting changes |
| * Tabular alignment |
| * [Github SystemVerilog formatter action][github-format-action] available. |
| |
| <!-- |
| TODO(fangism): a demo GIF animation here. |
| See https://github.com/chipsalliance/verible/issues/528 |
| --> |
| |
| ### Language Server |
| |
| The [`verible-verilog-ls`](./verilog/tools/ls) is a language server that |
| provides the functionalities that come with the Verible command line tools |
| also directly in your editor. |
| |
| It implements the standardized [language server protocol] that is supported |
| by a myriad of editors and IDEs. |
| |
| The language server provides formatting and linting. If possible, it also |
| provides quick-fixes |
| |
|  |
| |
| ### Lexical Diff |
| |
| [`verible-verilog-diff`](./verilog/tools/diff) compares two input files for |
| equivalence. |
| |
| ### Verible project tool |
| |
| [`verible-verilog-project`](./verilog/tools/project) is a multi-tool that |
| operates on whole Verilog projects, consisting of a file list and related |
| configurations. This serves as a diagnostic tool for analyzing (and potentially |
| transforming) project-level sources. |
| |
| ### Code Obfuscator |
| |
| [`verible-verilog-obfuscate`](./verilog/tools/obfuscator) transforms Verilog |
| code by replacing identifiers with obfuscated names of equal length, and |
| preserving all other text, including spaces. Output is written to stdout. The |
| resulting file size is the same as the original. This is useful for preparing |
| potentially sensitive test cases with tool vendors. |
| |
| <!-- |
| TODO(fangism): a short demo GIF animation here. |
| See https://github.com/chipsalliance/verible/issues/528 |
| --> |
| |
| ### Preprocessor |
| |
| [`verible-verilog-preprocessor`](./verilog/tools/preprocessor) is a collection |
| of preprocessor-like tools, (but does not include a fully-featured Verilog |
| preprocessor yet.) |
| |
| ### Source Code Indexer |
| |
| [`verible-verilog-kythe-extractor`](./verilog/tools/kythe) extracts indexing |
| facts fromm SV source code using the [Kythe](http://kythe.io) schema, which can |
| then enhance IDEs with linked cross-references for ease of source code |
| navigation. |
| |
| <!-- |
| TODO(minatoma): short animation of hover/navigation features |
| --> |
| |
| ## Developers, Welcome |
| |
| For source code browsing, we recommend using the fully-indexed and searchable |
| mirror at https://cs.opensource.google/verible/verible. |
| |
| If you'd like to contribute, check out the [contributing](./CONTRIBUTING.md) |
| guide and the [development resources](./doc/development.md). |
| |
| ### Build |
| |
| Verible's code base is written in C++. |
| |
| To build, you need the [bazel] (>= 4.0) build system and a C++17 compatible compiler |
| (e.g. >= g++-9), as well as python3. |
| |
| Use your package manager to install the dependencies; on a system with |
| the nix package manager simply run `nix-shell` to get a build environment. |
| |
| ```bash |
| # Build all tools and libraries |
| bazel build -c opt //... |
| ``` |
| |
| You can access the generated artifacts under `bazel-bin/`. For instance the |
| syntax checker will be at |
| `bazel-bin/verilog/tools/syntax/verible-verilog-syntax` (corresponding to the |
| target name `//verilog/tools/syntax:verible-verilog-syntax`). |
| |
| ### Optionally using local flex/bison for build |
| |
| Flex and Bison, that are needed for the parser generation, are compiled as part |
| of the build process. But if for any reason you want or need local tools (e.g. |
| if you encounter a compile problem with them - please file a bug then) |
| can choose so by adding `--//bazel:use_local_flex_bison` to your bazel |
| command line: |
| |
| ```bash |
| # Also append the option '--//bazel:use_local_flex_bison' to test/install commands |
| bazel build -c opt --//bazel:use_local_flex_bison //... |
| ``` |
| |
| ### Installation |
| |
| For simple installation, we provide regular [binary releases]. |
| |
| If you prefer to build and install the binaries locally yourself: |
| |
| ```bash |
| # In your home directory |
| bazel run -c opt :install -- ~/bin |
| |
| # For a system directory that requires root-access, call with -s option. |
| # (Do _not_ run bazel with sudo.) |
| bazel run -c opt :install -- -s /usr/local/bin |
| ``` |
| |
| (this requies a compliant `install` utility, otherwise simply copy |
| the binaries from `bazel-bin/` to your desired location) |
| |
| ### Test |
| |
| We strongly encourage running the test suite using [bazel]: |
| |
| ```bash |
| # Run all tests |
| bazel test -c opt //... |
| ``` |
| |
| Whenever adding new features in file, say, `foo.cc` always make sure to also |
| update (or add) the corresponding `foo_test.cc`. Once you've written the |
| test, you can use `.github/bin/generate-coverage-html.sh` to double-check |
| that you have covered all code-paths in your test; narrow the coverage |
| run to your test to make sure coverage is not accidentally coming from |
| unrelated tests that happen to use the library: |
| |
| ```bash |
| MODE=coverage .github/bin/build-and-test.sh //foo/bar:foo_test |
| .github/bin/generate-coverage-html.sh |
| ``` |
| |
| ## Mailing Lists |
| |
| Join the Verible community! |
| |
| * Developers: verible-dev@googlegroups.com |
| ([join](https://groups.google.com/forum/#!forum/verible-dev/join)) |
| * Users: verible-users@googlegroups.com |
| ([join](https://groups.google.com/forum/#!forum/verible-users/join)) |
| |
| ### Future |
| |
| The Verible team is interested in exploring how it can help other tool |
| developers in providing a SystemVerilog front end, for example, emitting an |
| abstract syntax tree (AST) or possibly even provide more higher-level |
| [UHDM] format. If you are interested in collaborating, contact us. |
| |
| [bazel]: https://bazel.build/ |
| [SV-LRM]: https://ieeexplore.ieee.org/document/8299595 |
| [lint-rule-list]: https://chipsalliance.github.io/verible/lint.html |
| [github-lint-action]: https://github.com/chipsalliance/verible-linter-action |
| [github-format-action]: https://github.com/chipsalliance/verible-formatter-action |
| [binary releases]: https://github.com/chipsalliance/verible/releases |
| [language server protocol]: https://microsoft.github.io/language-server-protocol/ |
| [UHDM]: https://github.com/chipsalliance/UHDM |