1 Source text
1.1 Library source text
1.2 SystemVerilog source text
1.3 Module ports
1.4 Module items
1.5 Configuration
1.6 Interface items
1.7 Program items
1.8 Checker items
1.9 Class items
1.10 Constraints
1.11 Package items
2 Declarations
2.1 Declaration types
2.1.1 Module parameter declarations
2.1.2 Port declarations
2.1.3 Type declarations
2.2 Declaration data types
2.2.1 Net and variable types
2.2.2 Strengths
2.2.3 Delays
2.3 Declaration lists
2.4 Declaration assignments
2.5 Declaration ranges
2.6 Function declarations
2.7 Task declarations
2.8 Block item declarations
2.9 Interface declarations
2.10 Assertion declarations
2.11 Covergroup declarations
3 Primitive instances
3.1 Primitive instantiation and instances
3.2 Primitive strengths
3.3 Primitive terminals
3.4 Primitive gate and switch types
4 Instantiations
4.1 Instantation
4.1.1 Module instantation
4.1.2 Interface instantiation
4.1.3 Program instantiation
4.1.4 Checker instantiation
4.2 Generated instantiation
5 UDP declaration and instantiation
5.1 UDP declaration
5.2 UDP ports
5.3 UDP body
5.4 UDP instantiation
6 Behavioral assignments
6.1 Continuous assignment and net alias statements
6.2 Procedural blocks and assignments
6.3 Parallel and sequential blocks
6.4 Statements
6.5 Timing control statements
6.6 Conditional statements
6.7 Case statements
6.7.1 Patterns
6.8 Looping statements
6.9 Subroutine call statements
6.10 Assertion statements
6.11 Clocking block
6.12 Rand sequence
7 Specify section
7.1 Specify block declaration
7.2 Specify path declarations
7.3 Specify block terminals
7.4 Specify path delays
7.5 System timing checks
7.5.1 System timing check commands
7.5.2 System timing check command arguments
7.5.3 System timing check event definitions
8 Expressions
8.1 Concatenations
8.2 Subroutine calls
8.3 Expressions
8.4 Primaries
8.5 Expression left-side values
8.6 Operators
8.7 Numbers
8.8 Strings
9 General
9.1 Attributes
9.2 Comments
9.3 Identifiers

SystemVerilog IEEE 1800-2012 BNF

1 Source text

1.1 Library source text

library_text ::=
      { library_description }

library_description ::=
      library_declaration | include_statement | config_declaration | ;

library_declaration ::=
      library library_identifier file_path_spec { , file_path_spec }
      [ -incdir file_path_spec { , file_path_spec } ] ;

include_statement ::=
      include file_path_spec ;

1.2 SystemVerilog source text

source_text ::=
      [ timeunits_declaration ] { description }

description ::=
      module_declaration
    | udp_declaration
    | interface_declaration
    | program_declaration
    | package_declaration
    | { attribute_instance } package_item
    | { attribute_instance } bind_directive
    | config_declaration

module_nonansi_header ::=
      { attribute_instance } module_keyword [ lifetime ] module_identifier
      { package_import_declaration } [ parameter_port_list ] list_of_ports ;

module_ansi_header ::=
      { attribute_instance } module_keyword [ lifetime ] module_identifier
      { package_import_declaration } [ parameter_port_list ] [ list_of_port_declarations ] ;

module_declaration ::=
      module_nonansi_header [ timeunits_declaration ] { module_item } endmodule
      [ : module_identifier ]
    | module_ansi_header [ timeunits_declaration ] { non_port_module_item } endmodule
      [ : module_identifier ]
    | { attribute_instance } module_keyword [ lifetime ] module_identifier ( .* ) ;
      [ timeunits_declaration ] { module_item } endmodule [ : module_identifier ]
    | extern module_nonansi_header
    | extern module_ansi_header

module_keyword ::=
      module | macromodule

interface_declaration ::=
      interface_nonansi_header [ timeunits_declaration ] { interface_item } endinterface
      [ : interface_identifier ]
    | interface_ansi_header [ timeunits_declaration ] { non_port_interface_item } endinterface
      [ : interface_identifier ]
    | { attribute_instance } interface interface_identifier ( .* ) ; [ timeunits_declaration ]
      { interface_item } endinterface [ : interface_identifier ]
    | extern interface_nonansi_header
    | extern interface_ansi_header

interface_nonansi_header ::=
      { attribute_instance } interface [ lifetime ] interface_identifier
      { package_import_declaration } [ parameter_port_list ] list_of_ports ;

interface_ansi_header ::=
      { attribute_instance } interface [ lifetime ] interface_identifier
      { package_import_declaration } [ parameter_port_list ] [ list_of_port_declarations ] ;

program_declaration ::=
      program_nonansi_header [ timeunits_declaration ] { program_item } endprogram
      [ : program_identifier ]
    | program_ansi_header [ timeunits_declaration ] { non_port_program_item } endprogram
      [ : program_identifier ]
    | { attribute_instance } program program_identifier ( .* ) ; [ timeunits_declaration ]
      { program_item } endprogram [ : program_identifier ]
    | extern program_nonansi_header
    | extern program_ansi_header

program_nonansi_header ::=
      { attribute_instance } program [ lifetime ] program_identifier { package_import_declaration }
      [ parameter_port_list ] list_of_ports ;

program_ansi_header ::=
      { attribute_instance } program [ lifetime ] program_identifier { package_import_declaration }
      [ parameter_port_list ] [ list_of_port_declarations ] ;

checker_declaration ::=
      checker checker_identifier [ ( [ checker_port_list ] ) ] ;
      { { attribute_instance } checker_or_generate_item } endchecker [ : checker_identifier ]

class_declaration ::=
      [ virtual ] class [ lifetime ] class_identifier [ parameter_port_list ]
      [ extends class_type [ ( list_of_arguments ) ] ]
      [ implements interface_class_type { , interface_class_type } ] ; { class_item } endclass
      [ : class_identifier ]

interface_class_type ::=
      ps_class_identifier [ parameter_value_assignment ]

interface_class_declaration ::=
      interface class class_identifier [ parameter_port_list ]
      [ extends interface_class_type { , interface_class_type } ] ; { interface_class_item }
      endclass [ : class_identifier ]

interface_class_item ::=
      type_declaration
    | { attribute_instance } interface_class_method
    | local_parameter_declaration ;
    | parameter_declaration ;
    | ;

interface_class_method ::=
      pure virtual method_prototype ;

package_declaration ::=
      { attribute_instance } package [ lifetime ] package_identifier ; [ timeunits_declaration ]
      { { attribute_instance } package_item } endpackage [ : package_identifier ]

timeunits_declaration ::=
      timeunit time_literal [ / time_literal ] ;
    | timeprecision time_literal ;
    | timeunit time_literal ; timeprecision time_literal ;
    | timeprecision time_literal ; timeunit time_literal ;

1.3 Module ports

parameter_port_list ::=
      # ( list_of_param_assignments { , parameter_port_declaration } )
    | # ( parameter_port_declaration { , parameter_port_declaration } )
    | # ( )

parameter_port_declaration ::=
      parameter_declaration
    | local_parameter_declaration
    | data_type list_of_param_assignments
    | type list_of_type_assignments

list_of_ports ::=
      ( port { , port } )

list_of_port_declarations ::=
      (
      [ { attribute_instance } ansi_port_declaration
        { , { attribute_instance } ansi_port_declaration } ]
      )

port_declaration ::=
      { attribute_instance } inout_declaration
    | { attribute_instance } input_declaration
    | { attribute_instance } output_declaration
    | { attribute_instance } ref_declaration
    | { attribute_instance } interface_port_declaration

port ::=
      [ port_expression ] | . port_identifier ( [ port_expression ] )

port_expression ::=
      port_reference | { port_reference { , port_reference } }

port_reference ::=
      port_identifier constant_select

port_direction ::=
      input | output | inout | ref

net_port_header ::=
      [ port_direction ] net_port_type

variable_port_header ::=
      [ port_direction ] variable_port_type

interface_port_header ::=
      interface_identifier [ . modport_identifier ] | interface [ . modport_identifier ]

ansi_port_declaration ::=
      [ net_port_header | interface_port_header ] port_identifier { unpacked_dimension }
      [ = constant_expression ]
    | [ variable_port_header ] port_identifier { variable_dimension } [ = constant_expression ]
    | [ port_direction ] . port_identifier ( [ expression ] )

1.4 Module items

elaboration_system_task ::=
      $fatal [ ( finish_number [ , list_of_arguments ] ) ] ;
    | $error [ ( [ list_of_arguments ] ) ] ;
    | $warning [ ( [ list_of_arguments ] ) ] ;
    | $info [ ( [ list_of_arguments ] ) ] ;

finish_number ::=
      0 | 1 | 2

module_common_item ::=
      module_or_generate_item_declaration
    | interface_instantiation
    | program_instantiation
    | assertion_item
    | bind_directive
    | continuous_assign
    | net_alias
    | initial_construct
    | final_construct
    | always_construct
    | loop_generate_construct
    | conditional_generate_construct
    | elaboration_system_task

module_item ::=
      port_declaration ; | non_port_module_item

module_or_generate_item ::=
      { attribute_instance } parameter_override
    | { attribute_instance } gate_instantiation
    | { attribute_instance } udp_instantiation
    | { attribute_instance } module_instantiation
    | { attribute_instance } module_common_item

module_or_generate_item_declaration ::=
      package_or_generate_item_declaration
    | genvar_declaration
    | clocking_declaration
    | default clocking clocking_identifier ;
    | default disable iff expression_or_dist ;

non_port_module_item ::=
      generate_region
    | module_or_generate_item
    | specify_block
    | { attribute_instance } specparam_declaration
    | program_declaration
    | module_declaration
    | interface_declaration
    | timeunits_declaration

parameter_override ::=
      defparam list_of_defparam_assignments ;

bind_directive ::=
      bind bind_target_scope [ : bind_target_instance_list ] bind_instantiation ;
    | bind bind_target_instance bind_instantiation ;

bind_target_scope ::=
      module_identifier | interface_identifier

bind_target_instance ::=
      hierarchical_identifier constant_bit_select

bind_target_instance_list ::=
      bind_target_instance { , bind_target_instance }

bind_instantiation ::=
      program_instantiation | module_instantiation | interface_instantiation | checker_instantiation

1.5 Configuration

config_declaration ::=
      config config_identifier ; { local_parameter_declaration ; } design_statement
      { config_rule_statement } endconfig [ : config_identifier ]

design_statement ::=
      design { [ library_identifier . ] cell_identifier } ;

config_rule_statement ::=
      default_clause liblist_clause ;
    | inst_clause liblist_clause ;
    | inst_clause use_clause ;
    | cell_clause liblist_clause ;
    | cell_clause use_clause ;

default_clause ::=
      default

inst_clause ::=
      instance inst_name

inst_name ::=
      topmodule_identifier { . instance_identifier }

cell_clause ::=
      cell [ library_identifier . ] cell_identifier

liblist_clause ::=
      liblist { library_identifier }

use_clause ::=
      use [ library_identifier . ] cell_identifier [ : config ]
    | use named_parameter_assignment { , named_parameter_assignment } [ : config ]
    | use [ library_identifier . ] cell_identifier named_parameter_assignment
      { , named_parameter_assignment } [ : config ]

1.6 Interface items

interface_or_generate_item ::=
      { attribute_instance } module_common_item
    | { attribute_instance } modport_declaration
    | { attribute_instance } extern_tf_declaration

extern_tf_declaration ::=
      extern method_prototype ; | extern forkjoin task_prototype ;

interface_item ::=
      port_declaration ; | non_port_interface_item

non_port_interface_item ::=
      generate_region
    | interface_or_generate_item
    | program_declaration
    | interface_declaration
    | timeunits_declaration

1.7 Program items

program_item ::=
      port_declaration ; | non_port_program_item

non_port_program_item ::=
      { attribute_instance } continuous_assign
    | { attribute_instance } module_or_generate_item_declaration
    | { attribute_instance } initial_construct
    | { attribute_instance } final_construct
    | { attribute_instance } concurrent_assertion_item
    | timeunits_declaration
    | program_generate_item

program_generate_item ::=
      loop_generate_construct
    | conditional_generate_construct
    | generate_region
    | elaboration_system_task

1.8 Checker items

checker_port_list ::=
      checker_port_item { , checker_port_item }

checker_port_item ::=
      { attribute_instance } [ checker_port_direction ] property_formal_type formal_port_identifier
      { variable_dimension } [ = property_actual_arg ]

checker_port_direction ::=
      input | output

checker_or_generate_item ::=
      checker_or_generate_item_declaration
    | initial_construct
    | always_construct
    | final_construct
    | assertion_item
    | continuous_assign
    | checker_generate_item

checker_or_generate_item_declaration ::=
      [ rand ] data_declaration
    | function_declaration
    | checker_declaration
    | assertion_item_declaration
    | covergroup_declaration
    | overload_declaration
    | genvar_declaration
    | clocking_declaration
    | default clocking clocking_identifier ;
    | default disable iff expression_or_dist ;
    | ;

checker_generate_item ::=
      loop_generate_construct
    | conditional_generate_construct
    | generate_region
    | elaboration_system_task

1.9 Class items

class_item ::=
      { attribute_instance } class_property
    | { attribute_instance } class_method
    | { attribute_instance } class_constraint
    | { attribute_instance } class_declaration
    | { attribute_instance } covergroup_declaration
    | local_parameter_declaration ;
    | parameter_declaration ;
    | ;

class_property ::=
      { property_qualifier } data_declaration
    | const { class_item_qualifier } data_type const_identifier [ = constant_expression ] ;

class_method ::=
      { method_qualifier } task_declaration
    | { method_qualifier } function_declaration
    | pure virtual { class_item_qualifier } method_prototype ;
    | extern { method_qualifier } method_prototype ;
    | { method_qualifier } class_constructor_declaration
    | extern { method_qualifier } class_constructor_prototype

class_constructor_prototype ::=
      function new [ ( [ tf_port_list ] ) ] ;

class_constraint ::=
      constraint_prototype | constraint_declaration

class_item_qualifier ::=
      static | protected | local

property_qualifier ::=
      random_qualifier | class_item_qualifier

random_qualifier ::=
      rand | randc

method_qualifier ::=
      [ pure ] virtual | class_item_qualifier

method_prototype ::=
      task_prototype | function_prototype

class_constructor_declaration ::=
      function [ class_scope ] new [ ( [ tf_port_list ] ) ] ; { block_item_declaration }
      [ super . new [ ( list_of_arguments ) ] ; ] { function_statement_or_null } endfunction
      [ : new ]

1.10 Constraints

constraint_declaration ::=
      [ static ] constraint constraint_identifier constraint_block

constraint_block ::=
      { { constraint_block_item } }

constraint_block_item ::=
      solve solve_before_list before solve_before_list ; | constraint_expression

solve_before_list ::=
      constraint_primary { , constraint_primary }

constraint_primary ::=
      [ implicit_class_handle . | class_scope ] hierarchical_identifier select

constraint_expression ::=
      [ soft ] expression_or_dist ;
    | uniqueness_constraint ;
    | expression -> constraint_set
    | if ( expression ) constraint_set [ else constraint_set ]
    | foreach ( ps_or_hierarchical_array_identifier [ loop_variables ] ) constraint_set
    | disable soft constraint_primary ;

uniqueness_constraint ::=
      unique { open_range_list }

constraint_set ::=
      constraint_expression | { { constraint_expression } }

dist_list ::=
      dist_item { , dist_item }

dist_item ::=
      value_range [ dist_weight ]

dist_weight ::=
      := expression | :/ expression

constraint_prototype ::=
      [ constraint_prototype_qualifier ] [ static ] constraint constraint_identifier ;

constraint_prototype_qualifier ::=
      extern | pure

extern_constraint_declaration ::=
      [ static ] constraint class_scope constraint_identifier constraint_block

identifier_list ::=
      identifier { , identifier }

1.11 Package items

package_item ::=
      package_or_generate_item_declaration
    | anonymous_program
    | package_export_declaration
    | timeunits_declaration

package_or_generate_item_declaration ::=
      net_declaration
    | data_declaration
    | task_declaration
    | function_declaration
    | checker_declaration
    | dpi_import_export
    | extern_constraint_declaration
    | class_declaration
    | class_constructor_declaration
    | local_parameter_declaration ;
    | parameter_declaration ;
    | covergroup_declaration
    | overload_declaration
    | assertion_item_declaration
    | ;

anonymous_program ::=
      program ; { anonymous_program_item } endprogram

anonymous_program_item ::=
      task_declaration
    | function_declaration
    | class_declaration
    | covergroup_declaration
    | class_constructor_declaration
    | ;

2 Declarations

2.1 Declaration types

2.1.1 Module parameter declarations

local_parameter_declaration ::=
      localparam data_type_or_implicit list_of_param_assignments
    | localparam type list_of_type_assignments

parameter_declaration ::=
      parameter data_type_or_implicit list_of_param_assignments
    | parameter type list_of_type_assignments

specparam_declaration ::=
      specparam [ packed_dimension ] list_of_specparam_assignments ;

2.1.2 Port declarations

inout_declaration ::=
      inout net_port_type list_of_port_identifiers

input_declaration ::=
      input net_port_type list_of_port_identifiers
    | input variable_port_type list_of_variable_identifiers

output_declaration ::=
      output net_port_type list_of_port_identifiers
    | output variable_port_type list_of_variable_port_identifiers

interface_port_declaration ::=
      interface_identifier list_of_interface_identifiers
    | interface_identifier . modport_identifier list_of_interface_identifiers

ref_declaration ::=
      ref variable_port_type list_of_variable_identifiers

2.1.3 Type declarations

data_declaration ::=
      [ const ] [ var ] [ lifetime ] data_type_or_implicit list_of_variable_decl_assignments ;
    | type_declaration
    | package_import_declaration net_type_declaration

package_import_declaration ::=
      import package_import_item { , package_import_item } ;

package_import_item ::=
      package_identifier :: identifier | package_identifier :: *

package_export_declaration ::=
      export *::* ; | export package_import_item { , package_import_item } ;

genvar_declaration ::=
      genvar list_of_genvar_identifiers ;

net_declaration ::=
      net_type [ drive_strength | charge_strength ] [ vectored | scalared ] data_type_or_implicit
      [ delay3 ] list_of_net_decl_assignments ;
    | net_type_identifier [ delay_control ] list_of_net_decl_assignments ;
    | interconnect implicit_data_type [ # delay_value ] net_identifier { unpacked_dimension }
      [ , net_identifier { unpacked_dimension } ] ;

type_declaration ::=
      typedef data_type type_identifier { variable_dimension } ;
    | typedef interface_instance_identifier constant_bit_select . type_identifier type_identifier ;
    | typedef [ enum | struct | union | class | interface class ] type_identifier ;

net_type_declaration ::=
      nettype data_type net_type_identifier [ with [ package_scope | class_scope ] tf_identifier ]
      ;
    | nettype [ package_scope | class_scope ] net_type_identifier net_type_identifier ;

lifetime ::=
      static | automatic

2.2 Declaration data types

2.2.1 Net and variable types

casting_type ::=
      simple_type | constant_primary | signing | string | const

data_type ::=
      integer_vector_type [ signing ] { packed_dimension }
    | integer_atom_type [ signing ]
    | non_integer_type
    | struct_union [ packed [ signing ] ] { struct_union_member { struct_union_member } }
      { packed_dimension }
    | enum [ enum_base_type ] { enum_name_declaration { , enum_name_declaration } }
      { packed_dimension }
    | string
    | chandle
    | virtual [ interface ] interface_identifier [ parameter_value_assignment ]
      [ . modport_identifier ]
    | [ class_scope | package_scope ] type_identifier { packed_dimension }
    | class_type
    | event
    | ps_covergroup_identifier
    | type_reference

data_type_or_implicit ::=
      data_type | implicit_data_type

implicit_data_type ::=
      [ signing ] { packed_dimension }

enum_base_type ::=
      integer_atom_type [ signing ]
    | integer_vector_type [ signing ] [ packed_dimension ]
    | type_identifier [ packed_dimension ]

enum_name_declaration ::=
      enum_identifier [ [ integral_number [ : integral_number ] ] ] [ = constant_expression ]

class_scope ::=
      class_type ::

class_type ::=
      ps_class_identifier [ parameter_value_assignment ]
      { :: class_identifier [ parameter_value_assignment ] }

integer_type ::=
      integer_vector_type | integer_atom_type

integer_atom_type ::=
      byte | shortint | int | longint | integer | time

integer_vector_type ::=
      bit | logic | reg

non_integer_type ::=
      shortreal | real | realtime

net_type ::=
      supply0 | supply1 | tri | triand | trior | trireg | tri0 | tri1 | uwire| wire | wand | wor

net_port_type ::=
      [ net_type ] data_type_or_implicit | net_type_identifier | interconnect implicit_data_type

variable_port_type ::=
      var_data_type

var_data_type ::=
      data_type | var data_type_or_implicit

signing ::=
      signed | unsigned

simple_type ::=
      integer_type | non_integer_type | ps_type_identifier | ps_parameter_identifier

struct_union_member ::=
      { attribute_instance } [ random_qualifier ] data_type_or_void
      list_of_variable_decl_assignments ;

data_type_or_void ::=
      data_type | void

struct_union ::=
      struct | union [ tagged ]

type_reference ::=
      type ( expression ) | type ( data_type )

2.2.2 Strengths

drive_strength ::=
      ( strength0 , strength1 )
    | ( strength1 , strength0 )
    | ( strength0 , highz1 )
    | ( strength1 , highz0 )
    | ( highz0 , strength1 )
    | ( highz1 , strength0 )

strength0 ::=
      supply0 | strong0 | pull0 | weak0

strength1 ::=
      supply1 | strong1 | pull1 | weak1

charge_strength ::=
      ( small ) | ( medium ) | ( large )

2.2.3 Delays

delay3 ::=
      # delay_value
    | # ( mintypmax_expression [ , mintypmax_expression [ , mintypmax_expression ] ] )

delay2 ::=
      # delay_value | # ( mintypmax_expression [ , mintypmax_expression ] )

delay_value ::=
      unsigned_number | real_number | ps_identifier | time_literal | 1step

2.3 Declaration lists

list_of_defparam_assignments ::=
      defparam_assignment { , defparam_assignment }

list_of_genvar_identifiers ::=
      genvar_identifier { , genvar_identifier }

list_of_interface_identifiers ::=
      interface_identifier { unpacked_dimension } { , interface_identifier { unpacked_dimension } }

list_of_net_decl_assignments ::=
      net_decl_assignment { , net_decl_assignment }

list_of_param_assignments ::=
      param_assignment { , param_assignment }

list_of_port_identifiers ::=
      port_identifier { unpacked_dimension } { , port_identifier { unpacked_dimension } }

list_of_udp_port_identifiers ::=
      port_identifier { , port_identifier }

list_of_specparam_assignments ::=
      specparam_assignment { , specparam_assignment }

list_of_tf_variable_identifiers ::=
      port_identifier { variable_dimension } [ = expression ]
      { , port_identifier { variable_dimension } [ = expression ] }

list_of_type_assignments ::=
      type_assignment { , type_assignment }

list_of_variable_decl_assignments ::=
      variable_decl_assignment { , variable_decl_assignment }

list_of_variable_identifiers ::=
      variable_identifier { variable_dimension } { , variable_identifier { variable_dimension } }

list_of_variable_port_identifiers ::=
      port_identifier { variable_dimension } [ = constant_expression ]
      { , port_identifier { variable_dimension } [ = constant_expression ] }

2.4 Declaration assignments

defparam_assignment ::=
      hierarchical_parameter_identifier = constant_mintypmax_expression

net_decl_assignment ::=
      net_identifier { unpacked_dimension } [ = expression ]

param_assignment ::=
      parameter_identifier { unpacked_dimension } [ = constant_param_expression ]

specparam_assignment ::=
      specparam_identifier = constant_mintypmax_expression | pulse_control_specparam

type_assignment ::=
      type_identifier [ = data_type ]

pulse_control_specparam ::=
      PATHPULSE$ = ( reject_limit_value [ , error_limit_value ] )
    | PATHPULSE$ specify_input_terminal_descriptor $ specify_output_terminal_descriptor = (
      reject_limit_value [ , error_limit_value ] )

error_limit_value ::=
      limit_value

reject_limit_value ::=
      limit_value

limit_value ::=
      constant_mintypmax_expression

variable_decl_assignment ::=
      variable_identifier { variable_dimension } [ = expression ]
    | dynamic_array_variable_identifier unsized_dimension { variable_dimension }
      [ = dynamic_array_new ]
    | class_variable_identifier [ = class_new ]

class_new ::=
      [ class_scope ] new [ ( list_of_arguments ) ] | new expression

dynamic_array_new ::=
      new [ expression ] [ ( expression ) ]

2.5 Declaration ranges

unpacked_dimension ::=
      [ constant_range ] | [ constant_expression ]

packed_dimension ::=
      [ constant_range ] | unsized_dimension

associative_dimension ::=
      [ data_type ] | [ * ]

variable_dimension ::=
      unsized_dimension | unpacked_dimension | associative_dimension | queue_dimension

queue_dimension ::=
      [ $ [ : constant_expression ] ]

unsized_dimension ::=
      [ ]

2.6 Function declarations

function_data_type_or_implicit ::=
      data_type_or_void | implicit_data_type

function_declaration ::=
      function [ lifetime ] function_body_declaration

function_body_declaration ::=
      function_data_type_or_implicit [ interface_identifier . | class_scope ] function_identifier ;
      { tf_item_declaration } { function_statement_or_null } endfunction [ : function_identifier ]
    | function_data_type_or_implicit [ interface_identifier . | class_scope ] function_identifier (
      [ tf_port_list ] ) ; { block_item_declaration } { function_statement_or_null } endfunction
      [ : function_identifier ]

function_prototype ::=
      function data_type_or_void function_identifier [ ( [ tf_port_list ] ) ]

dpi_import_export ::=
      import dpi_spec_string [ dpi_function_import_property ] [ c_identifier = ] dpi_function_proto
      ;
    | import dpi_spec_string [ dpi_task_import_property ] [ c_identifier = ] dpi_task_proto ;
    | export dpi_spec_string [ c_identifier = ] function function_identifier ;
    | export dpi_spec_string [ c_identifier = ] task task_identifier ;

dpi_spec_string ::=
      "DPI-C" | "DPI"

dpi_function_import_property ::=
      context | pure

dpi_task_import_property ::=
      context

dpi_function_proto ::=
      function_prototype

dpi_task_proto ::=
      task_prototype

2.7 Task declarations

task_declaration ::=
      task [ lifetime ] task_body_declaration

task_body_declaration ::=
      [ interface_identifier . | class_scope ] task_identifier ; { tf_item_declaration }
      { statement_or_null } endtask [ : task_identifier ]
    | [ interface_identifier . | class_scope ] task_identifier ( [ tf_port_list ] ) ;
      { block_item_declaration } { statement_or_null } endtask [ : task_identifier ]

tf_item_declaration ::=
      block_item_declaration | tf_port_declaration

tf_port_list ::=
      tf_port_item { , tf_port_item }

tf_port_item ::=
      { attribute_instance } [ tf_port_direction ] [ var ] data_type_or_implicit
      [ port_identifier { variable_dimension } [ = expression ] ]

tf_port_direction ::=
      port_direction | const ref

tf_port_declaration ::=
      { attribute_instance } tf_port_direction [ var ] data_type_or_implicit
      list_of_tf_variable_identifiers ;

task_prototype ::=
      task task_identifier [ ( [ tf_port_list ] ) ]

2.8 Block item declarations

block_item_declaration ::=
      { attribute_instance } data_declaration
    | { attribute_instance } local_parameter_declaration ;
    | { attribute_instance } parameter_declaration ;
    | { attribute_instance } overload_declaration
    | { attribute_instance } let_declaration

overload_declaration ::=
      bind overload_operator function data_type function_identifier ( overload_proto_formals ) ;

overload_operator ::=
      + | ++ | - | -- | * | ** | / | % | == | != | < | <= | > | >= | =

overload_proto_formals ::=
      data_type { , data_type }

2.9 Interface declarations

modport_declaration ::=
      modport modport_item { , modport_item } ;

modport_item ::=
      modport_identifier ( modport_ports_declaration { , modport_ports_declaration } )

modport_ports_declaration ::=
      { attribute_instance } modport_simple_ports_declaration
    | { attribute_instance } modport_tf_ports_declaration
    | { attribute_instance } modport_clocking_declaration

modport_clocking_declaration ::=
      clocking clocking_identifier

modport_simple_ports_declaration ::=
      port_direction modport_simple_port { , modport_simple_port }

modport_simple_port ::=
      port_identifier | . port_identifier ( [ expression ] )

modport_tf_ports_declaration ::=
      import_export modport_tf_port { , modport_tf_port }

modport_tf_port ::=
      method_prototype | tf_identifier

import_export ::=
      import | export

2.10 Assertion declarations

concurrent_assertion_item ::=
      [ block_identifier : ] concurrent_assertion_statement | checker_instantiation

concurrent_assertion_statement ::=
      assert_property_statement
    | assume_property_statement
    | cover_property_statement
    | cover_sequence_statement
    | restrict_property_statement

assert_property_statement ::=
      assert property ( property_spec ) action_block

assume_property_statement ::=
      assume property ( property_spec ) action_block

cover_property_statement ::=
      cover property ( property_spec ) statement_or_null

expect_property_statement ::=
      expect ( property_spec ) action_block

cover_sequence_statement ::=
      cover sequence ( [ clocking_event ] [ disable iff ( expression_or_dist ) ] sequence_expr )
      statement_or_null

restrict_property_statement ::=
      restrict property ( property_spec ) ;

property_instance ::=
      ps_or_hierarchical_property_identifier [ ( [ property_list_of_arguments ] ) ]

property_list_of_arguments ::=
      [ property_actual_arg ] { , [ property_actual_arg ] }
      { , . identifier ( [ property_actual_arg ] ) }
    | . identifier ( [ property_actual_arg ] ) { , . identifier ( [ property_actual_arg ] ) }

property_actual_arg ::=
      property_expr | sequence_actual_arg

assertion_item_declaration ::=
      property_declaration | sequence_declaration | let_declaration

property_declaration ::=
      property property_identifier [ ( [ property_port_list ] ) ] ;
      { assertion_variable_declaration } property_spec [ ; ] endproperty [ : property_identifier ]

property_port_list ::=
      property_port_item { , property_port_item }

property_port_item ::=
      { attribute_instance } [ local [ property_lvar_port_direction ] ] property_formal_type
      formal_port_identifier { variable_dimension } [ = property_actual_arg ]

property_lvar_port_direction ::=
      input

property_formal_type ::=
      sequence_formal_type | property

property_spec ::=
      [ clocking_event ] [ disable iff ( expression_or_dist ) ] property_expr

property_expr ::=
      sequence_expr
    | strong ( sequence_expr )
    | weak ( sequence_expr )
    | ( property_expr )
    | not property_expr
    | property_expr or property_expr
    | property_expr and property_expr
    | sequence_expr |-> property_expr
    | sequence_expr |=> property_expr
    | if ( expression_or_dist ) property_expr [ else property_expr ]
    | case ( expression_or_dist ) property_case_item { property_case_item } endcase
    | sequence_expr #-# property_expr
    | sequence_expr #=# property_expr
    | nexttime property_expr
    | nexttime [ constant _expression ] property_expr
    | s_nexttime property_expr
    | s_nexttime [ constant_expression ] property_expr
    | always property_expr
    | always [ cycle_delay_const_range_expression ] property_expr
    | s_always [ constant_range ] property_expr
    | s_eventually property_expr
    | eventually [ constant_range ] property_expr
    | s_eventually [ cycle_delay_const_range_expression ] property_expr
    | property_expr until property_expr
    | property_expr s_until property_expr
    | property_expr until_with property_expr
    | property_expr s_until_with property_expr
    | property_expr implies property_expr
    | property_expr iff property_expr
    | accept_on ( expression_or_dist ) property_expr
    | reject_on ( expression_or_dist ) property_expr
    | sync_accept_on ( expression_or_dist ) property_expr
    | sync_reject_on ( expression_or_dist ) property_expr
    | property_instance
    | clocking_event property_expr

property_case_item ::=
      expression_or_dist { , expression_or_dist } : property_expr [ ; ]
    | default [ : ] property_expr [ ; ]

sequence_declaration ::=
      sequence sequence_identifier [ ( [ sequence_port_list ] ) ] ;
      { assertion_variable_declaration } sequence_expr [ ; ] endsequence [ : sequence_identifier ]

sequence_port_list ::=
      sequence_port_item { , sequence_port_item }

sequence_port_item ::=
      { attribute_instance } [ local [ sequence_lvar_port_direction ] ] sequence_formal_type
      formal_port_identifier { variable_dimension } [ = sequence_actual_arg ]

sequence_lvar_port_direction ::=
      input | inout | output

sequence_formal_type ::=
      data_type_or_implicit | sequence | untyped

sequence_expr ::=
      cycle_delay_range sequence_expr { cycle_delay_range sequence_expr }
    | sequence_expr cycle_delay_range sequence_expr { cycle_delay_range sequence_expr }
    | expression_or_dist [ boolean_abbrev ]
    | sequence_instance [ sequence_abbrev ]
    | ( sequence_expr { , sequence_match_item } ) [ sequence_abbrev ]
    | sequence_expr and sequence_expr
    | sequence_expr intersect sequence_expr
    | sequence_expr or sequence_expr
    | first_match ( sequence_expr { , sequence_match_item } )
    | expression_or_dist throughout sequence_expr
    | sequence_expr within sequence_expr
    | clocking_event sequence_expr

cycle_delay_range ::=
      ## constant_primary | ## [ cycle_delay_const_range_expression ] | ##[*] | ##[+]

sequence_method_call ::=
      sequence_instance . method_identifier

sequence_match_item ::=
      operator_assignment | inc_or_dec_expression | subroutine_call

sequence_instance ::=
      ps_or_hierarchical_sequence_identifier [ ( [ sequence_list_of_arguments ] ) ]

sequence_list_of_arguments ::=
      [ sequence_actual_arg ] { , [ sequence_actual_arg ] }
      { , . identifier ( [ sequence_actual_arg ] ) }
    | . identifier ( [ sequence_actual_arg ] ) { , . identifier ( [ sequence_actual_arg ] ) }

sequence_actual_arg ::=
      event_expression | sequence_expr

boolean_abbrev ::=
      consecutive_repetition | non_consecutive_repetition | goto_repetition

sequence_abbrev ::=
      consecutive_repetition

consecutive_repetition ::=
      [* const_or_range_expression ] | [*] | [+]

non_consecutive_repetition ::=
      [= const_or_range_expression ]

goto_repetition ::=
      [-> const_or_range_expression ]

const_or_range_expression ::=
      constant_expression | cycle_delay_const_range_expression

cycle_delay_const_range_expression ::=
      constant_expression : constant_expression | constant_expression : $

expression_or_dist ::=
      expression [ dist { dist_list } ]

assertion_variable_declaration ::=
      var_data_type list_of_variable_decl_assignments ;

let_declaration ::=
      let let_identifier [ ( [ let_port_list ] ) ] = expression ;

let_identifier ::=
      identifier

let_port_list ::=
      let_port_item { , let_port_item }

let_port_item ::=
      { attribute_instance } let_formal_type formal_port_identifier { variable_dimension }
      [ = expression ]

let_formal_type ::=
      data_type_or_implicit | untyped

let_expression ::=
      [ package_scope ] let_identifier [ ( [ let_list_of_arguments ] ) ]

let_list_of_arguments ::=
      [ let_actual_arg ] { , [ let_actual_arg ] } { , . identifier ( [ let_actual_arg ] ) }
    | . identifier ( [ let_actual_arg ] ) { , . identifier ( [ let_actual_arg ] ) }

let_actual_arg ::=
      expression

2.11 Covergroup declarations

covergroup_declaration ::=
      covergroup covergroup_identifier [ ( [ tf_port_list ] ) ] [ coverage_event ] ;
      { coverage_spec_or_option } endgroup [ : covergroup_identifier ]

coverage_spec_or_option ::=
      { attribute_instance } coverage_spec | { attribute_instance } coverage_option ;

coverage_option ::=
      option . member_identifier = expression
    | type_option . member_identifier = constant_expression

coverage_spec ::=
      cover_point | cover_cross

coverage_event ::=
      clocking_event | with function sample ( [ tf_port_list ] ) | @@ ( block_event_expression )

block_event_expression ::=
      block_event_expression or block_event_expression
    | begin hierarchical_btf_identifier
    | end hierarchical_btf_identifier

hierarchical_btf_identifier ::=
      hierarchical_tf_identifier
    | hierarchical_block_identifier
    | [ hierarchical_identifier . | class_scope ] method_identifier

cover_point ::=
      [ [ data_type_or_implicit ] cover_point_identifier : ] coverpoint expression
      [ iff ( expression ) ] bins_or_empty

bins_or_empty ::=
      { { attribute_instance } { bins_or_options ; } } | ;

bins_or_options ::=
      coverage_option
    | [ wildcard ] bins_keyword bin_identifier [ [ [ covergroup_expression ] ] ] = {
      covergroup_range_list } [ with ( with_covergroup_expression ) ] [ iff ( expression ) ]
    | [ wildcard ] bins_keyword bin_identifier [ [ [ covergroup_expression ] ] ] =
      cover_point_identifier [ with ( with_covergroup_expression ) ] [ iff ( expression ) ]
    | [ wildcard ] bins_keyword bin_identifier [ [ [ covergroup_expression ] ] ] =
      set_covergroup_expression [ iff ( expression ) ]
    | [ wildcard ] bins_keyword bin_identifier [ [ ] ] = trans_list [ iff ( expression ) ]
    | bins_keyword bin_identifier [ [ [ covergroup_expression ] ] ] = default
      [ iff ( expression ) ]
    | bins_keyword bin_identifier = default sequence [ iff ( expression ) ]

bins_keyword ::=
      bins | illegal_bins | ignore_bins

trans_list ::=
      ( trans_set ) { , ( trans_set ) }

trans_set ::=
      trans_range_list { => trans_range_list }

trans_range_list ::=
      trans_item
    | trans_item [* repeat_range ]
    | trans_item [-> repeat_range ]
    | trans_item [= repeat_range ]

trans_item ::=
      covergroup_range_list

repeat_range ::=
      covergroup_expression | covergroup_expression : covergroup_expression

cover_cross ::=
      [ cross_identifier : ] cross list_of_cross_items [ iff ( expression ) ] cross_body

list_of_cross_items ::=
      cross_item , cross_item { , cross_item }

cross_item ::=
      cover_point_identifier | variable_identifier

cross_body ::=
      { { cross_body_item ; } } | ;

cross_body_item ::=
      function_declaraton | bins_selection_or_option ;

bins_selection_or_option ::=
      { attribute_instance } coverage_option | { attribute_instance } bins_selection

bins_selection ::=
      bins_keyword bin_identifier = select_expression [ iff ( expression ) ]

select_expression ::=
      select_condition
    | ! select_condition
    | select_expression && select_expression
    | select_expression || select_expression
    | ( select_expression )
    | select_expression with ( with_covergroup_expression )
      [ matches integer_covergroup_expression ]
    | cross_identifier
    | cross_set_expression [ matches integer_covergroup_expression ]

select_condition ::=
      binsof ( bins_expression ) [ intersect { covergroup_range_list } ]

bins_expression ::=
      variable_identifier | cover_point_identifier [ . bin_identifier ]

covergroup_range_list ::=
      covergroup_value_range { , covergroup_value_range }

covergroup_value_range ::=
      covergroup_expression | [ covergroup_expression : covergroup_expression ]

with_covergroup_expression ::=
      covergroup_expression

set_covergroup_expression ::=
      covergroup_expression

integer_covergroup_expression ::=
      covergroup_expression

cross_set_expression ::=
      covergroup_expression

covergroup_expression ::=
      expression

3 Primitive instances

3.1 Primitive instantiation and instances

gate_instantiation ::=
      cmos_switchtype [ delay3 ] cmos_switch_instance { , cmos_switch_instance } ;
    | enable_gatetype [ drive_strength ] [ delay3 ] enable_gate_instance { , enable_gate_instance }
      ;
    | mos_switchtype [ delay3 ] mos_switch_instance { , mos_switch_instance } ;
    | n_input_gatetype [ drive_strength ] [ delay2 ] n_input_gate_instance
      { , n_input_gate_instance } ;
    | n_output_gatetype [ drive_strength ] [ delay2 ] n_output_gate_instance
      { , n_output_gate_instance } ;
    | pass_en_switchtype [ delay2 ] pass_enable_switch_instance { , pass_enable_switch_instance } ;
    | pass_switchtype pass_switch_instance { , pass_switch_instance } ;
    | pulldown [ pulldown_strength ] pull_gate_instance { , pull_gate_instance } ;
    | pullup [ pullup_strength ] pull_gate_instance { , pull_gate_instance } ;

cmos_switch_instance ::=
      [ name_of_instance ] ( output_terminal , input_terminal , ncontrol_terminal ,
      pcontrol_terminal )

enable_gate_instance ::=
      [ name_of_instance ] ( output_terminal , input_terminal , enable_terminal )

mos_switch_instance ::=
      [ name_of_instance ] ( output_terminal , input_terminal , enable_terminal )

n_input_gate_instance ::=
      [ name_of_instance ] ( output_terminal , input_terminal { , input_terminal } )

n_output_gate_instance ::=
      [ name_of_instance ] ( output_terminal { , output_terminal } , input_terminal )

pass_switch_instance ::=
      [ name_of_instance ] ( inout_terminal , inout_terminal )

pass_enable_switch_instance ::=
      [ name_of_instance ] ( inout_terminal , inout_terminal , enable_terminal )

pull_gate_instance ::=
      [ name_of_instance ] ( output_terminal )

3.2 Primitive strengths

pulldown_strength ::=
      ( strength0 , strength1 ) | ( strength1 , strength0 ) | ( strength0 )

pullup_strength ::=
      ( strength0 , strength1 ) | ( strength1 , strength0 ) | ( strength1 )

3.3 Primitive terminals

enable_terminal ::=
      expression

inout_terminal ::=
      net_lvalue

input_terminal ::=
      expression

ncontrol_terminal ::=
      expression

output_terminal ::=
      net_lvalue

pcontrol_terminal ::=
      expression

3.4 Primitive gate and switch types

cmos_switchtype ::=
      cmos | rcmos

enable_gatetype ::=
      bufif0 | bufif1 | notif0 | notif1

mos_switchtype ::=
      nmos | pmos | rnmos | rpmos

n_input_gatetype ::=
      and | nand | or | nor | xor | xnor

n_output_gatetype ::=
      buf | not

pass_en_switchtype ::=
      tranif0 | tranif1 | rtranif1 | rtranif0

pass_switchtype ::=
      tran | rtran

4 Instantiations

4.1 Instantation

4.1.1 Module instantation

module_instantiation ::=
      module_identifier [ parameter_value_assignment ] hierarchical_instance
      { , hierarchical_instance } ;

parameter_value_assignment ::=
      # ( [ list_of_parameter_assignments ] )

list_of_parameter_assignments ::=
      ordered_parameter_assignment { , ordered_parameter_assignment }
    | named_parameter_assignment { , named_parameter_assignment }

ordered_parameter_assignment ::=
      param_expression

named_parameter_assignment ::=
      . parameter_identifier ( [ param_expression ] )

hierarchical_instance ::=
      name_of_instance ( [ list_of_port_connections ] )

name_of_instance ::=
      instance_identifier { unpacked_dimension }

list_of_port_connections ::=
      ordered_port_connection { , ordered_port_connection }
    | named_port_connection { , named_port_connection }

ordered_port_connection ::=
      { attribute_instance } [ expression ]

named_port_connection ::=
      { attribute_instance } . port_identifier [ ( [ expression ] ) ] | { attribute_instance } .*

4.1.2 Interface instantiation

interface_instantiation ::=
      interface_identifier [ parameter_value_assignment ] hierarchical_instance
      { , hierarchical_instance } ;

4.1.3 Program instantiation

program_instantiation ::=
      program_identifier [ parameter_value_assignment ] hierarchical_instance
      { , hierarchical_instance } ;

4.1.4 Checker instantiation

checker_instantiation ::=
      ps_checker_identifier name_of_instance ( [ list_of_checker_port_connections ] ) ;

list_of_checker_port_connections ::=
      ordered_checker_port_connection { , ordered_checker_port_connection }
    | named_checker_port_connection { , named_checker_port_connection }

ordered_checker_port_connection ::=
      { attribute_instance } [ property_actual_arg ]

named_checker_port_connection ::=
      { attribute_instance } . formal_port_identifier [ ( [ property_actual_arg ] ) ]
    | { attribute_instance } .*

4.2 Generated instantiation

generate_region ::=
      generate { generate_item } endgenerate

loop_generate_construct ::=
      for ( genvar_initialization ; genvar_expression ; genvar_iteration ) generate_block

genvar_initialization ::=
      [ genvar ] genvar_identifier = constant_expression

genvar_iteration ::=
      genvar_identifier assignment_operator genvar_expression
    | inc_or_dec_operator genvar_identifier
    | genvar_identifier inc_or_dec_operator

conditional_generate_construct ::=
      if_generate_construct | case_generate_construct

if_generate_construct ::=
      if ( constant_expression ) generate_block [ else generate_block ]

case_generate_construct ::=
      case ( constant_expression ) case_generate_item { case_generate_item } endcase

case_generate_item ::=
      constant_expression { , constant_expression } : generate_block | default [ : ] generate_block

generate_block ::=
      generate_item
    | [ generate_block_identifier : ] begin [ : generate_block_identifier ] { generate_item } end
      [ : generate_block_identifier ]

generate_item ::=
      module_or_generate_item | interface_or_generate_item | checker_or_generate_item

5 UDP declaration and instantiation

5.1 UDP declaration

udp_nonansi_declaration ::=
      { attribute_instance } primitive udp_identifier ( udp_port_list ) ;

udp_ansi_declaration ::=
      { attribute_instance } primitive udp_identifier ( udp_declaration_port_list ) ;

udp_declaration ::=
      udp_nonansi_declaration udp_port_declaration { udp_port_declaration } udp_body endprimitive
      [ : udp_identifier ]
    | udp_ansi_declaration udp_body endprimitive [ : udp_identifier ]
    | extern udp_nonansi_declaration
    | extern udp_ansi_declaration
    | { attribute_instance } primitive udp_identifier ( .* ) ; { udp_port_declaration } udp_body
      endprimitive [ : udp_identifier ]

5.2 UDP ports

udp_port_list ::=
      output_port_identifier , input_port_identifier { , input_port_identifier }

udp_declaration_port_list ::=
      udp_output_declaration , udp_input_declaration { , udp_input_declaration }

udp_port_declaration ::=
      udp_output_declaration ; | udp_input_declaration ; | udp_reg_declaration ;

udp_output_declaration ::=
      { attribute_instance } output port_identifier
    | { attribute_instance } output reg port_identifier [ = constant_expression ]

udp_input_declaration ::=
      { attribute_instance } input list_of_udp_port_identifiers

udp_reg_declaration ::=
      { attribute_instance } reg variable_identifier

5.3 UDP body

udp_body ::=
      combinational_body | sequential_body

combinational_body ::=
      table combinational_entry { combinational_entry } endtable

combinational_entry ::=
      level_input_list : output_symbol ;

sequential_body ::=
      [ udp_initial_statement ] table sequential_entry { sequential_entry } endtable

udp_initial_statement ::=
      initial output_port_identifier = init_val ;

init_val ::=
      1'b0 | 1'b1 | 1'bx | 1'bX | 1'B0 | 1'B1 | 1'Bx | 1'BX | 1 | 0

sequential_entry ::=
      seq_input_list : current_state : next_state ;

seq_input_list ::=
      level_input_list | edge_input_list

level_input_list ::=
      level_symbol { level_symbol }

edge_input_list ::=
      { level_symbol } edge_indicator { level_symbol }

edge_indicator ::=
      ( level_symbol level_symbol ) | edge_symbol

current_state ::=
      level_symbol

next_state ::=
      output_symbol | -

output_symbol ::=
      0 | 1 | x | X

level_symbol ::=
      0 | 1 | x | X | ? | b | B

edge_symbol ::=
      r | R | f | F | p | P | n | N | *

5.4 UDP instantiation

udp_instantiation ::=
      udp_identifier [ drive_strength ] [ delay2 ] udp_instance { , udp_instance } ;

udp_instance ::=
      [ name_of_instance ] ( output_terminal , input_terminal { , input_terminal } )

6 Behavioral assignments

6.1 Continuous assignment and net alias statements

continuous_assign ::=
      assign [ drive_strength ] [ delay3 ] list_of_net_assignments ;
    | assign [ delay_control ] list_of_variable_assignments ;

list_of_net_assignments ::=
      net_assignment { , net_assignment }

list_of_variable_assignments ::=
      variable_assignment { , variable_assignment }

net_alias ::=
      alias net_lvalue = net_lvalue { = net_lvalue } ;

net_assignment ::=
      net_lvalue = expression

6.2 Procedural blocks and assignments

initial_construct ::=
      initial statement_or_null

always_construct ::=
      always_keyword statement

always_keyword ::=
      always | always_comb | always_latch | always_ff

final_construct ::=
      final function_statement

blocking_assignment ::=
      variable_lvalue = delay_or_event_control expression
    | nonrange_variable_lvalue = dynamic_array_new
    | [ implicit_class_handle . | class_scope | package_scope ] hierarchical_variable_identifier
      select != class_new
    | operator_assignment

operator_assignment ::=
      variable_lvalue assignment_operator expression

assignment_operator ::=
      = | += | -= | *= | /= | %= | &= | |= | ^= | <<= | >>= | <<<= | >>>=

nonblocking_assignment ::=
      variable_lvalue <= [ delay_or_event_control ] expression

procedural_continuous_assignment ::=
      assign variable_assignment
    | deassign variable_lvalue
    | force variable_assignment
    | force net_assignment
    | release variable_lvalue
    | release net_lvalue

variable_assignment ::=
      variable_lvalue = expression

6.3 Parallel and sequential blocks

action_block ::=
      statement_or_null | [ statement ] else statement_or_null

seq_block ::=
      begin [ : block_identifier ] { block_item_declaration } { statement_or_null } end
      [ : block_identifier ]

par_block ::=
      fork [ : block_identifier ] { block_item_declaration } { statement_or_null } join_keyword
      [ : block_identifier ]

join_keyword ::=
      join | join_any | join_none

6.4 Statements

statement_or_null ::=
      statement | { attribute_instance } ;

statement ::=
      [ block_identifier : ] { attribute_instance } statement_item

statement_item ::=
      blocking_assignment ;
    | nonblocking_assignment ;
    | procedural_continuous_assignment ;
    | case_statement
    | conditional_statement
    | inc_or_dec_expression ;
    | subroutine_call_statement
    | disable_statement
    | event_trigger
    | loop_statement
    | jump_statement
    | par_block
    | procedural_timing_control_statement
    | seq_block
    | wait_statement
    | procedural_assertion_statement
    | clocking_drive ;
    | randsequence_statement
    | randcase_statement
    | expect_property_statement

function_statement ::=
      statement

function_statement_or_null ::=
      function_statement | { attribute_instance } ;

variable_identifier_list ::=
      variable_identifier { , variable_identifier }

6.5 Timing control statements

procedural_timing_control_statement ::=
      procedural_timing_control statement_or_null

delay_or_event_control ::=
      delay_control | event_control | repeat ( expression ) event_control

delay_control ::=
      # delay_value | # ( mintypmax_expression )

event_control ::=
      @ hierarchical_event_identifier
    | @ ( event_expression )
    | @*
    | @ (*)
    | @ ps_or_hierarchical_sequence_identifier

event_expression ::=
      [ edge_identifier ] expression [ iff expression ]
    | sequence_instance [ iff expression ]
    | event_expression or event_expression
    | event_expression , event_expression
    | ( event_expression )

procedural_timing_control ::=
      delay_control | event_control | cycle_delay

jump_statement ::=
      return [ expression ] ; | break ; | continue ;

wait_statement ::=
      wait ( expression ) statement_or_null
    | wait fork ;
    | wait_order ( hierarchical_identifier { , hierarchical_identifier } ) action_block

event_trigger ::=
      -> hierarchical_event_identifier ;
    | ->> [ delay_or_event_control ] hierarchical_event_identifier ;

disable_statement ::=
      disable hierarchical_task_identifier ;
    | disable hierarchical_block_identifier ;
    | disable fork ;

6.6 Conditional statements

conditional_statement ::=
      [ unique_priority ] if ( cond_predicate ) statement_or_null
      { else if ( cond_predicate ) statement_or_null } [ else statement_or_null ]

unique_priority ::=
      unique | unique0 | priority

cond_predicate ::=
      expression_or_cond_pattern { &&& expression_or_cond_pattern }

expression_or_cond_pattern ::=
      expression | cond_pattern

cond_pattern ::=
      expression matches pattern

6.7 Case statements

case_statement ::=
      [ unique_priority ] case_keyword ( case_expression ) case_item { case_item } endcase
    | [ unique_priority ] case_keyword ( case_expression ) matches case_pattern_item
      { case_pattern_item } endcase
    | [ unique_priority ] case ( case_expression ) inside case_inside_item { case_inside_item }
      endcase

case_keyword ::=
      case | casez | casex

case_expression ::=
      expression

case_item ::=
      case_item_expression { , case_item_expression } : statement_or_null
    | default [ : ] statement_or_null

case_pattern_item ::=
      pattern [ &&& expression ] : statement_or_null | default [ : ] statement_or_null

case_inside_item ::=
      open_range_list : statement_or_null | default [ : ] statement_or_null

case_item_expression ::=
      expression

randcase_statement ::=
      randcase randcase_item { randcase_item } endcase

randcase_item ::=
      expression : statement_or_null

open_range_list ::=
      open_value_range { , open_value_range }

open_value_range ::=
      value_range

6.7.1 Patterns

pattern ::=
      . variable_identifier
    | .*
    | constant_expression
    | tagged member_identifier [ pattern ]
    | '{ pattern { , pattern } }
    | '{ member_identifier : pattern { , member_identifier : pattern } }

assignment_pattern ::=
      '{ expression { , expression } }
    | '{ structure_pattern_key : expression { , structure_pattern_key : expression } }
    | '{ array_pattern_key : expression { , array_pattern_key : expression } }
    | '{ constant_expression { expression { , expression } } }

structure_pattern_key ::=
      member_identifier | assignment_pattern_key

array_pattern_key ::=
      constant_expression | assignment_pattern_key

assignment_pattern_key ::=
      simple_type | default

assignment_pattern_expression ::=
      [ assignment_pattern_expression_type ] assignment_pattern

assignment_pattern_expression_type ::=
      ps_type_identifier | ps_parameter_identifier | integer_atom_type | type_reference

constant_assignment_pattern_expression ::=
      assignment_pattern_expression

assignment_pattern_net_lvalue ::=
      '{ net_lvalue { , net_lvalue } }

assignment_pattern_variable_lvalue ::=
      '{ variable_lvalue { , variable_lvalue } }

6.8 Looping statements

loop_statement ::=
      forever statement_or_null
    | repeat ( expression ) statement_or_null
    | while ( expression ) statement_or_null
    | for ( [ for_initialization ] ; [ expression ] ; [ for_step ] ) statement_or_null
    | do statement_or_null while ( expression ) ;
    | foreach ( ps_or_hierarchical_array_identifier [ loop_variables ] ) statement

for_initialization ::=
      list_of_variable_assignments | for_variable_declaration { , for_variable_declaration }

for_variable_declaration ::=
      [ var ] data_type variable_identifier = expression { , variable_identifier = expression }

for_step ::=
      for_step_assignment { , for_step_assignment }

for_step_assignment ::=
      operator_assignment | inc_or_dec_expression | function_subroutine_call

loop_variables ::=
      [ index_variable_identifier ] { , [ index_variable_identifier ] }

6.9 Subroutine call statements

subroutine_call_statement ::=
      subroutine_call ; | void ' ( function_subroutine_call ) ;

6.10 Assertion statements

assertion_item ::=
      concurrent_assertion_item | deferred_immediate_assertion_item

deferred_immediate_assertion_item ::=
      [ block_identifier : ] deferred_immediate_assertion_statement

procedural_assertion_statement ::=
      concurrent_assertion_statement | immediate_assertion_statement | checker_instantiation

immediate_assertion_statement ::=
      simple_immediate_assertion_statement | deferred_immediate_assertion_statement

simple_immediate_assertion_statement ::=
      simple_immediate_assert_statement
    | simple_immediate_assume_statement
    | simple_immediate_cover_statement

simple_immediate_assert_statement ::=
      assert ( expression ) action_block

simple_immediate_assume_statement ::=
      assume ( expression ) action_block

simple_immediate_cover_statement ::=
      cover ( expression ) statement_or_null

deferred_immediate_assertion_statement ::=
      deferred_immediate_assert_statement
    | deferred_immediate_assume_statement
    | deferred_immediate_cover_statement

deferred_immediate_assert_statement ::=
      assert #0 ( expression ) action_block | assert final ( expression ) action_block

deferred_immediate_assume_statement ::=
      assume #0 ( expression ) action_block | assume final ( expression ) action_block

deferred_immediate_cover_statement ::=
      cover #0 ( expression ) statement_or_null | cover final ( expression ) statement_or_null

6.11 Clocking block

clocking_declaration ::=
      [ default ] clocking [ clocking_identifier ] clocking_event ; { clocking_item } endclocking
      [ : clocking_identifier ]
    | global clocking [ clocking_identifier ] clocking_event ; endclocking [ : clocking_identifier ]

clocking_event ::=
      @ identifier | @ ( event_expression )

clocking_item ::=
      default default_skew ;
    | clocking_direction list_of_clocking_decl_assign ;
    | { attribute_instance } assertion_item_declaration

default_skew ::=
      input clocking_skew | output clocking_skew | input clocking_skew output clocking_skew

clocking_direction ::=
      input [ clocking_skew ]
    | output [ clocking_skew ]
    | input [ clocking_skew ] output [ clocking_skew ]
    | inout

list_of_clocking_decl_assign ::=
      clocking_decl_assign { , clocking_decl_assign }

clocking_decl_assign ::=
      signal_identifier [ = expression ]

clocking_skew ::=
      edge_identifier [ delay_control ] | delay_control

clocking_drive ::=
      clockvar_expression <= [ cycle_delay ] expression

cycle_delay ::=
      ## integral_number | ## identifier | ## ( expression )

clockvar ::=
      hierarchical_identifier

clockvar_expression ::=
      clockvar select

6.12 Rand sequence

randsequence_statement ::=
      randsequence ( [ production_identifier ] ) production { production } endsequence

production ::=
      [ data_type_or_void ] production_identifier [ ( tf_port_list ) ] : rs_rule { | rs_rule } ;

rs_rule ::=
      rs_production_list [ := weight_specification [ rs_code_block ] ]

rs_production_list ::=
      rs_prod { rs_prod }
    | rand join [ ( expression ) ] production_item production_item { production_item }

weight_specification ::=
      integral_number | ps_identifier ( expression )

rs_code_block ::=
      { { data_declaration } { statement_or_null } }

rs_prod ::=
      production_item | rs_code_block | rs_if_else | rs_repeat | rs_case

production_item ::=
      production_identifier [ ( list_of_arguments ) ]

rs_if_else ::=
      if ( expression ) production_item [ else production_item ]

rs_repeat ::=
      repeat ( expression ) production_item

rs_case ::=
      case ( case_expression ) rs_case_item { rs_case_item } endcase

rs_case_item ::=
      case_item_expression { , case_item_expression } : production_item ;
    | default [ : ] production_item ;

7 Specify section

7.1 Specify block declaration

specify_block ::=
      specify { specify_item } endspecify

specify_item ::=
      specparam_declaration
    | pulsestyle_declaration
    | showcancelled_declaration
    | path_declaration
    | system_timing_check

pulsestyle_declaration ::=
      pulsestyle_onevent list_of_path_outputs ; | pulsestyle_ondetect list_of_path_outputs ;

showcancelled_declaration ::=
      showcancelled list_of_path_outputs ; | noshowcancelled list_of_path_outputs ;

7.2 Specify path declarations

path_declaration ::=
      simple_path_declaration ;
    | edge_sensitive_path_declaration ;
    | state_dependent_path_declaration ;

simple_path_declaration ::=
      parallel_path_description = path_delay_value | full_path_description = path_delay_value

parallel_path_description ::=
      ( specify_input_terminal_descriptor [ polarity_operator ] =>
      specify_output_terminal_descriptor )

full_path_description ::=
      ( list_of_path_inputs [ polarity_operator ] *> list_of_path_outputs )

list_of_path_inputs ::=
      specify_input_terminal_descriptor { , specify_input_terminal_descriptor }

list_of_path_outputs ::=
      specify_output_terminal_descriptor { , specify_output_terminal_descriptor }

7.3 Specify block terminals

specify_input_terminal_descriptor ::=
      input_identifier [ [ constant_range_expression ] ]

specify_output_terminal_descriptor ::=
      output_identifier [ [ constant_range_expression ] ]

input_identifier ::=
      input_port_identifier | inout_port_identifier | interface_identifier . port_identifier

output_identifier ::=
      output_port_identifier | inout_port_identifier | interface_identifier . port_identifier

7.4 Specify path delays

path_delay_value ::=
      list_of_path_delay_expressions | ( list_of_path_delay_expressions )

list_of_path_delay_expressions ::=
      t_path_delay_expression
    | trise_path_delay_expression , tfall_path_delay_expression
    | trise_path_delay_expression , tfall_path_delay_expression , tz_path_delay_expression
    | t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
      tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression
    | t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
      tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression ,
      t0x_path_delay_expression , tx1_path_delay_expression , t1x_path_delay_expression ,
      tx0_path_delay_expression , txz_path_delay_expression , tzx_path_delay_expression

t_path_delay_expression ::=
      path_delay_expression

trise_path_delay_expression ::=
      path_delay_expression

tfall_path_delay_expression ::=
      path_delay_expression

tz_path_delay_expression ::=
      path_delay_expression

t01_path_delay_expression ::=
      path_delay_expression

t10_path_delay_expression ::=
      path_delay_expression

t0z_path_delay_expression ::=
      path_delay_expression

tz1_path_delay_expression ::=
      path_delay_expression

t1z_path_delay_expression ::=
      path_delay_expression

tz0_path_delay_expression ::=
      path_delay_expression

t0x_path_delay_expression ::=
      path_delay_expression

tx1_path_delay_expression ::=
      path_delay_expression

t1x_path_delay_expression ::=
      path_delay_expression

tx0_path_delay_expression ::=
      path_delay_expression

txz_path_delay_expression ::=
      path_delay_expression

tzx_path_delay_expression ::=
      path_delay_expression

path_delay_expression ::=
      constant_mintypmax_expression

edge_sensitive_path_declaration ::=
      parallel_edge_sensitive_path_description = path_delay_value
    | full_edge_sensitive_path_description = path_delay_value

parallel_edge_sensitive_path_description ::=
      ( [ edge_identifier ] specify_input_terminal_descriptor [ polarity_operator ] => (
      specify_output_terminal_descriptor [ polarity_operator ] : data_source_expression ) )

full_edge_sensitive_path_description ::=
      ( [ edge_identifier ] list_of_path_inputs [ polarity_operator ] *> ( list_of_path_outputs
      [ polarity_operator ] : data_source_expression ) )

data_source_expression ::=
      expression

edge_identifier ::=
      posedge | negedge | edge

state_dependent_path_declaration ::=
      if ( module_path_expression ) simple_path_declaration
    | if ( module_path_expression ) edge_sensitive_path_declaration
    | ifnone simple_path_declaration

polarity_operator ::=
      + | -

7.5 System timing checks

7.5.1 System timing check commands

system_timing_check ::=
      setup_timing_check
    | hold_timing_check
    | setuphold_timing_check
    | recovery_timing_check
    | removal_timing_check
    | recrem_timing_check
    | skew_timing_check
    | timeskew_timing_check
    | fullskew_timing_check
    | period_timing_check
    | width_timing_check
    | nochange_timing_check

setup_timing_check ::=
      $setup ( data_event , reference_event , timing_check_limit [ , [ notifier ] ] ) ;

hold_timing_check ::=
      $hold ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ;

setuphold_timing_check ::=
      $setuphold ( reference_event , data_event , timing_check_limit , timing_check_limit
      [ , [ notifier ]
        [ , [ timestamp_condition ]
          [ , [ timecheck_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ]
      ) ;

recovery_timing_check ::=
      $recovery ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ;

removal_timing_check ::=
      $removal ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ;

recrem_timing_check ::=
      $recrem ( reference_event , data_event , timing_check_limit , timing_check_limit
      [ , [ notifier ]
        [ , [ timestamp_condition ]
          [ , [ timecheck_condition ] [ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ]
      ) ;

skew_timing_check ::=
      $skew ( reference_event , data_event , timing_check_limit [ , [ notifier ] ] ) ;

timeskew_timing_check ::=
      $timeskew ( reference_event , data_event , timing_check_limit
      [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;

fullskew_timing_check ::=
      $fullskew ( reference_event , data_event , timing_check_limit , timing_check_limit
      [ , [ notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;

period_timing_check ::=
      $period ( controlled_reference_event , timing_check_limit [ , [ notifier ] ] ) ;

width_timing_check ::=
      $width ( controlled_reference_event , timing_check_limit , threshold [ , [ notifier ] ] ) ;

nochange_timing_check ::=
      $nochange ( reference_event , data_event , start_edge_offset , end_edge_offset
      [ , [ notifier ] ] ) ;

7.5.2 System timing check command arguments

timecheck_condition ::=
      mintypmax_expression

controlled_reference_event ::=
      controlled_timing_check_event

data_event ::=
      timing_check_event

delayed_data ::=
      terminal_identifier | terminal_identifier [ constant_mintypmax_expression ]

delayed_reference ::=
      terminal_identifier | terminal_identifier [ constant_mintypmax_expression ]

end_edge_offset ::=
      mintypmax_expression

event_based_flag ::=
      constant_expression

notifier ::=
      variable_identifier

reference_event ::=
      timing_check_event

remain_active_flag ::=
      constant_mintypmax_expression

timestamp_condition ::=
      mintypmax_expression

start_edge_offset ::=
      mintypmax_expression

threshold ::=
      constant_expression

timing_check_limit ::=
      expression

7.5.3 System timing check event definitions

timing_check_event ::=
      [ timing_check_event_control ] specify_terminal_descriptor [ &&& timing_check_condition ]

controlled_timing_check_event ::=
      timing_check_event_control specify_terminal_descriptor [ &&& timing_check_condition ]

timing_check_event_control ::=
      posedge | negedge | edge | edge_control_specifier

specify_terminal_descriptor ::=
      specify_input_terminal_descriptor | specify_output_terminal_descriptor

edge_control_specifier ::=
      edge [ edge_descriptor { , edge_descriptor } ]

edge_descriptor ::=!
      01 | 10 | z_or_x zero_or_one | zero_or_one z_or_x

zero_or_one ::=
      0 | 1

z_or_x ::=
      x | X | z | Z

timing_check_condition ::=
      scalar_timing_check_condition | ( scalar_timing_check_condition )

scalar_timing_check_condition ::=
      expression
    | ~ expression
    | expression == scalar_constant
    | expression === scalar_constant
    | expression != scalar_constant
    | expression !== scalar_constant

scalar_constant ::=
      1'b0 | 1'b1 | 1'B0 | 1'B1 | 'b0 | 'b1 | 'B0 | 'B1 | 1 | 0

8 Expressions

8.1 Concatenations

concatenation ::=
      { expression { , expression } }

constant_concatenation ::=
      { constant_expression { , constant_expression } }

constant_multiple_concatenation ::=
      { constant_expression constant_concatenation }

module_path_concatenation ::=
      { module_path_expression { , module_path_expression } }

module_path_multiple_concatenation ::=
      { constant_expression module_path_concatenation }

multiple_concatenation ::=
      { expression concatenation }

streaming_concatenation ::=
      { stream_operator [ slice_size ] stream_concatenation }

stream_operator ::=
      >> | <<

slice_size ::=
      simple_type | constant_expression

stream_concatenation ::=
      { stream_expression { , stream_expression } }

stream_expression ::=
      expression [ with [ array_range_expression ] ]

array_range_expression ::=
      expression | expression : expression | expression +: expression | expression -: expression

empty_queue ::=
      { }

8.2 Subroutine calls

constant_function_call ::=
      function_subroutine_call

tf_call ::=
      ps_or_hierarchical_tf_identifier { attribute_instance } [ ( list_of_arguments ) ]

system_tf_call ::=
      system_tf_identifier [ ( list_of_arguments ) ]
    | system_tf_identifier ( data_type [ , expression ] )

subroutine_call ::=
      tf_call | system_tf_call | method_call | [ std:: ] randomize_call

function_subroutine_call ::=
      subroutine_call

list_of_arguments ::=
      [ expression ] { , [ expression ] } { , . identifier ( [ expression ] ) }
    | . identifier ( [ expression ] ) { , . identifier ( [ expression ] ) }

method_call ::=
      method_call_root . method_call_body

method_call_body ::=
      method_identifier { attribute_instance } [ ( list_of_arguments ) ] | built_in_method_call

built_in_method_call ::=
      array_manipulation_call | randomize_call

array_manipulation_call ::=
      array_method_name { attribute_instance } [ ( list_of_arguments ) ] [ with ( expression ) ]

randomize_call ::=
      randomize { attribute_instance } [ ( [ variable_identifier_list | null ] ) ]
      [ with [ ( [ identifier_list ] ) ] constraint_block ]

method_call_root ::=
      primary | implicit_class_handle

array_method_name ::=
      method_identifier | unique | and | or | xor

8.3 Expressions

inc_or_dec_expression ::=
      inc_or_dec_operator { attribute_instance } variable_lvalue
    | variable_lvalue { attribute_instance } inc_or_dec_operator

conditional_expression ::=
      cond_predicate ? { attribute_instance } expression : expression

constant_expression ::=
      constant_primary
    | unary_operator { attribute_instance } constant_primary
    | constant_expression binary_operator { attribute_instance } constant_expression
    | constant_expression ? { attribute_instance } constant_expression : constant_expression

constant_mintypmax_expression ::=
      constant_expression | constant_expression : constant_expression : constant_expression

constant_param_expression ::=
      constant_mintypmax_expression | data_type | $

param_expression ::=
      mintypmax_expression | data_type | $

constant_range_expression ::=
      constant_expression | constant_part_select_range

constant_part_select_range ::=
      constant_range | constant_indexed_range

constant_range ::=
      constant_expression : constant_expression

constant_indexed_range ::=
      constant_expression +: constant_expression | constant_expression -: constant_expression

expression ::=
      primary
    | unary_operator { attribute_instance } primary
    | inc_or_dec_expression
    | ( operator_assignment )
    | expression binary_operator { attribute_instance } expression
    | conditional_expression
    | inside_expression
    | tagged_union_expression

tagged_union_expression ::=
      tagged member_identifier [ expression ]

inside_expression ::=
      expression inside { open_range_list }

value_range ::=
      expression | [ expression : expression ]

mintypmax_expression ::=
      expression | expression : expression : expression

module_path_conditional_expression ::=
      module_path_expression ? { attribute_instance } module_path_expression :
      module_path_expression

module_path_expression ::=
      module_path_primary
    | unary_module_path_operator { attribute_instance } module_path_primary
    | module_path_expression binary_module_path_operator { attribute_instance }
      module_path_expression
    | module_path_conditional_expression

module_path_mintypmax_expression ::=
      module_path_expression
    | module_path_expression : module_path_expression : module_path_expression

part_select_range ::=
      constant_range | indexed_range

indexed_range ::=
      expression +: constant_expression | expression -: constant_expression

genvar_expression ::=
      constant_expression

8.4 Primaries

constant_primary ::=
      primary_literal
    | ps_parameter_identifier constant_select
    | specparam_identifier [ [ constant_range_expression ] ]
    | genvar_identifier
    | formal_port_identifier constant_select
    | [ package_scope | class_scope ] enum_identifier
    | constant_concatenation [ [ constant_range_expression ] ]
    | constant_multiple_concatenation [ [ constant_range_expression ] ]
    | constant_function_call
    | constant_let_expression
    | ( constant_mintypmax_expression )
    | constant_cast
    | constant_assignment_pattern_expression
    | type_reference

module_path_primary ::=
      number
    | identifier
    | module_path_concatenation
    | module_path_multiple_concatenation
    | function_subroutine_call
    | ( module_path_mintypmax_expression )

primary ::=
      primary_literal
    | [ class_qualifier | package_scope ] hierarchical_identifier select
    | empty_queue
    | concatenation [ [ range_expression ] ]
    | multiple_concatenation [ [ range_expression ] ]
    | function_subroutine_call
    | let_expression
    | ( mintypmax_expression )
    | cast
    | assignment_pattern_expression
    | streaming_concatenation
    | sequence_method_call
    | this
    | $
    | null

class_qualifier ::=
      [ local:: ] [ implicit_class_handle . | class_scope ]

range_expression ::=
      expression | part_select_range

primary_literal ::=
      number | time_literal | unbased_unsized_literal | string_literal

time_literal ::=
      unsigned_number time_unit | fixed_point_number time_unit

time_unit ::=
      s | ms | us | ns | ps | fs

implicit_class_handle ::=
      this | super | this . super

bit_select ::=
      { [ expression ] }

select ::=
      [ { . member_identifier bit_select } . member_identifier ] bit_select
      [ [ part_select_range ] ]

nonrange_select ::=
      [ { . member_identifier bit_select } . member_identifier ] bit_select

constant_bit_select ::=
      { [ constant_expression ] }

constant_select ::=
      [ { . member_identifier constant_bit_select } . member_identifier ] constant_bit_select
      [ [ constant_part_select_range ] ]

constant_cast ::=
      casting_type ' ( constant_expression )

constant_let_expression ::=
      let_expression

cast ::=
      casting_type ' ( expression )

8.5 Expression left-side values

net_lvalue ::=
      ps_or_hierarchical_net_identifier constant_select
    | { net_lvalue { , net_lvalue } }
    | [ assignment_pattern_expression_type ] assignment_pattern_net_lvalue

variable_lvalue ::=
      [ implicit_class_handle . | package_scope ] hierarchical_variable_identifier select
    | { variable_lvalue { , variable_lvalue } }
    | [ assignment_pattern_expression_type ] assignment_pattern_variable_lvalue
    | streaming_concatenation

nonrange_variable_lvalue ::=
      [ implicit_class_handle . | package_scope ] hierarchical_variable_identifier nonrange_select

8.6 Operators

unary_operator ::=
      + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~

binary_operator ::=
      +
    | -
    | *
    | /
    | %
    | ==
    | !=
    | ===
    | !==
    | ==?
    | !=?
    | &&
    | ||
    | **
    | <
    | <=
    | >
    | >=
    | &
    | |
    | ^
    | ^~
    | ~^
    | >>
    | <<
    | >>>
    | <<<
    | ->
    | <->

inc_or_dec_operator ::=
      ++ | --

unary_module_path_operator ::=
      ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~

binary_module_path_operator ::=
      == | != | && | || | & | | | ^ | ^~ | ~^

8.7 Numbers

number ::=
      integral_number | real_number

integral_number ::=
      decimal_number | octal_number | binary_number | hex_number

decimal_number ::=
      unsigned_number
    | [ size ] decimal_base unsigned_number
    | [ size ] decimal_base x_digit { _ }
    | [ size ] decimal_base z_digit { _ }

binary_number ::=
      [ size ] binary_base binary_value

octal_number ::=
      [ size ] octal_base octal_value

hex_number ::=
      [ size ] hex_base hex_value

sign ::=
      + | -

size ::=
      non_zero_unsigned_number

non_zero_unsigned_number ::=!
      non_zero_decimal_digit { _ | decimal_digit }

real_number ::=!
      fixed_point_number | unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number

fixed_point_number ::=!
      unsigned_number . unsigned_number

exp ::=
      e | E

unsigned_number ::=!
      decimal_digit { _ | decimal_digit }

binary_value ::=!
      binary_digit { _ | binary_digit }

octal_value ::=!
      octal_digit { _ | octal_digit }

hex_value ::=!
      hex_digit { _ | hex_digit }

decimal_base ::=!
      ' [ s | S ] d | ' [ s | S ] D

binary_base ::=!
      ' [ s | S ] b | ' [ s | S ] B

octal_base ::=!
      ' [ s | S ] o | ' [ s | S ] O

hex_base ::=!
      ' [ s | S ] h | ' [ s | S ] H

non_zero_decimal_digit ::=
      1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

decimal_digit ::=
      0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

binary_digit ::=
      x_digit | z_digit | 0 | 1

octal_digit ::=
      x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7

hex_digit ::=
      x_digit
    | z_digit
    | 0
    | 1
    | 2
    | 3
    | 4
    | 5
    | 6
    | 7
    | 8
    | 9
    | a
    | b
    | c
    | d
    | e
    | f
    | A
    | B
    | C
    | D
    | E
    | F

x_digit ::=
      x | X

z_digit ::=
      z | Z | ?

unbased_unsized_literal ::=
      '0 | '1 | 'z_or_x

8.8 Strings

string_literal ::=
      " { Any_ASCII_Characters } "

9 General

9.1 Attributes

attribute_instance ::=
      (* attr_spec { , attr_spec } *)

attr_spec ::=
      attr_name [ = constant_expression ]

attr_name ::=
      identifier

9.2 Comments

comment ::=
      one_line_comment | block_comment

one_line_comment ::=
      // comment_text new_line_char

block_comment ::=
      /* comment_text */

comment_text ::=
      { Any_ASCII_character }

9.3 Identifiers

array_identifier ::=
      identifier

block_identifier ::=
      identifier

bin_identifier ::=
      identifier

c_identifier ::=
      [ a-zA-Z_ ] { [ a-zA-Z0-9_ ] }

cell_identifier ::=
      identifier

checker_identifier ::=
      identifier

class_identifier ::=
      identifier

class_variable_identifier ::=
      variable_identifier

clocking_identifier ::=
      identifier

config_identifier ::=
      identifier

const_identifier ::=
      identifier

constraint_identifier ::=
      identifier

covergroup_identifier ::=
      identifier

covergroup_variable_identifier ::=
      variable_identifier

cover_point_identifier ::=
      identifier

cross_identifier ::=
      identifier

dynamic_array_variable_identifier ::=
      variable_identifier

enum_identifier ::=
      identifier

escaped_identifier ::=
      \ { any_printable_ASCII_character_except_white_space } white_space

formal_identifier ::=
      identifier

formal_port_identifier ::=
      identifier

function_identifier ::=
      identifier

generate_block_identifier ::=
      identifier

genvar_identifier ::=
      identifier

hierarchical_array_identifier ::=
      hierarchical_identifier

hierarchical_block_identifier ::=
      hierarchical_identifier

hierarchical_event_identifier ::=
      hierarchical_identifier

hierarchical_identifier ::=
      [ $root . ] { identifier constant_bit_select . } identifier

hierarchical_net_identifier ::=
      hierarchical_identifier

hierarchical_parameter_identifier ::=
      hierarchical_identifier

hierarchical_property_identifier ::=
      hierarchical_identifier

hierarchical_sequence_identifier ::=
      hierarchical_identifier

hierarchical_task_identifier ::=
      hierarchical_identifier

hierarchical_tf_identifier ::=
      hierarchical_identifier

hierarchical_variable_identifier ::=
      hierarchical_identifier

identifier ::=
      simple_identifier | escaped_identifier

index_variable_identifier ::=
      identifier

interface_identifier ::=
      identifier

interface_instance_identifier ::=
      identifier

inout_port_identifier ::=
      identifier

input_port_identifier ::=
      identifier

instance_identifier ::=
      identifier

library_identifier ::=
      identifier

member_identifier ::=
      identifier

method_identifier ::=
      identifier

modport_identifier ::=
      identifier

module_identifier ::=
      identifier

net_identifier ::=
      identifier

net_type_identifier ::=
      identifier

output_port_identifier ::=
      identifier

package_identifier ::=
      identifier

package_scope ::=
      package_identifier :: | $unit ::

parameter_identifier ::=
      identifier

port_identifier ::=
      identifier

production_identifier ::=
      identifier

program_identifier ::=
      identifier

property_identifier ::=
      identifier

ps_class_identifier ::=
      [ package_scope ] class_identifier

ps_covergroup_identifier ::=
      [ package_scope ] covergroup_identifier

ps_checker_identifier ::=
      [ package_scope ] checker_identifier

ps_identifier ::=
      [ package_scope ] identifier

ps_or_hierarchical_array_identifier ::=
      [ implicit_class_handle . | class_scope | package_scope ] hierarchical_array_identifier

ps_or_hierarchical_net_identifier ::=
      [ package_scope ] net_identifier | hierarchical_net_identifier

ps_or_hierarchical_property_identifier ::=
      [ package_scope ] property_identifier | hierarchical_property_identifier

ps_or_hierarchical_sequence_identifier ::=
      [ package_scope ] sequence_identifier | hierarchical_sequence_identifier

ps_or_hierarchical_tf_identifier ::=
      [ package_scope ] tf_identifier | hierarchical_tf_identifier

ps_parameter_identifier ::=
      [ package_scope | class_scope ] parameter_identifier
    | { generate_block_identifier [ [ constant_expression ] ] . } parameter_identifier

ps_type_identifier ::=
      [ local:: | package_scope ] type_identifier

sequence_identifier ::=
      identifier

signal_identifier ::=
      identifier

simple_identifier ::=
      [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] }

specparam_identifier ::=
      identifier

system_tf_identifier ::=
      $ [ a-zA-Z0-9_$ ] { [ a-zA-Z0-9_$ ] }

task_identifier ::=
      identifier

tf_identifier ::=
      identifier

terminal_identifier ::=
      identifier

topmodule_identifier ::=
      identifier

type_identifier ::=
      identifier

udp_identifier ::=
      identifier

variable_identifier ::=
      identifier

sverule (formerly "SVeN") is a hyperlinked SystemVerilog BNF Navigator.

It is processed from the BNF as published in the IEEE 1800-2012 SystemVerilog standard. It was annotated by hand , however, to identify keywords and syntactic markers (all those tokens marked in red in the BNF). As such, it may contain errors. No guarantee is made as to correctness.

Please send bug reports and comments to sven at this domain.

Source code release to follow.

Redistribution and/or modification permitted as long as this notice remains intact.


J. Gareth Williams,
XtremeEDA, 2013
SVERICL Research Inc, 2022