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 {, sequence_match_item } ) [ sequence_abbrev ]
| sequence_expr and sequence_expr
| sequence_expr intersect sequence_expr
| sequence_expr or sequence_expr
| first_match ( sequence_expr {, sequence_match_item} )
| expression_or_dist throughout sequence_expr
| sequence_expr within sequence_expr
| clocking_event
sequence_expr
cycle_delay_range ::=
## constant_expression
## integral_number
| ## identifier
| ## ( constant_expression )
| ## [ cycle_delay_const_range_expression ]
sequence_method_call ::=
sequence_instance . method_identifier
sequence_instance ::=
ps_sequence_identifier [ ( [ actual_arg_list ] ) ]
formal_list_item ::=
formal_identifier
[ = actual_arg_expr ]
list_of_formals ::= formal_list_item { , formal_list_item }
actual_arg_list ::=
( actual_arg_expr { , actual_arg_expr } )
| ( . formal_identifier
( actual_arg_expr ) { , . formal_identifier ( actual_arg_expr ) } )
non_consecutive_repetition ::= [*= [= const_or_range_expression ]
goto_repetition ::= [*-> [-> const_or_range_expression ]
expression_or_dist::=
expression
| expression dist { dist_list }
expression_or_dist::= expression [ dist { dist_list } ]
covergroup_declaration ::=
covergroup covergroup_identifier [ ( list_of_tf_proto_formals [ tf_port_list ] ) ] [
coverage_event ] ;
{ coverage_spec_or_option
; }
endgroup [ : covergroup_identifier ]
coverage_spec_or_option ::=
{attribute_instance} coverage_spec
|
{attribute_instance} coverage_option ;
hierarchical_btf_identifier :: =
hierarchical_tf_identifier
|
hierarchical_block_identifier
| hierarchical _identifier { [ class_scope :: ] }
method_identifier
bins_or_options ::=
coverage_option
| [ wildcard ] bins_keyword bin_identifier [ [ [ expression ] ]
] = { range_list } [ iff ( expression
) ]
| [ wildcard]
bins_keyword bin_identifier [ [ ] ] = ( trans_list ) [ iff ( expression ) ]
| bins_keyword
bin_identifier [ [ [ expression ] ] ] = default
[ iff ( expression ) ]
| bins_keyword
bin_identifier = default
sequence [ iff ( expression ) ]
trans_list ::= ( trans_set ) { , ( trans_set ) }
trans_range_list ::=
trans_item
| trans_item [ [ * repeat_range
] ]
| trans_item [ [ *–> [ –>repeat_range ] ]
| trans_item [ [ *= [ =repeat_range ] ]
trans_item
::= { range_list } | value_range
cover_cross ::= [cover_point_identifer : ] cross cross list_of_coverpoints [ iff ( expression ) ]
select_bins_or_empty
bins_selection ::= bins_keyword bin_identifier = select_expression
[ iff ( expression ) ]
udp_declaration ::=
udp_nonansi_declaration udp_port_declaration { udp_port_declaration }
udp_body
endprimitive [ : udp_identifier ]
|
udp_ansi_declaration udp_body endprimitive [ : udp_identifier ]
| extern udp_nonansi_declaration
| extern udp_ansi_declaration
| { attribute_instance } primitive udp_identifier (
.* ) ;
{ udp_port_declaration
} udp_body endprimitive [ : udp_identifier
]
udp_declaration ::=
{ attribute_instance
} primitive udp_identifier ( udp_port_list ) ;
udp_port_declaration
{ udp_port_declaration }
udp_body
endprimitive
| { attribute_instance } primitive udp_identifier ( udp_declaration_port_list
) ;
udp_body
endprimitive
always_construct ::= always always_keyword statement
always_keyword ::= always | always_comb
| always_latch
| always_ff
combinational_construct ::= always_comb statement
latch_construct ::= always_latch statement
ff_construct ::= always_ff statement
blocking_assignment ::=
variable_lvalue = delay_or_event_control expression
|
hierarchical_dynamic_array_variable_identifier [ ] = dynamic_array_new
|
class_variable_identifier = class_new
|
class_variable_identifier . randomize [ ( ) ] with constraint_block
|
operator_assignment
procedural_continuous_assignments
procedural_continuous_assignment ::=
assign variable_assignment
| deassign variable_lvalue
| force variable_assignment
| force net_assignment
| release variable_lvalue
| release net_lvalue
statement_item ::=
blocking_assignment ;
| nonblocking_assignment ;
| procedural_continuous_assignments ;
|
procedural_continuous_assignment ;
| case_statement
| conditional_statement
| inc_or_dec_expression ;
| subroutine_call_statement
| disable_statement
| event_trigger
| loop_statement
| jump_statement
| par_block
| procedural_timing_control_statement
| seq_block
| wait_statement
|
procedural_assertion_item
|
procedural_assertion_statement
| clocking_drive ;
| randsequence_statement
|
scope_randomize
|
randcase_statement
|
expect_property_statement
scope_randomize
::= [ std :: ] randomize ( [ variable_identifier_list ] ) [
with { constraint_block } ]
loop_statement ::=
forever statement_or_null
| repeat ( expression ) statement_or_null
| while ( expression ) statement_or_null
| for ( for_initialization ; expression ; for_step )
statement_or_null
| do statement_or_null while ( expression ) ;
| foreach ( array_identifier [ [ loop_variables ] ] ) statement
loop_variables ::= [ index_variable_identifier
] { , [ index_ variable_identifier
] }
procedural_assertion_item ::=
assert_property_statement
|
cover_property_statement
|
immediate_assert_statement
|
assume_property_statement
procedural_assertion_statement ::=
concurrent_assertion_statement
| immediate_assert_statement
clocking_declaration ::=
[ default ] clocking [ clocking_identifier ] clocking_event ;
{ clocking_item
}
endclocking [ : clocking_identifier ]
cycle_delay ::= ## expression
## integral_number
| ## identifier
| ## ( expression )
slice_size
::= ps_type_identifier |
constant_expression
tf_call ::=
ps_or_hierarchical_tf_identifier {
attribute_instance } [ ( list_of_arguments
) ]
subroutine_call ::=
tf_call
| system_tf_call
| method_call
| randomize_call
method_call ::=
method_call_root .
method_identifier { attribute_instance } [ ( list_of_arguments
) ]
| expression . array_method_name { attribute_instance } [ ( list_of_arguments ) ]
[ with ( expression
) ]21
method_call ::=
method_call_root . method_call_body
method_call_body ::=
method_identifier { attribute_instance } [
( list_of_arguments
) ]
| built_in_method_call
built_in_method_call ::=
array_manipulation_call
| randomize_call
array_manipulation_call ::=
array_method_name { attribute_instance }
[ ( list_of_arguments )
]
[ with ( expression ) ]
randomize_call ::=
randomize { attribute_instance }
[ ( [ variable_identifier_list |
null
] ) ]
[ with { { constraint_block } } ]
constant_expression ::=
constant_primary
|
unary_operator { attribute_instance } constant_primary
|
constant_expression binary_operator { attribute_instance
} constant_expression
| constant_expression ? { attribute_instance } constant_expression : constant_expression
|
string_literal
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
|
tagged_union_expression
range_list_or_array
::=
variable_identifier
| { value_range
{ , value_range } }
constant_primary
::=
primary_literal
| ps_parameter_identifier
| ps_specparam_identifier
| genvar_identifier
| [ package_scope |
class_scope ] enum_identifier
| constant_concatentation
| constant_multiple_concatenation
| constant_function_call
| (
constant_mintypmax_expression )
| constant_cast
primary ::=
primary_literal
| [
implicit_class_handle . | class_scope | package_scope ] hierarchical_identifier
select
| class_scope :: identifier select
| empty_queue
| concatenation
| multiple_concatenation
| function_subroutine_call
| ( mintypmax_expression )
| cast
| streaming_expression
|
sequence_method_call
|
$25
| null
primary_literal
::= number | time_literal | unbased_unsized_literal | string_literal
net_lvalue ::=
ps_or_hierarchical_net_identifier
constant_select
| { net_lvalue { , net_lvalue }
}
variable_lvalue ::=
[ implicit_class_handle
. | package_scope ]
hierarchical_variable_identifier select
| { variable_lvalue { , variable_lvalue } }
hierarchical_identifier ::= [ $root
. ] { identifier { [ [ constant_expression ] ] } . } identifier
index_variable_identifier ::=
identifier
output_port_identifier ::= identifier
package_identifier ::= identifier
package_scope ::=
package_identifier
::
| $unit ::
property_identifier
::= identifier
ps_class_identifier ::= [ package_scope ]
class_identifier
ps_covergroup_identifier ::= [ package_scope
] covergroup_identifier
ps_identifier ::= [ package_scope ]
identifier
ps_or_hierarchical_net_identifier ::=
[ package_scope ] net_identifier |
hierarchical_net_identifier
ps_or_hierarchical_tf_identifier ::= [
package_scope ] tf_identifier | hierarchical_tf_identifier
ps_parameter_identifier ::= [
package_scope ] parameter_identifier
ps_property_identifier ::= [ package_scope
] property_identifier
ps_sequence_identifier ::= [ package_scope
] sequence_identifier
ps_specparam_identifier ::= [
package_scope ] specparam_identifier
ps_type_identifier ::= [ package_scope ]
type_identifier
A.10 Notes Footnotes (normative)
7) implicit_class_handle
shall only appear within the scope of a class_declaration or extern_method_declaration out-of-block
method declaration.
21) The with clause
of a method call shall be legal only for the array (or queue) methods of
Section 4.15.
27) In a
constant_function_call, all arguments shall be constant_expressions.
28) The
list_of_port_declarations syntax is explained in Section 18.8, which also
imposes various semantic restrictions, e.g.,
a ref port must be of a variable
type and an inout port must not
be. It shall be illegal to initialize a
port that is not a variable output
port.
29) It shall be
legal to declare void struct_union_members only within tagged
unions.