blob: e5e8a05ae4d94be4c3cb6ba57b381b96bbf8f63c [file] [log] [blame] [view]
# SystemVerilog Analysis Library
<!--*
freshness: { owner: 'hzeller' reviewed: '2020-10-15' }
*-->
This directory contains libraries for analyzing SystemVerilog code. Analysis is
often done on the token stream and syntax tree from the lexer and parser, as
read-only operations.
[Linter user documentation can be found here](../tool/lint).
## Partial File or Single Construct Parsing
For cases where one wishes to parse only subset of the grammar, e.g.
module-body-items, we provide
[wrappers around the full-parser](verilog_excerpt_parse.h). This approach
maximizes reuse of the full language parser without having to generate or slice
out separate grammars, and guarantees consistent concrete syntax tree node
enumerations.
### Alternative Parsing Modes
Source files that are known to be indented for inclusion in another syntactic
context may trigger an alternative parsing mode with comment directives. These
directives are understood by tools including the style-linter and formatter.
The following example would normally fail to compile because wire declarations
can only occur inside modules:
```verilog
// This file is `included inside a module definition body.
// verilog_syntax: parse-as-module-body
wire x;
initial begin
x = 0;
end
```
However, the `verilog_syntax` directive tells the parser (in this case) that the
contents of this file are to be treated as if they are inside a module
declaration. Scanning for this directive stops as soon as any
non-preprocessing-control token is encountered (after `` `ifndef`` or comments
is ok, but not after any keyword like `module`, for instance).
Available parser modes include:
* `parse-as-statements`: Text contains only statements (e.g. inside function,
always, ...)
* `parse-as-expression`: Text occurs inside an expression.
* `parse-as-module-body`: Text occurs inside a module definition.
* `parse-as-class-body`: Text occurs inside a class definition.
* `parse-as-package-body`: Text occurs inside a package definition.
* `parse-as-library-map`: Verilog library map sub-language (LRM: Ch. 33).
## Lint Rules
Individual lint rules live under [checkers](./checkers). The
[global lint rule registry](lint_rule_registry.h) manager the entire collection
of lint rules. The [lint analysis driver](verilog_linter.h) traverses the
structural representation of the code-under-analysis as
[configured](verilog_linter_configuration.h).
The default-enabled set of lint rules is maintained [here](default_rules.h).
Linter tool user documentation can be found [here](../toosl/lint).
## Equivalence Checking
[Lexical equivalence checking](verilog_equivalence.h) verifies that two Verilog
source files are equivalent under various conditions.
[Diff tool user documentation can be found here](../tool/diff).