config_declaration ::=
config
config_identifier ;
design_statement
{ config_rule_statement
}
endconfig [ : config_identifier ]
class_declaration ::=
[ virtual ] class [ lifetime ] class_identifier [
parameter_port_list ]
[ extends class_identifier
[ parameter_value_assignment ] ] [ ( list_of_arguments
) ] ];
[ extends class_type [ ( list_of_arguments ) ] ];
{ class_item
}
endclass [ : class_identifier]
package_declaration ::=
{ attribute_instance
} package package_identifier ;
[ timeunits_declaration
] { { attribute_instance } package_item }
endpackage [ : package_identifier ]
list_of_port_declarations28 ::=
( [ { attribute_instance} ansi_port_declaration
{ , { attribute_instance} ansi_port_declaration } ] )
non_generic_port_declaration port_declaration ::=
{ attribute_instance
} inout_declaration
| {
attribute_instance } input_declaration
| {
attribute_instance } output_declaration
| {
attribute_instance } ref_declaration
| {
attribute_instance } interface_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
port_direction ::= input | output | inout | ref
net_port_header ::= [ port_direction ] port_type
variable_port_header ::= [ port_direction
] data_type
interface_port_header ::=
interface_identifier [ . modport_identifier ]
| interface [ . modport_identifier ]
ansi_port_declaration ::=
[ net_port_header
| interface_port_header ] port_identifier { unpacked_dimension }
| [ variable_port_header ] port_identifier
variable_dimension [ = constant_expression
]
| [ net_port_header | variable_port_header ] . port_identifier ( [ expression ]
)
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
|
combinational_construct
|
latch_construct
| ff_construct
| ;
module_item ::=
non_generic_port_declaration port_declaration ;
|
non_port_module_item
module_or_generate_item_declaration ::=
package_or_generate_item_declaration
|
genvar_declaration
| clocking_declaration
| default clocking clocking_identifier ;
interface_item ::=
non_generic_port_declaration port_declaration ;
|
non_port_interface_item
non_port_program_item ::=
{ attribute_instance
} continuous_assign
| { attribute_instance } module_or_generate_item_declaration
| { attribute_instance } specparam_declaration
| { attribute_instance } local_parameter_declaration
| { attribute_instance } parameter_declaration ;
| { attribute_instance } initial_construct
| { attribute_instance } concurrent_assertion_item
| { attribute_instance } timeunits_declaration19
|
class_declaration
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
class_constructor_prototype ::=
function
new ( [ tf_port_list ] )
;
extern_method_declaration ::=
function [ lifetime ] class_identifier :: function_body_declaration
| task [ lifetime ] class_identifier :: task_body_declaration
class_constructor_declaration ::=
function [ class_scope ] new [ ( [ tf_port_list ] ) ] ;
{ block_item_declaration
}
[ super . new [ ( list_of_arguments ) ] ; ]
{ function_statement_or_null
}
endfunction [ : new ]
dist_item ::= value_range
[ dist_weight ]
value_range := expression
| value_range :/ expression
dist_weight ::=
:= expression
| :/ expression
package_item ::=
package_or_generate_item_declaration
|
specparam_declaration
|
concurrent_assertion_item_declaration
|
anonymous_program
|
timeunits_declaration19
package_or_generate_item_declaration ::=
net_declaration
|
data_declaration
| task_declaration
|
function_declaration
|
dpi_import_export
|
extern_constraint_declaration
|
extern_method_declaration
|
class_declaration
|
class_constructor_declaration
| parameter_declaration ;
|
local_parameter_declaration
|
covergroup_declaration
| overload_declaration
|
concurrent_assertion_item_declaration
anonymous_program_item ::=
task_declaration
| function_declaration
| class_declaration
|
class_constructor_declaration
| covergroup_declaration
local_parameter_declaration ::=
localparam [ signing ] { packed_dimension } list_of_param_assignments ;
| localparam data_type_or_implicit list_of_param_assignments ;
parameter_declaration ::=
parameter [ signing ] { packed_dimension }
list_of_param_assignments
| parameter data_type_or_implicit list_of_param_assignments
| parameter type list_of_type_assignments
inout_declaration ::=
inout [ port_type ] list_of_port_identifiers
input_declaration ::=
input [ port_type ] list_of_port_identifiers
| input data_type list_of_variable_identifiers
output_declaration ::=
output [ port_type ] list_of_port_identifiers
| output data_type list_of_variable_port_identifiers
generic_interface_port_declaration ::=
interface list_of_interface_identifiers
| interface . modport_identifier
list_of_interface_identifiers
data_type_common_item
data_type ::=
integer_vector_type [
signing ] { packed_dimension }
|
integer_atom_type [ signing ]
|
type_identifier { packed_dimension }
|
non_integer_type
| struct_union [ packed [ signing ] ] {
struct_union_member {
struct_union_member } }
{ packed_dimension
}14
| enum [ enum_base_type ] { enum_name_declaration
{ , enum_name_declaration } }
| string
| chandle
| virtual [ interface ] interface_identifier
| [ class_scope | package_scope ] type_identifier { packed_dimension }
| class_type
| event
|
ps_covergroup_identifier
data_type ::=
data_type_common_item
| event
|
class_scope_type_identifier
|
covergroup_identifier
data_type_or_implicit ::=
data_type
| [ signing ] { packed_dimension }
class_scope_type_identifier::=
class_scope [ :: type_identifier ]
class_scope ::=
class_identifier
[ parameter_value_assignment ]
{ :: class_identifier
[ parameter_value_assignment ] }
class_scope ::=
class_type ::
class_type ::=
ps_class_identifier
[ parameter_value_assignment ]
{ :: class_identifier [ parameter_value_assignment ] }
integer_atom_type ::= byte
| shortint | int | longint | integer | time
integer_vector_type ::= bit
| logic | reg
non_integer_type ::= time | shortreal | real | realtime
port_type ::=
data_type
|
net_type_or_trireg [ signing ] { packed_dimension }
| [ signing ] { packed_dimension }
port_type ::=
[ net_type_or_trireg
] [ signing ] { packed_dimension
}
simple_type
::= integer_type | non_integer_type | ps_type_identifier
struct_union_member29 ::=
{ attribute_instance
} data_type {
packed_dimension }
data_type_or_void list_of_variable_identifiers
;
| { attribute_instance } void list_of_variable_identifiers
;
data_type_or_void ::=
data_type | void
delay_value ::=
unsigned_number
| real_number
| ps_identifier
| time_literal
list_of_modport_port_identifiers ::= port_identifier { , port_identifier }
| . port_identifier
( [ expression ] ) { . port_identifier ( [ expression ] )
}
list_of_port_identifiers ::= port_identifier { unpacked_dimension }
{ , port_identifier
{ unpacked_dimension } }
| . port_identifier
( [ expression ] ) { . port_identifier ( [ expression ] )
}
param_assignment ::= parameter_identifier { unpacked_dimension } = constant_param_expression
dynamic_array_new ::= new
[ expression ] [ ( dynamic_array_variable_identifier expression ) ]
function_data_type6 ::= data_type_common_item | void
function_body_declaration ::=
[ signing ] [ type_or_dimensions ]
[ interface_identifier
. | class_scope ] function_identifier ;
{ tf_item_declaration
}
{ function_statement_or_null
}
endfunction [ : function_identifier
]
| [ signing ] [ type_or_dimensions ]
[ interface_identifier
. | class_scope ] function_identifier ( [ tf_port_list ] ) ;
{ block_item_declaration
}
{ function_statement_or_null
}
endfunction [ : function_identifier
]
named_function_proto::= [ signing ] function_data_type function_identifier ( [ list_of_tf_proto_formals tf_port_list ] )
list_of_tf_proto_formals ::=
{ attribute_instance } tf_proto_formal { , { attribute_instance }
tf_proto_formal }
dpi_import_export ::= //
from Annex A.2.6
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 task_identifier ;
task_body_declaration ::=
[ interface_identifier
. | class_scope ] task_identifier ;
{ tf_item_declaration
}
{ statement_or_null
}
endtask [ : task_identifier
]
| [ interface_identifier . | class_scope ] task_identifier ( [ tf_port_list ] ) ;
{ block_item_declaration
}
{ statement_or_null
}
endtask [ : task_identifier
]
tf_item_declaration ::=
block_item_declaration
| { attribute_instance } tf_input_declaration ;
| { attribute_instance } tf_output_declaration ;
| { attribute_instance } tf_inout_declaration ;
| { attribute_instance } tf_ref_declaration ;
| tf_port_declaration
tf_port_list ::=
tf_port_item { , tf_port_item }
tf_port_item ::=
{ attribute_instance
} tf_input_declaration
| { attribute_instance } tf_output_declaration
| { attribute_instance } tf_inout_declaration
| { attribute_instance } tf_ref_declaration
| { attribute_instance } [ signing ] { packed_dimension }
list_of_tf_variable_identifiers
| { attribute_instance } data_type
list_of_tf_variable_identifiers
tf_port_item ::=
{ attribute_instance }
[ tf_port_direction ] data_type_or_implicit
port_identifier variable_dimension [ = expression ]
tf_input_declaration ::=
input [ signing ] { packed_dimension }
list_of_tf_variable_identifiers
| input data_type
list_of_tf_variable_identifiers
tf_output_declaration ::=
output [ signing ] { packed_dimension }
list_of_tf_variable_identifiers
| output data_type
list_of_tf_variable_identifiers
tf_inout_declaration ::=
inout [ signing ] { packed_dimension }
list_of_tf_variable_identifiers
| inout data_type
list_of_tf_variable_identifiers
tf_ref_declaration ::=
[ const ] ref
data_type list_of_tf_variable_identifiers
tf_port_direction ::= port_direction | const ref
tf_port_declaration ::=
{ attribute_instance } tf_port_direction
data_type_or_implicit list_of_tf_variable_identifiers ;
named_task_proto ::= task_identifier ( [list_of_tf_proto_formals tf_port_list ] )
task_proto_formal
tf_proto_formal ::=
tf_input_declaration
|
tf_output_declaration
|
tf_inout_declaration
|
tf_ref_declaration
modport_simple_ports_declaration ::=
input list_of_modport_port_identifiers
| output list_of_modport_port_identifiers
| inout list_of_modport_port_identifiers
| ref [ data_type ]
list_of_modport_port_identifiers
modport_simple_ports_declaration ::=
port_direction
modport_simple_port { , modport_simple_port }
modport_simple_port ::=
port_identifier
| . port_identifier
( [ expression ] )
concurrent_assertion_item ::= [
block_identifier : ] concurrent_assertion_statement
concurrent_assert_statement
|
concurrent_cover_statement
|
concurrent_assertion_item_declaration
concurrent_assertion_statement ::=
assert_property_statement
| assume_property_statement
| cover_property_statement
concurrent_assert_statement ::=
[block_identifier:]
assert_property_statement
concurrent_cover_statement ::=
[block_identifier:]
cover_property_statement
property_instance ::=
ps_property_identifier [ ( [ actual_arg_list ] ) ]
property_declaration ::=
property property_identifier
[ property_formal_list ( [ list_of_formals ]
) ] ;
{ assertion_variable_declaration
}
property_spec ;
endproperty [ : property_identifier ]
property_formal_list ::=
( formal_list_item { , formal_list_item } )
property_spec ::=
[clocking_event ] [ disable iff ( expression ) ]
property_expr
| [ disable iff ( expression ) ]
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
|-> property_expr
| sequence_expr
|=> property_expr
| if ( expression ) property_expr [ else property_expr ]
| property_instance
| clocking_event
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 |=> multi_clock_property_expr
| if ( expression ) multi_clock_property_expr
[ else multi_clock_property_expr ]
|
property_instance
sequence_declaration ::=
sequence sequence_identifier
[ sequence_formal_list ( [ list_of_formals ]
) ] ;
{ assertion_variable_declaration
}
sequence_spec ;
sequence_expr ;
endsequence [ : sequence_identifier ]
sequence_formal_list ::=
( formal_list_item { , formal_list_item } )
sequence_spec ::=
multi_clock_sequence
|
sequence_expr
multi_clock_sequence::=
sequence_expr
|
clocking_event multi_clock_sequence
| ( multi_clock_sequence )
|
multi_clock_sequence ## multi_clock_sequence
|
multi_clock_sequence cycle_delay_range multi_clock_sequence
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 {, sequence_match_item } ) [ boolean_abbrev ]
|
sequence_instance [ sequence_abbrev ]
| ( sequence_expr {