library_descriptions ::=
library_declaration
| include_statement
| config_declaration
| ;
config_rule_statement ::=
default_clause liblist_clause
| inst_clause
liblist_clause
| inst_clause
use_clause
| cell_clause
liblist_clause
| cell_clause
use_clause
| ;
description ::=
module_declaration
| udp_declaration
| interface_declaration
| program_declaration
| package_declaration
| { attribute_instance
} package_item
| { attribute_instance
} bind_directive
| { attribute_instance
} ;
port_reference ::=
port_identifier [ [ constant_range_expression ]
] constant_select
| { attribute_instance } specparam_declaration
| program_declaration
| module_declaration
| timeunits_declaration19
module_common_item ::=
module_or_generate_item_declaration
| interface_instantiation
| program_instantiation
| concurrent_assertion_item
| bind_directive
| continuous_assign
| net_alias
| initial_construct
| final_construct
| always_construct
| ;
bind_directive ::=
bind module_identifier bind_instantiation
;
| bind name_of_instance bind_instantiation ;
bind hierarchical_identifier constant_select bind_instantiation ;
extern_tf_declaration ::=
extern method_prototype ;
| extern forkjoin task named_task_proto task_prototype ;
class_item ::=
{ attribute_instance } class_property
| { attribute_instance
} class_method
| { attribute_instance
} class_constraint
| { attribute_instance
} type_declaration
| { attribute_instance
} class_declaration
| { attribute_instance
} timeunits_declaration19
| ;
class_method ::=
{ method_qualifier } task_declaration
| { method_qualifier
} function_declaration
| extern { method_qualifier } method_prototype
;
| { method_qualifier } class_constructor_declaration
| extern {
method_qualifier } class_constructor_prototype
method_prototype ::=
task named_task_proto ; task_prototype
| function named_function_proto ; function_prototype
constraint_declaration ::= [ static ] constraint
constraint_identifier { { constraint_block } }
constraint_block_item ::=
solve identifier_list before identifier_list ;
| constraint_expression
constraint_block ::= { { constraint_block_item } }
constraint_expression ::=
expression_or_dist ;
| expression –> constraint_set
| if ( expression
) constraint_set [ else constraint_set ]
| expression dist { dist_list } ;
| foreach ( array_identifier [ loop_variables ] ) constraint_set
constraint_prototype ::= [ static ] constraint constraint_identifier ;
extern_constraint_declaration ::=
[ static ] constraint
class_identifier :: class_scope constraint_identifier { { constraint_block } }
package_or_generate_item_declaration ::=
net_declaration
| data_declaration
| task_declaration
| function_declaration
| dpi_import_export
| extern_constraint_declaration
| class_declaration
| class_constructor_declaration
| parameter_declaration ;
| local_parameter_declaration
| covergroup_declaration
| overload_declaration
| concurrent_assertion_item_declaration
| ;
anonymous_program ::= program ; { anonymous_program_item } endprogram
anonymous_program_item ::=
task_declaration
| function_declaration
| class_declaration
| covergroup_declaration
| class_constructor_declaration
| ;
unpacked_dimension ::=
[ dimension_constant_expression : dimension_constant_expression
constant_range ]
| [ dimension_constant_expression
constant_expression ]
packed_dimension12 ::=
[dimension_constant_expression : dimension_constant_expression
constant_range ]
| unsized_dimension
range ::= [ msb_constant_expression
: lsb_constant_expression ]
function_data_type6 ::=
data_type | void
function_data_type_or_implicit ::=
function_data_type
| [ signing ] { packed_dimension
}
function_body_declaration ::=
[ signing ] [ type_or_dimensions ] function_data_type_or_implicit
[ interface_identifier . | class_scope ] function_identifier ;
{ tf_item_declaration }
{ function_statement_or_null }
endfunction
[ : function_identifier ]
| [ signing ] [ type_or_dimensions
] 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_declaration ::=
function [ lifetime ] function_body_declaration
named_function_proto function_prototype::= [
signing ] function function_data_type function_identifier ( [ tf_port_list ] )
type_or_dimensions ::=
packed_dimension { packed_dimension
}
| function_data_type
dpi_function_proto9,10 ::= function
named_function_proto function_prototype
dpi_task_proto10 ::= task named_task_proto task_prototype
named_task_proto task_prototype ::= task task_identifier
( [ tf_port_list
] )
modport_tf_ports_declaration ::=
import_export modport_tf_port { , modport_tf_port }
modport_tf_port ::=
task named_task_proto { , named_task_proto
}
| function named_function_proto
{ , named_function_proto }
method_prototype
| tf_identifier { , tf_identifier
}
property_spec ::=
[clocking_event ]
[ disable iff (expression expression_or_dist) ] property_expr
property_expr ::=
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 expression_or_dist ) property_expr [ else property_expr ]
| property_instance
| clocking_event property_expr
sequence_match_item
::=
variable_assignment operator_assignment
| inc_or_dec_expression
| subroutine_call
expression_or_dist
::=
expression [ dist { { dist_list } } ]
coverage_event ::=
clocking_identifier clocking_event
| @@( block_event_expression )
trans_range_list ::=
trans_item
| trans_item [ [ * [* repeat_range ] ]
| trans_item [ [ –> [–> repeat_range ] ]
| trans_item [ [ = [= repeat_range ] ]
select_condition ::= binsof ( bins_expression ) [ intersect
{ open_range_list } ]
open_range_list ::= { open_value_range { , open_value_range } }
udp_port_declaration ::=
udp_output_declaration ; ;
| udp_input_declaration ; ;
| udp_reg_declaration ; ;
blocking_assignment ::=
variable_lvalue = delay_or_event_control expression
| hierarchical_dynamic_array_variable_identifier = dynamic_array_new
| class_variable_identifier = class_new
| [ implicit_class_handle
. | class_scope | package_scope ]
hierarchical_variable_identifier select = class_new
| operator_assignment
cond_predicate ::=
expression_or_cond pattern expression_or_cond_pattern { &&
expression_or_cond_pattern }
A.6.9 Subroutine call
statements
subroutine_call_statement :=
subroutine_call ;
| void ’ ( function_subroutine_call ) ;
subroutine_call_statement :=
subroutine_call ;
| void ’ ( function_subroutine_call ) ;
clockvar ::=
clocking_identifier . identifier hierarchical_identifier
clockvar_expression ::=
clockvar range
| clockvar [ range_expression ] select
$setup_timing_check ::=
$setup ( data_event , reference_event , timing_check_limit [ , [ notify_reg notifier ] ] ) ;
$hold_timing_check ::=
$hold ( reference_event , data_event
, timing_check_limit [ , [ notify_reg notifier ] ] ) ;
$setuphold_timing_check ::=
$setuphold ( reference_event , data_event
, timing_check_limit , timing_check_limit
[ , [ notify_reg notifier]
[ , [ stamptime_condition
] [ , [ checktime_condition
]
[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;
$recovery_timing_check ::=
$recovery ( reference_event , data_event
, timing_check_limit [ , [ notify_reg notifier ] ] ) ;
$removal_timing_check ::=
$removal ( reference_event , data_event
, timing_check_limit [ , [ notify_reg notifier] ] ) ;
$recrem_timing_check ::=
$recrem ( reference_event , data_event
, timing_check_limit , timing_check_limit
[ , [ notify_reg notifier]
[ , [ stamptime_condition
] [ , [ checktime_condition
]
[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;
$skew_timing_check ::=
$skew ( reference_event , data_event
, timing_check_limit [ , [ notify_reg notifier ] ] ) ;
$timeskew_timing_check ::=
$timeskew ( reference_event , data_event
, timing_check_limit
[ , [ notify_reg notifier ]
[ , [ event_based_flag
] [ , [ remain_active_flag
] ] ] ] ) ;
$fullskew_timing_check ::=
$fullskew ( reference_event , data_event
, timing_check_limit , timing_check_limit
[ , [ notify_reg notifier]
[ , [ event_based_flag
] [ , [ remain_active_flag
] ] ] ] ) ;
$period_timing_check ::=
$period ( controlled_reference_event , timing_check_limit [ , [ notify_reg notifier] ] ) ;
$width_timing_check ::=
$width ( controlled_reference_event , timing_check_limit , threshold [ , [ notify_reg notifier]
] ) ;
$nochange_timing_check ::=
$nochange ( reference_event , data_event
, start_edge_offset ,
end_edge_offset [ , [ notify_reg notifier ]
] ) ;
notify_reg notifier ::= variable_identifier
stream_expression ::=
expression [ with [ array_range_expression ] ]
| array_identifier [ with [ array_range_expression
] ]
randomize_call
::=
randomize { attribute_instance }
[ ( [ variable_identifier_list | null ] ) ]
[ with { { constraint_block } } ]
base_expression ::= expression
constant_base_expression ::= constant_expression
constant_range_expression ::=
constant_expression
| constant_range_or_indexed_range constant_part_select_range
constant_range ::=
constant_expression :
constant_expression
constant_range_or_indexed_range constant_part_select_range ::= constant_range | constant_indexed_range
constant_indexed_range ::=
constant_base_expression constant_expression +: width_constant_expression
constant_expression
| constant_base_expression constant_expression -: width_constant_expression
constant_expression
dimension_constant_expression ::=
constant_expression
lsb_constant_expression ::=
constant_expression
msb_constant_expression ::= constant_expression
range_expression ::= expression | range_or_indexed_range part_select_range
range_or_indexed_range part_select_range ::= constant_range | indexed_range
indexed_range ::=
base_expression expression +: width_constant_expression constant_expression
| base_expression expression -: width_constant_expression constant_expression
width_constant_expression ::= constant_expression
select ::= { [ expression ] } [ [range_or_indexed_range part_select_range ] ]
constant_select ::= { [constant_expression ] } [ [ range_or_indexed_range constant_part_select_range ] ]
6) The signed
and unsigned keywords shall not be used within a function data type. Void
functions, non integer type functions, unpacked structure or union functions,
and functions with a typedef type cannot have a signing declaration.
25) A type_identifier shall be legal as
an enum_base_type if it denotes an integer_atom_type, with which an additional packed dimensions are dimension is
not permitted, or an integer_vector_type.