class_method ::=
{ method_qualifier } task_declaration
| { method_qualifier } function_declaration
| extern
{ method_qualifier } method_prototype
| class_constructor_declaration
extern_method_declaration ::=
function [ lifetime ] class_identifier
:: function_body_declaration
| task
[ lifetime ] class_identifier :: task_body_declaration
class_constructor_declaration ::=
function new ( tf_port_list
) ;
{ block_item_declaration }
[ super . new [ ( list_of_arguments ) ] ; ]
{ function_statement_or_null }
endfunction [ : new ]
enum_name_declaration ::=
enum_identifier [ [ constant_range_expression
integral_number
] | [ integral_number : integral_number
] ]
[ = constant_expression ]
struct_union_member ::=
{ attribute_instance } data_type { packed_dimension }
variable_identifier variable_dimension { , variable_identifier
variable_dimension } list_of_variable_identifiers ;
| { attribute_instance } void list_of_variable_identifiers ;
struct_union ::= struct
| union [ tagged ]
net_decl_assignment ::= net_identifier { unpacked_dimension
} [ = expression ]
variable_decl_assignment ::=
variable_identifier
variable_dimension [expression ]
| variable_identifier [ ] = new [expression
] [ ( variable_identifier
) ]
| dynamic_array_variable_identifier [ ] [
=
dynamic_array_new ]
| class_variable_identifier = new [ ( list_of_arguments ) ] [ = class_new
]
| [ covergroup_variable_identifier
] = new [ ( list_of_arguments ) ]19
class_new24 ::= new [ ( list_of_arguments ) | expression ]
dynamic_array_new ::= new [ expression ] [ ( dynamic_array_variable_identifier ) ]
dpi_import_export ::=
import
"DPI" [ dpi_function_import_property
] [ c_identifier = ] dpi_function_proto ;
| import
"DPI" [ dpi_task_import_property ] [ c_identifier = ] dpi_task_proto ;
| export "DPI" [ c_identifier = ] function function_identifier ;
| export "DPI" [ c_identifier = ] task task_identifier ;
dpi_function_import_property ::= context | pure
dpi_task_import_property ::= context
dpi_function_proto11,12 ::= function named_function_proto
dpi_task_proto12 ::= task named_task_proto
assert_property_statement::=
assert property ( property_spec ) action_block
| assert
property ( property_instance ) action_block
assume_property_statement::=
assume property ( property_spec ) ;
cover_property_statement::=
cover property ( property_spec ) statement_or_null
| cover
property ( property_instance ) statement_or_null
expect_property_statement ::=
expect ( property_spec ) action_block
property_spec ::=
[clocking_event ] [ disable iff ] ( expression ) ] [ not ] property_expr
| [ disable iff ( expression ) ] [ not ] multi_clock_property_expr
property_expr ::=
sequence_expr
| ( property_expr )
| not property_expr
| property_expr or property_expr
| property_expr and property_expr
| sequence_expr |-> [ not ]
sequence_expr property_expr
| sequence_expr |=> [ not ] sequence_expr property_expr
| if ( expression ) property_expr [ else property_expr
]
| property_instance
| ( property_expr )
multi_clock_property_expr ::=
property_expr
| multi_clock_sequence
| clocking_event multi_clock_property_expr
| ( multi_clock_property_expr )
| not multi_clock_property_expr
| multi_clock_property_expr or multi_clock_property_expr
| multi_clock_property_expr and multi_clock_property_expr
| multi_clock_sequence |-> multi_clock_property_expr
| multi_clock_sequence |=> [ not ] multi_clock_sequence multi_clock_property_expr
| if
( expression
) multi_clock_property_expr [ else multi_clock_property_expr ]
| property_instance
| ( multi_clock_property_expr
)
multi_clock_sequence::=
clocked_sequence { ## clocked_sequence
}
sequence_expr
| clocking_event multi_clock_sequence
| ( multi_clock_sequence )
| multi_clock_sequence ## multi_clock_sequence
clocked_sequence ::=
clocking_event sequence_expr
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 expression_or_dist { , variable_assignment } [ boolean_abbrev
]
| ( expression expression_or_dist {, variable_assignment } ) [ boolean_abbrev
]
| sequence_instance [ sequence_abbrev ]
| ( sequence_expr {, variable_assignment } ) [ sequence_abbrev ]
| sequence_expr and sequence_expr
| sequence_expr intersect sequence_expr
| sequence_expr or sequence_expr
| first_match ( sequence_expr )
| expression throughout sequence_expr
| sequence_expr within sequence_expr
actual_arg_expr ::=
event_expression
| $
cycle_delay_const_range_expression ::=
constant_expression : constant_expression
| constant_expression : $
expression_or_dist::=
expression
| expression dist { dist_list }
covergroup_declaration ::=
covergroup covergroup_identifier [ ( list_of_tf_proto_formals
) ] [ clocking_event 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 = expression
coverage_spec ::=
cover_point
| cover_cross
coverage_event ::=
clocking_identifier
| @@( 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_task_identifier
| hierarchical_function_identifier
| hierarchical_block_identifier
| hierarchical _identifier { class_scope :: } method_identifier
blocking_assignment ::=
variable_lvalue =
delay_or_event_control expression
| hierarchical_variable_identifier = new [ constant_expression ] [ ( variable_identifier
) ]
| hierarchical_dynamic_array_variable_identifier
[ ] = dynamic_array_new
| class_variable_identifier = new [ ( list_of_arguments ) ] class_new
| class_variable_identifier . randomize [ ( ) ] with constraint_block
;
| operator_assignment
statement_item ::=
blocking_assignment ;
| nonblocking_assignment ;
| procedural_continuous_assignments ;
| case_statement
| conditional_statement
| inc_or_dec_expression ;
| function_call ;
| function_call_statement
| disable_statement
| event_trigger
| loop_statement
| jump_statement
| par_block
| procedural_timing_control_statement
| seq_block
| system_task_enable task_enable_statement
| task_enable
| wait_statement
| procedural_assertion_item
| clocking_drive
| void ’ ( function_call
)
| randsequence
| scope_randomize
| randcase_statement
| expect ( property_spec ) [ action_block ]
| expect ( property_instance ) [ action_block
]
| expect_property_statement
scope_randomize ::= [ std:: ]
randomize ( [ variable_identifier_list ] ) [
with { constraint_block } ]
procedural_timing_control
::=
delay_control
| event_control
| cycle_delay
conditional_statement ::=
if ( expression cond_predicate
) statement_or_null [ else statement_or_null ]
| unique_priority_if_statement
unique_priority_if_statement ::=
[ unique_priority
] if (expression cond_predicate) statement_or_null
{ else if (expression cond_predicate) statement_or_null }
[ else statement_or_null ]
unique_priority ::= unique
| priority
cond_predicate
::=
expression_or_cond pattern { &&
expression_or_cond_pattern }
expression_or_cond_pattern ::=
expression | cond_pattern
cond_pattern ::= expression matches
pattern
case_statement ::=
[ unique_priority ] case ( expression ) case_item { case_item } endcase
| [ unique_priority
] casez ( expression ) case_item { case_item } endcase
| [ unique_priority
] casex ( expression ) case_item { case_item } endcase
[ unique_priority ] case_keyword ( expression ) case_item { case_item } endcase
| [ unique_priority
] case_keyword ( expression ) matches
case_pattern_item { case_pattern_item } endcase
case_keyword ::= case | casez
| casex
case_item ::=
expression { , expression
} : statement_or_null
| default
[ : ] statement_or_null
case_pattern_item ::=
pattern [ && expression ] : statement_or_null
| default
[ : ] statement_or_null
A.6.7.1 Patterns
pattern ::=
variable_identifier
| .*
| . constant_expression
| tagged
member_identifier [ pattern ]
| { pattern , ... , pattern }
| { member_identifier : pattern , ... , member_identifier
: pattern }
task_enable ::= hierarchical_task_identifier [ ( list_of_arguments ) ] ;
task_enable_statement ::=
task_enable
| task_method_call ;
| system_task_enable
procedural_assertion_item ::=
assert_property_statement
| cover_property_statement
| immediate_assert_statement
| assume_property_statement
A.6.11
Clocking domain block
array_method_call ::=
array_identifier . method_identifier [ ( [ iterator_identifier
] ) ] [ with ( expression ) ]
function_call_statement ::=
void ‘
( function_call ) ;
| void ‘
( function_method_call
) ;
| void ‘
( system_function_call
) ;
| function_call ;
| function_method_call ;
| system_function_call ;
method_call_root ::=
expression | implicit_class_handle
function_method_call ::= method_call
task_method_call ::= method_call
method_call ::=
method_call_root . method_identifier
{ attribute_instance } [ ( list_of_arguments ) ]
| expression . array_method_name
{ attribute_instance } [ ( list_of_arguments ) ] [ with ( expression ) ]23
array_method_name ::=
method_identifier | unique | and | or | xor
conditional_expression ::= expression cond_predicate ?
{ attribute_instance
} expression : expression
constant_param_expression ::=
constant_mintypmax_expression | data_type | $
expression ::=
primary
| unary_operator { attribute_instance } primary
| inc_or_dec_expression
| ( operator_assignment )
| expression binary_operator { attribute_instance } expression
| conditional_expression
| string_literal
| inside_expression
| expression . method_identifier
{ attribute_instance } [ ( list_of_arguments
) ]
| function_method_call
| tagged_union_expression
tagged_union_expression ::=
tagged member_identifier [ expression ]
primary ::=
number
| [
implicit_class_handle . ] hierarchical_identifier { [ expression ] } [ [
range_expression ] ]
| concatenation
| multiple_concatenation
| function_call
| system_function_call
| array_method_call
| class_scope
:: identifier { [ expression ] } [ [ range_expression ] ]
| ( mintypmax_expression )
| casting_type ’ ( expression
)
| casting_type ’ concatenation
| casting_type ’ multiple_concatenation
| streaming_expression
| time_literal
| ’0 | ’1 | ’z
| ’Z | ’x | ’X 13
| null
implicit_class_handle9 ::= [ this. ] | [ super. ] this | super | this . super
variable_lvalue ::=
[ implicit_class_handle . ] hierarchical_variable_identifier { [ expression
] } [ [ range_expression ] ]
| { variable_lvalue { , variable_lvalue } }
number ::=
decimal_number
| octal_number
| binary_number
| hex_number
integral_number
| real_number
integral_number ::=
decimal_number
| octal_number
| binary_number
| hex_number
cover_point_identifier ::=
identifier
dynamic_array_variable_identifier ::= variable_identifier
hierarchical_block_identifier ::= hierarchical_identifier
hierarchical_dynamic_array_variable_identifier ::= hierarchical_variable_identifier
NOTE: The notes and all references need renumbered due to 2 items being removed!
12) Formals of dpi_function_proto and dpi_task_proto cannot use pass by reference mode and
class types cannot be passed at all; for the complete set of restrictions see
27.4.6.
23) The with clause of a method call
shall be legal only for the array (or queue) methods of Section 4.15.
24) In a shallow copy the expression must evaluate to an object
handle.