module_or_generate_item_declaration ::=
net_declaration
| data_declaration
| genvar_declaration
| task_declaration
| function_declaration
| dpi_import_export
| extern_constraint_declaration
| extern_method_declaration
| clocking_decl
| default clocking clocking_identifier
;
module_or_generate_item ::=
{ attribute_instance } parameter_override
| { attribute_instance } continuous_assign
| { attribute_instance } gate_instantiation
| { attribute_instance } udp_instantiation
| { attribute_instance } module_instantiation
| { attribute_instance } initial_construct
| { attribute_instance } always_construct
| { attribute_instance } combinational_statement combinational_construct
| { attribute_instance } latch_statement latch_construct
| { attribute_instance } ff_statement ff_construct
| { attribute_instance } net_alias
| { attribute_instance } final_construct
| module_common_item
| { attribute_instance } ;
interface_or_generate_item ::=
{ attribute_instance } continuous_assign
| { attribute_instance } initial_construct
| { attribute_instance } always_construct
| { attribute_instance } combinational_statement combinational_construct
| { attribute_instance } latch_statement latch_construct
| { attribute_instance } ff_statement ff_construct
| { attribute_instance } local_parameter_declaration
| { attribute_instance } parameter_declaration ;
| module_common_item
| { attribute_instance } modport_declaration
| { attribute_instance } extern_tf_declaration
| { attribute_instance } final_construct
| { attribute_instance } ;
class_item ::=
{ attribute_instance
} [ rand_property
] [ hiding_property class_item_property ] data_declaration
| { attribute_instance } { tf_property } task_declaration
| { attribute_instance } { tf_property } function_declaration
| { attribute_instance } { tf_property } method_prototype
| { attribute_instance } constraint_prototype
| { attribute_instance } [ hiding_property class_item_property ] specparam_declaration
| { attribute_instance } [ hiding_property class_item_property ] local_parameter_declaration
| { attribute_instance } [ hiding_property class_item_property ] parameter_declaration
;
| { attribute_instance } [ hiding_property class_item_property ] constant_property
| { attribute_instance } constraint_declaration
constant_property ::=
const data_type const_identifier [ = constant_expression ] ;
extern_method_declaration ::=
{ tf_property
} function [ automatic lifetime ] class_identifier
:: function_body_declaration
| { tf_property } task [ automatic lifetime ] class_identifier :: task_body_declaration
method_prototype ::=
task named_task_proto ;
| function
named_function_proto ;
hiding_property class_item_property ::=
static
| protected
rand_property ::=
rand
| randc
tf_property ::=
virtual
| hiding_property
class_item_property
constraint_declaration ::=
[ static ] constraint constraint_identifier
{ { constraint_block } }
constraint_block ::=
solve variable_identifier { , variable_identifier }
before variable_identifier { , variable_identifier } ;
| constraint_expression
dist { { constraint_dist_item { , constraint_dist_item } } ;
constraint_expression ::=
expression
| constraint_inside
| ! ( constraint_inside )
constraint_dist_item ::=
range := constraint_expression
| range :/ constraint_expression
constraint_item ::=
constraint_expression ;
| constraint_expression
=> constraint_item_or_block
| if (
constraint_expression ) constraint_item_or_block [ else constraint_item_or_block
]
constraint_item_or_block ::=
constraint_item
| { { constraint_item_or_block } }
constraint_inside ::=
constraint_expression inside { range_list_or_array }
range_list_or_array ::=
variable_identifier
| constraint_range
{ , constraint_range
}
constraint_range ::=
constraint_expression
| [ constraint_expression :
constraint_expression ]
constraint_prototype ::=
[ static ] constraint constraint_identifier
extern_constraint_declaration ::=
[ static ] constraint class_identifier
:: constraint_identifier { { constraint_block } }
class_item ::=
{ attribute_instance } class_property
| { attribute_instance } class_method
| { attribute_instance } class_constraint
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
| extern { method_qualifier
} method_prototype
class_constraint ::=
constraint_prototype
| constraint_declaration
class_item_qualifier11
::=
static
| protected
| local
property_qualifier11 ::=
rand
| randc
| class_item_qualifier
method_qualifier11 ::=
virtual
| class_item_qualifier
method_prototype ::=
task named_task_proto ;
| function named_function_proto
;
extern_method_declaration ::=
function [ lifetime ] class_identifier :: function_body_declaration
| task [ lifetime ] class_identifier
:: task_body_declaration
constraint_declaration ::= [ static ] constraint constraint_identifier {
{ constraint_block } }
constraint_block ::=
solve identifier_list
before identifier_list
;
| expression
dist { dist_list } ;
| constraint_expression
constraint_expression ::=
expression ;
| expression => constraint_set
| if ( expression ) constraint_set
[ else constraint_set
]
constraint_set ::=
constraint_expression
| { { constraint_expression } }
dist_list ::= dist_item
{ ,
dist_item }
dist_item ::=
value_range := expression
| value_range :/ expression
constraint_prototype ::= [ static ] constraint constraint_identifier
extern_constraint_declaration ::=
[ static ] constraint class_identifier
:: constraint_identifier
{ { constraint_block
} }
identifier_list ::= identifier { , identifier }
Editor’s Note: Unmatched sets of
curly-braces on preceding line (need to fix here and in section 12.4)
Editor’s Note: I am confused
by the “constraint_item” and “constraing_item_or_block”
productions. The seem to only refer to each other in a
circular fashion.
tf_input_declaration ::=
input port_type [ signing ] { packed_dimension
} list_of_tf_port_identifiers
| input tf_data_type list_of_tf_variable_identifiers
tf_output_declaration ::=
output [ signing ] { packed_dimension
} range list_of_tf_port_identifiers
| output
tf_data_type list_of_tf_variable_identifiers
tf_inout_declaration ::=
inout
[ signing ] { packed_dimension
} range list_of_tf_port_identifiers
| inout tf_data_type
list_of_tf_variable_identifiers
goto_repetition ::= [*->
const_or_range_expression ]
data_type ::=
singular_type
| struct
[ signing ] { { struct_union_member } }
| union
[ signing ] { { struct_union_member } }
data_type ::=
integer_vector_type
[ signing ] { packed_dimension
} [ range ]
| integer_atom_type [ signing
]
| type_declaration_identifier { packed_dimension
}
| non_integer_type
| struct packed [
signing ] { { struct_union_member
} } { packed_dimension
}
| union packed [ signing ] { { struct_union_member
} } { packed_dimension
}
| struct [
signing ] { { struct_union_member
} }
| union [ signing ] { { struct_union_member } }
| enum [ integer_type [ signing ] { packed_dimension
} ]
{ enum_identifier [ = constant_expression
] { , enum_identifier
[ = constant_expression
] } }
| string
| event
| chandle
| class_scope_type_identifier
class_scope_type_identifier::=
class_identifier :: { class_identifier :: } type_declaration_identifier
| class_identifier :: { class_identifier :: }
class_identifier
singular_type ::=
integer_vector_type [ signing ] { packed_dimension } [ range ]
| integer_atom_type
[ signing ]
| type_declaration_identifier
{ packed_dimension
}
| non_integer_type
| struct
packed [ signing ] { { struct_union_member
} } { packed_dimension }
| union
packed [ signing ] { { struct_union_member
} } { packed_dimension }
| enum
[ integer_type [ signing ] { packed_dimension
} ]
{ enum_identifier [ = constant_expression ] { , enum_identifier
[ = constant_expression ] } }
| string
| event
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 ) ]
associative_dimension ::=
[ singular_type ]
[ data_type ]
| [ * ]
initial_construct ::= initial
statement_or_null
always_construct ::= always
statement_or_null statement
combinational_statement combinational_construct ::= always_comb statement_or_null statement
latch_statement latch_construct ::= always_latch statement_or_null statement
ff_statement ff_construct ::= always_ff statement_or_null statement
final_construct ::= final
function_statement
Editor’s Note: These production names are
not consistent;, e.g. “always_xonstruct”
vs. “combinational_statement”. I suggest that all
these procedures be referred to as “_construct”.
statement_item ::=
{ attribute_instance } blocking_assignment ;
| { attribute_instance
} nonblocking_assignment ;
| { attribute_instance
} procedural_continuous_assignments ;
| { attribute_instance
} case_statement
| { attribute_instance
} conditional_statement
| { attribute_instance
} inc_or_dec_expression ;
| { attribute_instance
} function_call ;
| { attribute_instance
} disable_statement
| { attribute_instance
} event_trigger
| { attribute_instance
} loop_statement
| { attribute_instance
} jump_statement
| { attribute_instance
} par_block
| { attribute_instance
} procedural_timing_control_statement
| { attribute_instance
} seq_block
| { attribute_instance
} system_task_enable
| { attribute_instance
} task_enable
| { attribute_instance
} wait_statement
| { attribute_instance
} procedural_assertion_item
| { attribute_instance
} clocking_drive
clocking_skew ::=
edge_identifier [ delay_control
]
| delay_control
clocking_drive ::=
clockvar_expression
<= [ cycle_delay ] expression
| cycle_delay clockvar_expression <=
expression
cycle_delay ::= ## expression
clockvar ::= clocking_indentifier
. indentifier
clockvar_expression ::=
clockvar
range
| clockvar
[ range_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
inside_expression ::= expression inside
range_list_or_array
range_list_or_array ::=
variable_identifier
| { value_range { , value_range } }
value_range ::=
expression
| [ expression : expression ]
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
| null
Editor’s Note: This section does not list
all the operators found in section 7.9, table 7-2. Should it?.
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