In verific, SVA is implemented as a parse tree manipulation utility. This utility will take an analyzed and statically elaborated parse tree of a module or library as input and will replace all convertible concurrent assertions with always blocks and variable declarations. For each concurrent assertion an always block will be created. The concurrent assertion along with its action block will be converted to an equivalent immediate assertion and that immediate assertion will be part of the always block statement along with other shift register implementations. The user can pretty-print the converted parse tree to a file and simulate to verify the correctness of synthesis. If sysnthesis of SVA is not possible for any reason, the parse tree will remain as it was. This conversion is based on assertion syntax and semantic defined in IEEE std 1800 SystemVerilog LRM.
Checkers for match and fail
If the assertion in the design has an ‘if’ block we synthesize the checker to identify the match of the property. On the other hand if the ‘else’ block is present then we create the checker to identify the fail of the property. If no action block is present we create a checker to catch fail of the property (default action). If both blocks are present separate checkers for match and fail are created.
The signal FM_OUT_match is asserted if the checker for the match is created, the signal FM_OUT_fail is asserted if the checker for fail is created. Please note the signals FM_OUT_match/ FM_OUT_fail are asserted when the property match/fail.
Restrictions
Property and sequence instances are not supported
Use of parameterized expressions or complex expressions are not supported where constant expression is required. Only constant literals are allowed for now. For example: a ##[p:q] b will not be supported, but a ##[1:2] b will be supported. To allow all kinds of constant expressions, user needs to first statically elaborate the design with compile flag VERILOG_REPLACE_CONST_EXPRS on and then apply this utility.
Concurrent assertions present in sequential area i.e inside always block are not synthesized.
sequence expressions containing infinite bound($) is not supported yet
Assertions under multiple clocks are not supported.