Highlights
This release completes support for the changes in the recently released IEEE 1800-2023 version of the SystemVerilog LRM.
Language Support
- Select expressions of packed arrays now always return an unsigned type, as mandated by the LRM
- Clocking skew delays now properly require a constant value
- Enforce that static methods can't have override specifiers
- The error for invalid state-dependent path conditions in specify blocks can now be downgraded with -Wspecify-condition-expr for compatibility with other tools
- Added support for the optional system tasks and functions from Annex D in the LRM:
$countdrivers
,$list
,$input
,$key
,$nokey
,$reset
,$reset_count
,$reset_value
,$save
,$incsave
,$restart
,$scope
,$scale
,$showscopes
,$showvars
,$sreadmemb
,$sreadmemh
,$getpattern
- Added support for the optional compiler directives from Annex E in the LRM:
`default_decay_time
,`default_trireg_strength
,`delay_mode_distributed
,`delay_mode_path
,`delay_mode_unit
,`delay_mode_zero
- Rules about nondegeneracy of sequences and properties are now enforced (thanks to @likeamahoney)
- Special case rules about how name resolution works in bind directives are now enforced
- Changed the definition of "simple types" to include
string
to allow using it as a target for assignment pattern fields (thanks to @likeamahoney) - Rules for inconsistent net types connected via an implicit named port connection are now enforced (thanks to @likeamahoney)
Clarifications in IEEE 1800-2023
- Assertion clocking events can't reference automatic variables
- The
.*
token sequence is actually two separate tokens that can be separated by whitespace - Functions in constraints cannot have
inout
arguments - Constraint subexpression can be of any type as long as their final expression type is numeric and they don't reference random variables
- The argument to
$isunbounded
must be a parameter name (only enforced as a pedantic warning in slang) - Edge-sensitive paths in specify blocks can specify an edge keyword without also including a data source expression
- Only bidirectional switches allow connections to nets with user-defined net types (other primitives do not)
New Features in IEEE 1800-2023
- Constraint expressions and random variables can have
real
types dist
expressions can have adefault
specifierdist
expressions can havereal
types- solve-before constraints can specify array.size() as well as regular random variables
- disable soft constraints can target array.size()
- Constraint blocks can have override specifiers (initial / extends / final)
- Covergroups can inherit from covergroups in parent classes
- Coverpoints can have
real
types - Covergroups have new options:
cross_retain_auto_bins
andreal_interval
- New system functions
$timeunit
,$timeprecision
, and$stacktrace
General Features
- Added -Wunsigned-arith-shift which warns about suspicious arithmetic right shifts of unsigned types
- Added -Wstatic-init-order and -Wstatic-init-value which warn about static initializers that depend on uninitialized values or an undefined order of other static initializers
- Added -Wfloat-int-conv and -Wint-float-conv which warn about implicit conversions between floating point and integer types
- Added -Wfloat-narrow and -Wfloat-widen which warn about implicit conversions between floating point types of differing widths
- Added -Wunused-import and -Wunused-wildcard-import which warn about unused import directives
- Added -Warith-op-mismatch, -Wbitwise-op-mismatch, -Wcomparison-mismatch, and -Wsign-compare which all warn about different cases of mismatched types in binary expressions
- slang-netlist has experimental support for detecting combinatorial loops (thanks to @udif)
- Added
--allow-merging-ansi-ports
(included in "vcs" compat mode) which allows non-standard behavior in which ANSI module ports can duplicate net and variables declared within the module - Added
--ast-json-source-info
which includes source line information when dumping an AST to JSON (thanks to @KennethDRoe) - Added
--enable-legacy-protect
which enables support for nonstandard / legacy protected envelopes: Verilog-XL style`protect
directives and Verilog-A style// pragma protect
comments
Improvements
- Default value expressions for parameters that are overridden are now checked for basic correctness and other parameters they reference will not warn for being "unused"
- Made several minor improvements to the locations reported for propagated type conversion warnings
- Sped up
Compilation
object construction by reorganizing how system subroutines are created and registered - Improved the parser error reported when encountering an extraneous end delimiter in a member list
- Various fixes and improvements were made to slang-netlist (thanks to @jameshanlon, @udif)
- Added options to slang-tidy to better control what gets output (thanks to @Sustrak)
- Added a bunch of new checks to slang-tidy (thanks to @JoelSole-Semidyn)
- Improved handling of source files that contain non-UTF8 comments (thanks to @udif)
- Fixed and improved various parts of the SyntaxRewriter API (thanks to @sgizler)
Fixes
- Fixed several AST serialization methods (thanks to @tdp2110, @likeamahoney, @Kitaev2003, @cyuzuzo-j)
- Fixed the return type of DPI import tasks
- Fixed a bug that caused some
inout
ports to warn as "unused" - Fixed the checking of the
extends
override specifier when the containing class has no base class - Fixed a case where bracketed delay expressions in sequence concatenations were not checked for correctness
- Fixed the type of the iterators used in with-expressions for covergroup bins
- Fixed a bug that sometimes prevented printing the correct scope for type alias names in diagnostic messages
- Fixed the hierarchical path string created for symbols inside of unnamed generate blocks (thanks to @povik)
- Fixed spurious errors that could occur when using generic class instantiations inside uninstantiated generate blocks
- Correctly disallow passing expressions of
void
type to format style system functions (thanks to @tdp2110) - Fixed a bug where parameters that referred to themselves via hierarchical reference would cause a crash instead of reporting a diagnostic
- Fixed
PATHPULSE$
specparam initializers to allow providing only one value instead of requiring two (thanks to @likeamahoney) - Fixed PLA tasks to accept concatenation expressions as arguments without reporting an error about the direction of the argument bounds (thanks to @likeamahoney)
- Fixed a bug that could cause spurious errors in uninstantiated generic class definitions
- Fixed the Symbol::getHierarchicalPath API to round-trip correctly
- Fixed JSON serialization of integers to round-trip correctly
- Fixed a bug in resolving defparam values inside of generate loops
- Fixed checking of event arguments in system timing check functions
- Fixed checking of deferred assertion function calls (thanks to @likeamahoney)
- Correctly issue an error if a sequence or property has a formal argument with the same name as a local variable declaration (thanks to @likeamahoney)
- Fixed a case of recursive property instantiation that was incorrectly disallowed (thanks to @likeamahoney)
- Fixed bugs in checking for overlapping user-defined primitive table rows (thanks to @likeamahoney)
- Fixed infinite loops in the parser when encountering constraint blocks with certain kinds of invalid tokens in them (thanks to @likeamahoney)
- Fixed errors in assigning to select expressions involving members of virtual interfaces (thanks to @micron-ian)