class_declaration ::=
{ attribute_instance } [ virtual ] class [ lifetime ] class_identifier [ parameter_port_list
]
[ extends class_identifier [parameter_value_assignment ] ]
; [ timeunits_declaration ] { class_item }
endclass [ : class_identifier]
list_of_port_declarations ::=
( port_declaration { , ansi_port_declaration port_declaration } )
| ( )
….
port_declaration
::=
non_generic_port_declaration
| { attribute_instance } generic_interface_port_declaration
ansi_port_declaration ::=
port_declaration
| port_type list_of_port_identifiers
inout_declaration
::=
inout [ port_type ] list_of_port_identifiers
| inout data_type
list_of_variable_identifiers
block_data_declaration ::=
block_variable_declaration
| constant_declaration
| type_declaration
constant_declaration ::= const data_type const_assignment ;
data_declaration ::=
[lifetime] variable_declaration
| constant_declaration
| type_declaration
block_variable_declaration ::=
[ lifetime ] data_type
list_of_variable_identifiers ;
| [ lifetime
] data_type list_of_variable_decl_assignments
;
variable_declaration ::=
[ lifetime ] data_type list_of_variable_identifiers_or_assignments list_of_variable_decl_assignments ;
struct_union_member ::= { attribute_instance } data_type list_of_variable_identifiers_or_assignments variable_declaration ;
list_of_modport_port_identifiers
::=
port_identifier { , port_identifier
}
| . port_identifier (
[ expression ] ) { . port_identifier
( [ expression ] ) }
list_of_net_decl_assignments
::=
net_decl_assignment { , net_decl_assignment
}
list_of_net_identifiers
::=
net_identifier { unpacked_dimension
}
{ , net_identifier { unpacked_dimension } }
list_of_param_assignments
::=
param_assignment { , param_assignment
}
list_of_port_identifiers
::=
port_identifier { unpacked_dimension
}
{ ,
port_identifier { unpacked_dimension
} }
| . port_identifier (
[ expression ] ) { . port_identifier
( [ expression ] ) }
list_of_variable_identifiers_or_assignments ::=
list_of_variable_decl_assignments
| list_of_variable_identifiers
variable_decl_assignment
::=
variable_identifier [ variable_dimension ] [ = constant_expression ]
| variable_identifier [ ] = new [ constant_expression ] [ ( variable_identifier
) ]
| class_identifier [ parameter_value_assignment
] = new [ ( list_of_arguments ) ]
A.2.5 Declaration ranges
unpacked_dimension
::=
[ dimension_constant_expression : dimension_constant_expression ]
| [ dimension_constant_expression ]
packed_dimension915 ::=
[ dimension_constant_expression : dimension_constant_expression ]
| unsized_dimension [ ]
range ::= [ msb_constant_expression : lsb_constant_expression
]
associative_dimension
::=
[ data_type ]
| [ * ]
variable_dimension16 ::=
{ sized_or_unsized_dimension }
{ unpacked_dimension }
| [ ]
| associative_dimension
dpi_dimension ::=
variable_dimension
| { [ ] }
unsized_dimension15
::= [ ]
sized_or_unsized_dimension ::= unpacked_dimension | unsized_dimension
function_body_declaration
::=
[
signing ] [ range_or_type ]
[ interface_identifier . ] function_identifier ;
{ function_item_declaration
}
{ function_statement_or_null
}
endfunction [ : function_identifier
]
| [ signing ] [ range_or_type
]
[ interface_identifier . ]
function_identifier ( tf_port_list function_port_list ) ;
{ block_item_declaration }
{ function_statement_or_null
}
endfunction [ : function_identifier ]
tf_port_item function_port_item ::=
{ attribute_instance } tf_input_declaration
| { attribute_instance } tf_output_declaration
| { attribute_instance } tf_inout_declaration
| { attribute_instance } tf_ref_declaration
| { attribute_instance } port_type list_of_tf_port_identifiers
| { attribute_instance } tf_data_type list_of_tf_variable_identifiers
tf_port_list function_port_list ::= tf_port_item function_port_item { , tf_port_item function_port_item } | list_of_port_identifiers { , tf_port_item
}
dpi_function_proto12,13 ::= function named_function_proto
named_function_proto
| [ signing
] function_data_type function_identifier
( list_of_dpi_proto_formals )
list_of_dpi_proto_formals ::=
[ { attribute_instance } dpi_proto_formal
{ , { attribute_instance } dpi_proto_formal
} ]
dpi_proto_formal ::=
data_type [ port_identifier
dpi_dimension { , port_identifier dpi_dimension } ]
task_body_declaration
::=
[ interface_identifier . ]
task_identifier ;
{ task_item_declaration }
{ statement_or_null }
endtask [ : task_identifier ]
| [ interface_identifier . ] task_identifier
( tf_port_list task_port_list ) ;
{ block_item_declaration }
{ statement_or_null }
endtask [ : task_identifier
]
task_port_list ::= task_port_item
{ , task_port_item }
| list_of_port_identifiers
{ , task_port_item
}
task_port_item ::=
{ attribute_instance } tf_input_declaration
| { attribute_instance } tf_output_declaration
| { attribute_instance } tf_inout_declaration
| { attribute_instance } tf_ref_declaration ;
| { attribute_instance } port_type list_of_tf_port_identifiers
| { attribute_instance } tf_data_type list_of_tf_variable_identifiers
block_item_declaration
::=
{ attribute_instance } block_data_declaration data
declaration
| { attribute_instance } local_parameter_declaration
| { attribute_instance } parameter_declaration
;
modport_ports_declaration
::=
{ attribute_instance }
modport_simple_ports_declaration
| { attribute_instance }
modport_hierarchical_ports_declaration
| { attribute_instance } modport_tf_ports_declaration
function_statement_or_null ::=
function_statement
| { attribute_instance } ;
function_statement ::= [ block_identifier : ] function_statement_item
function_statement_or_null ::=
function_statement
| { attribute_instance } ;
event_control ::=
@ hierarchical_event_identifier
event_identifier
| @ ( event_expression
)
| @*
| @ (*)
loop_statement
::=
forever
statement_or_null
| repeat ( expression
) statement_or_null
| while ( expression
) statement_or_null
| for
( variable_decl_or_assignment ; expression
; variable_assignment ) statement_or_null
| for ( variable_decl_or_assignment
{ , variable_decl_or_assignment } ; expression
;
variable_assignment { , variable_assignment
} ) statement_or_null
| do statement_or_null while (
expression ) ;
variable_decl_or_assignment
::=
data_type list_of_variable_identifiers_or_assignments variable_declaration
| variable_assignment
A.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
parallel_edge_sensitive_path_description ::=
( [ edge_identifier
] specify_input_terminal_descriptor =>
(specify_output_terminal_descriptor [ polarity_operator
] : data_source_expression ))
full_edge_sensitive_path_description ::=
( [ edge_identifier
] list_of_path_inputs *>
(list_of_path_outputs [ polarity_operator ] : data_source_expression
) )
constant_primary
::=
constant_concatenation
| constant_function_call
| ( constant_mintypmax_expression )
| constant_multiple_concatenation
| genvar_identifier
| number
| 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 14
primary ::=
number
| implicit_class_handle hierarchical_identifier { [
expression ] } [ [ range_expression
] ]
[ . method_identifier { attribute_instance } [ ( expression { , expression
} ) ] ]
| concatenation
| multiple_concatenation
| function_call
| system_function_call
| constant_function_call
| class_identifier :: { class_identifier
:: } identifier
| ( mintypmax_expression )
| casting_type ’ ( expression )
| void ’ ( function_call )
| casting_type ’ concatenation
| casting_type ’ multiple_concatenation
| time_literal
| ’0 | ’1 | ’z | ’Z | ’x | ’X 14
| null
attr_spec ::= attr_name [ = constant_expression
]
attr_name = constant_expression
| attr_name
event_identifier ::= identifier
text_macro_identifier ::= simple_identifier
9) Open-array (
[ ] ) form shall only be used with dpi_proto_formal
10) implicit_class_handle
shall only appear within the scope of a class_declaration
or extern_method_declaration.
11) In any one declaration, only one of protected or local
is allowed, only one of rand or randc
is allowed, and static and/or virtual can appear only once.
12) dpi_function_proto return types are restricted to small
values, as per 26.4.5
13) formals of dpi_function_proto
cannot use pass by reference mode and class types cannot be passed at all; for
the complete set of restrictions see 26.4.6
14) The
apostrophe (‘) in constant_primary or primary shall
not be followed by white_space.
15) unsized_dimension is permitted
only in declarations of import DPI functions, see dpi_function_proto.
16) More than one
unsized dimension is permitted only in declarations
of import DPI functions, see dpi_function_proto.