class_declaration ::=
[ virtual ] class [ lifetime ] class_identifier
[ parameter_port_list ]
[ extends class_identifier [parameter_value_assignment
] [ ( list_of_arguments) ] ] ;
{ class_item }
endclass [ : class_identifier]
enum_base_type
::=
integer_atom_type
[ signing ]
| integer_vector_type [
signing ] [ packed_dimension ]
| type_identifier [ packed_dimension
]26
enum_name_declaration ::=
enum_identifier [ [ integral_number ]
] [ = constant_expression ]
| enum_identifier [ [ integral_number : integral_number
] ] [ = constant_expression ]
enum_identifier [ [ integral_number [ : integral_number
] ] ] [ = constant_expression ]
EDITORS NOTE:
I applied change 125 differently than the change instructions. The instructions
had the new alternate syntax ( | [ integral_number
: integral_number ] ) in the middle of
the production, which seemed obscure, would not have fit well on one line, and
was different than the convention used in most of the BNF. The change instruction were:
enum_name_declaration ::= enum_identifier
[ [ constant_range_expression integral_number ] | [
integral_number : integral_number ] ] [ = constant_expression
]
variable_dimension13 ::=
{ sized_or_unsized_dimension
}
| associative_dimension
| queue_dimension
queue_dimension ::= [ $ [ : constant_expression
] ]
modport_tf_port ::=
task named_task_proto { , named_task_proto }
| function named_function_proto { , named_function_proto }
| task_or_function_identifier tf_identifier { , task_or_function_identifier tf_identifier }
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 ]
| (expression_or_dist {, variable_assignment sequence_match_item} ) [ boolean_abbrev ]
| sequence_instance [ sequence_abbrev ]
| ( sequence_expr {, variable_assignment sequence_match_item
} ) [ 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
sequence_match_item ::=
variable_assignment
| subroutine_call
hierarchical_btf_identifier :: =
hierarchical_task_identifier
| hierarchical_function_identifier
hierarchical_tf_identifier
| hierarchical_block_identifier
| hierarchical
_identifier { class_scope
:: } method_identifier
open_value_range23 ::=
value_range
| [ expression
: $ ]
| [ $
: expression ]
cmos_switch_instance ::= [ name_of_gate_instance name_of_instance ] ( output_terminal , input_terminal ,
ncontrol_terminal , pcontrol_terminal )
enable_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal , enable_terminal )
mos_switch_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal , enable_terminal )
n_input_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal { , input_terminal } )
n_output_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal { , output_terminal } ,
input_terminal )
pass_switch_instance ::= [name_of_gate_instance name_of_instance] ( inout_terminal , inout_terminal )
pass_enable_switch_instance ::= [name_of_gate_instance name_of_instance] ( inout_terminal , inout_terminal
,
enable_terminal )
pull_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal )
name_of_gate_instance ::= gate_instance_identifier
{ unpacked_dimension }
module_instantiation ::=
module_identifier [ parameter_value_assignment
] module_instance hierarchical_instance { , module_instance hierarchical_instance } ;
module_instance hierarchical_instance ::= name_of_instance ( [ list_of_port_connections ] )
name_of_instance ::= module_instance_identifier instance_identifier { unpacked_dimension }
interface_instantiation ::=
interface_identifier [ parameter_value_assignment
] module_instance hierarchical_instance { , module_instance hierarchical_instance } ;
program_instantiation ::=
program_identifier [ parameter_value_assignment
] program_instance hierarchical_instance { , program_instance hierarchical_instance } ;
program_instance ::= program_instance_identifier
{ range unpacked_dimension } ( [ list_of_port_connections
] )
udp_instance ::= [
name_of_udp_instance name_of_instance ] ( output_terminal , input_terminal { , input_terminal } )
name_of_udp_instance ::= udp_instance_identifier
{ range unpacked_dimension }
statement_item ::=
blocking_assignment ;
| nonblocking_assignment ;
| procedural_continuous_assignments ;
| case_statement
| conditional_statement
| inc_or_dec_expression ;
| function_call_statement subroutine_call_statement
| disable_statement
| event_trigger
| loop_statement
| jump_statement
| par_block
| procedural_timing_control_statement
| seq_block
| task_enable_statement
| wait_statement
| procedural_assertion_item
| clocking_drive
| randsequence_statement
| scope_randomize
| randcase_statement
| expect_property_statement
| randsequence_statement
| scope_randomize
| randcase_statement
pattern ::=
variable_identifier
|
.*
|
. constant_expression
| tagged member_identifier [ pattern ]
| { pattern , ... { , pattern } }
|
{ member_identifier : pattern , ... { , member_identifier : pattern
} }
EDITORS NOTE:
Does the ... indicate a repetition of something? If so, this is different
than the convention used everywhere else in the BNF. If this ... convention
is to be used as well, it needs to be added to the convention explanations at
the beginning of the annex.
A.6.9 Task enable Subroutine call statements
system_task_enable ::= system_task_identifier [ ( [
expression ] { , [ expression ] } ) ] ;
task_enable ::= hierarchical_task_identifier
[ ( list_of_arguments ) ] ;
task_enable_statement ::=
task_enable
| task_method_call
;
| system_task_enable
subroutine_call_statement :=
subroutine_call ;
| void
( function_subroutine_call ) ;
randsequence_statement ::= randsequence ( [ production_ identifier ] )
production { production }
endsequence
array_range_expression
::=
expression
| expression : expression
| expression +: expression
| expression -: expression
empty_queue24
::= { }
A.8.2 Function Subroutine calls
constant_function_call ::= function_identifier
{ attribute_instance }
[ ( list_of_constant_arguments ) ]
constant_function_call ::= function_subroutine_call27
function_call ::= hierarchical_function_identifier
{ attribute_instance } [ ( list_of_arguments
) ]
tf_call ::= hierarchical_tf_identifier { attribute_instance } [ ( list_of_arguments ) ]
system_tf_call ::= system_tf_identifier [ ( list_of_arguments ) ]
subroutine_call ::=
tf_call
| system_tf_call
| method_call
function_subroutine_call ::= subroutine_call
list_of_arguments ::=
[ expression ] { , [ expression ] } { , . identifier ( [ expression
] ) }
| . identifier ( [ expression ] ) { , . identifier ( [ expression ] )
}
list_of_constant_arguments ::=
[ constant_expression ] { , [ constant_expression ] }
| . identifier
( [ constant_expression ] ) { , . identifier
( [ constant_expression ] ) }
system_function_call ::= system_function_identifier
[ ( expression { , expression } ) ]
function_call_statement ::=
void ( function_call ) ;
| void ( function_method_call
) ;
| void ( system_function_call
) ;
| function_call ;
| function_method_call ;
| system_function_call ;
function_method_call ::= method_call
task_method_call ::= method_call
constant_range_expression ::=
constant_expression
| msb_constant_expression : lsb_constant_expression
| constant_base_expression
+: width_constant_expression
| constant_base_expression
-: width_constant_expression
constant_range_expression ::= constant_expression
| constant_range_or_indexed_range
constant_range_or_indexed_range ::=
range | constant_indexed_range
constant_indexed_range ::=
constant_base_expression +: width_constant_expression
| constant_base_expression : width_constant_expression
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
| function_method_call
| tagged_union_expression
range_expression ::=
expression
| msb_constant_expression : lsb_constant_expression
| base_expression
+: width_constant_expression
| base_expression
-: width_constant_expression
range_expression ::= expression | range_or_indexed_range
range_or_indexed_range ::= range | indexed_range
indexed_range ::=
base_expression +: width_constant_expression
| base_expression : width_constant_expression
constant_primary ::=
constant_concatenation
| constant_function_call
| ( constant_mintypmax_expression )
| constant_multiple_concatenation
| genvar_identifier
| number
| enum_identifier
| parameter_identifier
| specparam_identifier
| casting_type ( constant_expression
)
| casting_type constant_concatenation
| casting_type constant_multiple_concatenation
| time_literal
| 0 | 1 | z | Z | x |
X 11
constant_primary ::=
primary_literal
| parameter_identifier
| specparam_identifier
| genvar_identifier
| enum_identifier
| constant_concatentation
| constant_multiple_concatenation
| constant_function_call
| ( constant_mintypmax_expression )
| constant_cast
Changes (changes in red and blue)
module_path_primary ::=
number
| identifier
| module_path_concatenation
| module_path_multiple_concatenation
| function_call
| system_function_call
| function_subroutine_call
| ( module_path_mintypmax_expression )
Changes (changes in red and blue)
primary ::=
number
| [ implicit_class_handle .
] hierarchical_identifier { [ expression ]
} [ [ range_expression ] ]
| concatenation
| multiple_concatenation
| function_call
| system_function_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 11
| null
primary ::=
primary_literal
| [ implicit_class_handle . ] hierarchical_identifier select
| class_scope :: identifier select
| empty_queue
| concatenation
| multiple_concatenation
| function_call
| system_function_call
| function_subroutine_call
| ( mintypmax_expression )
| cast
| streaming_expression
| $25
| null
implicit_class_handle7 ::= this | super | this . super
select ::= { [ expression ] } [ [ range_or_indexed_range ] ]
constant_select ::=
{ [ expression
] } [ [ range_or_indexed_range ] ]
primary_literal ::= number | time_literal | unbased_unsized_literal
constant_cast ::=
casting_type
( constant_expression )
| casting_type constant_concatenation
| casting_type constant_multiple_concatentation
cast ::=
casting_type
( expression )
| casting_type concatenation
| casting_type multiple_concatentation
net_lvalue ::=
hierarchical_net_identifier { [ constant_expression
] } [ [ constant_range_expression ] ]
hierarchical_net_identifier constant_select
| { net_lvalue { , net_lvalue } }
variable_lvalue ::=
[ implicit_class_handle . ] hierarchical_variable_identifier { [
expression ] } [ [ range_expression
] ]
[ implicit_class_handle . ] hierarchical_variable_identifier
select
| { variable_lvalue { , variable_lvalue } }
z_digit ::= z | Z | ?
unbased_unsized_literal ::= 0 | 1 | z_or_x
11
gate_instance_identifier ::= identifier
hierarchical_function_identifier ::= hierarchical_identifier
hierarchical_identifier ::= {
identifier { [ constant_expression ] } . } identifier
hierarchical_parameter_identifier ::= hierarchical_identifier
hierarchical_net_identifier ::= hierarchical_identifier
hierarchical_parameter_identifier ::= hierarchical_identifier
hierarchical_task_identifier ::= hierarchical_identifier
hierarchical_tf_identifier ::= hierarchical_identifier
hierarchical_variable_identifier ::= hierarchical_identifier
hierarchical_task_identifier ::= hierarchical_identifier
module_instance_identifier ::= identifier
program_instance_identifier ::= identifier
system_function_identifier3 ::= $[ a-zA-Z0-9_$
]{ [ a-zA-Z0-9_$ ] }
system_task_identifier3 ::= $[ a-zA-Z0-9_$
]{ [ a-zA-Z0-9_$ ] }
system_tf_identifier3 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }
task_or_function_identifier ::= task_identifier
| function_identifier
task_identifier ::=
identifier
tf_identifier ::= identifier
udp_instance_identifier ::= identifier
A.10 NOTES
3) The $ character in a system_function_identifier or system_task_identifier
system_tf_identifier
shall not be followed by white_space. A system_function_identifier or system_task_identifier
system_tf_identifier
shall not be escaped.
11) The apostrophe (
) in constant_primary or primary unbased_unsized_literal shall not be
followed by white_space.
22) In a shallow copy the expression must evaluate to an object
handle.
23) It
shall be legal to use the $ primary in an open_value_range of
the form [ expression : $ ] or [ $ : expression ].
24) { } shall only be legal in the context of a queue.
25) The $ primary shall be legal
only in a select for a queue variable or in an open_value_range.
26) A type_identifier shall be legal as an enum_base_type
if it denotes an integer_atom_type, with which
additional packed dimensions are not permitted, or an integer_vector_type.
27) In a constant_function_call, all arguments shall be constant_expressions.