include_statement ::= include <file_path_spec> ;
source_text ::= [
timeunits_declaration ] { description }
description ::=
module_declaration
| udp_declaration
| module_root_item
| statement_or_null
| interface_declaration
| program_declaration
| package_declaration
| { attribute_instance } package_item
| { attribute_instance } bind_directive
| {
attribute_instance } ;
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]
package_declaration ::=
{ attribute_instance } package package_identifier
[ timeunits_declaration ] { { attribute_instance } package_item }
endpackage [ :
package_identifier ]
parameter_port_list
::=
# ( list_of_param_assignments { , parameter_port_declaration } )
| # ( parameter_port_declaration { , parameter_port_declaration } )
parameter_port_declaration ::=
parameter_declaration
| data_type list_of_param_assignments
| type list_of_type_assignments
list_of_port_declarations
::=
( [ ansi_port_declaration { , ansi_port_declaration
}] )
| ( )
module_common_item
::=
{ attribute_instance } module_or_generate_item_declaration
| { attribute_instance } interface_instantiation
| { attribute_instance } program_instantiation
| { attribute_instance } concurrent_assertion_item
| { attribute_instance } bind_directive
|
continuous_assign
| net_alias
|
initial_construct
| final_construct
|
always_construct
|
combinational_construct
| latch_construct
| ff_construct
| ;
module_item ::=
non_generic_port_declaration ;
| non_port_module_item
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_construct
| {
attribute_instance } latch_construct
| {
attribute_instance } ff_construct
| { attribute_instance
} net_alias
| {
attribute_instance } final_construct
| {
attribute_instance } module_common_item
| {
attribute_instance } ;
module_root_item ::=
attribute_instance }
module_instantiation
| { attribute_instance } local_parameter_declaration
| interface_declaration
| program_declaration
| class_declaration
| module_common_item
module_or_generate_item_declaration
::=
package_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
;
non_port_module_item ::=
{ attribute_instance } generated_module_instantiation
| { attribute_instance } local_parameter_declaration
| module_or_generate_item
| { attribute_instance } parameter_declaration ;
| { attribute_instance }
specify_block
| { attribute_instance } specparam_declaration
| program_declaration
| class_declaration
| module_declaration
| timeunits_declaration21
interface_or_generate_item
::=
{ attribute_instance } continuous_assign
| {
attribute_instance } initial_construct
| { attribute_instance
} always_construct
| {
attribute_instance } combinational_construct
| {
attribute_instance } latch_construct
| {
attribute_instance } ff_construct
| { attribute_instance } local_parameter_declaration
| { attribute_instance } parameter_declaration ;
| { attribute_instance }
module_common_item
| { attribute_instance }
modport_declaration
| { attribute_instance }
extern_tf_declaration
| {
attribute_instance } final_construct
| {
attribute_instance } ;
non_port_interface_item ::=
{ attribute_instance } generated_interface_instantiation
| { attribute_instance } specparam_declaration
| interface_or_generate_item
| program_declaration
| class_declaration
| interface_declaration
| timeunits_declaration21
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_declaration21
| class_declaration
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_declaration21
A.1.9 Constraints
constraint_declaration ::=
[ static ] constraint
constraint_identifier { { constraint_block } }
constraint_block ::=
solve [ priority
] identifier_list before identifier_list ;
| expression dist
{ dist_list } ;
| constraint_expression
constraint_expression ::=
expression ;
| expression => -> constraint_set
| if ( expression )
constraint_set [ else constraint_set ]
| expression dist
{ dist_list } ;
| foreach
( array_identifier [ loop_variables
] ) 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 }
A.1.10 Package items
package_item ::=
package_or_generate_item_declaration
| specparam_declaration
| concurrent_assertion_item_declaration
| anonymous_program
| timeunits_declaration21
package_or_generate_item_declaration ::=
net_declaration
| data_declaration
| task_declaration
| function_declaration
| dpi_import_export
| extern_constraint_declaration
| extern_method_declaration
| class_declaration
| parameter_declaration ;
| local_parameter_declaration
| covergroup_declaration
anonymous_program ::= program ; {
anonymous_program_item } endprogram
anonymous_program_item ::=
task_declaration
| function_declaration
| class_declaration
| covergroup_declaration
local_parameter_declaration
::=
localparam [ signing ] { packed_dimension } [ range ] list_of_param_assignments ;
| localparam data_type
list_of_param_assignments ;
parameter_declaration ::=
parameter [ signing ] { packed_dimension } [ range ] list_of_param_assignments
| parameter data_type
list_of_param_assignments
| parameter type list_of_type_assignments
specparam_declaration ::=
specparam [ packed_dimension range
] list_of_specparam_assignments ;
constant_declaration
::= const data_type const_assignment ;
data_declaration18 ::=
[const] [lifetime] variable_declaration
| constant_declaration
| type_declaration
| package_import_declaration
| virtual_interface_declaration
package_import_declaration ::=
import
package_import_item { , package_import_item } ;
package_import_item ::=
package_identifier :: identifier
| package_identifier :: *
net_declaration17 ::=
net_type_or_trireg [
drive_strength | charge_strength ] [ vectored
| scalared ]
[ signing ] { packed_dimension } [ delay3 ] list_of_net_decl_assignments
;
net_type [ signing ]
[ delay3 ]
list_of_net_identifiers ;
| net_type [
drive_strength ] [ signing ]
[ delay3 ]
list_of_net_decl_assignments ;
| net_type [ vectored
| scalared ] [ signing ]
{ packed_dimension
} range [ delay3 ] list_of_net_identifiers ;
| net_type [
drive_strength ] [ vectored | scalared ] [ signing ]
{
packed_dimension } range [ delay3 ] list_of_net_decl_assignments ;
| trireg [
charge_strength ] [ signing ]
[ delay3 ]
list_of_net_identifiers ;
| trireg [
drive_strength ] [ signing ]
[ delay3 ]
list_of_net_decl_assignments ;
| trireg [
charge_strength ] [ vectored | scalared ] [ signing ]
{
packed_dimension } range [ delay3 ] list_of_net_identifiers ;
| trireg [
drive_strength ] [ vectored | scalared ] [ signing ]
{
packed_dimension } range [ delay3 ] list_of_net_decl_assignments ;
type_declaration ::=
typedef [ data_type ] type_declaration_identifier ;
| typedef hierarchical_identifier
. type_identifier type_declaration_identifier ;
| typedef [
class ] class_identifier ;
| typedef class_identifier
[ parameter_value_assignment ] type_declaration_identifier ;
typedef data_type type_identifier variable_dimension
;
| typedef interface_instance_identifier . type_identifier type_identifer ;
| typedef [ enum | struct | union | class ] type_identifier ;
casting_type ::=
simple_type | number size | signing
data_type data_type_common_item ::=
integer_vector_type [ signing ] {
packed_dimension } [ range ]
| integer_atom_type [
signing ]
| type_declaration_identifier type_identifier { packed_dimension }
| non_integer_type
| struct struct_union [ packed [
signing ]] { struct_union_member
{ struct_union_member } } { packed_dimension }16
| 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 ] } }
| enum [
enum_base_type ] {
enum_name_declaration { , enum_name_declaration } }
| string
| event
| chandle
|
class_scope_type_identifier
| virtual [interface] interface_identifier
data_type ::=
data_type_common_item
| event
|
class_scope_type_identifier
|
covergroup_identifier
enum_base_type
::=
integer_atom_type [ signing ]
| integer_vector_type
[ signing ] [ packed_dimension ]
enum_name_declaration
::= enum_identifier [ [ constant_range_expression ] ] [ = constant_expression ]
class_scope_type_identifier::=
class_scope
[ :: type_identifier ]
class_identifier
:: { class_identifier :: } type_declaration_identifier
|
class_identifier :: { class_identifier :: } class_identifier
class_scope ::=
class_identifier
[ parameter_value_assignment ]
{
:: class_identifier [ parameter_value_assignment
] }
net_type ::= supply0 |
supply1 | tri | triand | trior | tri0 | tri1
| wire | wand | wor
port_type ::=
data_type
| net_type
net_type_or_trireg [ signing ] { packed_dimension }
| trireg [
signing ] { packed_dimension }
| [ signing ] packed_dimension { packed_dimension } range
net_type_or_trireg ::= net_type | trireg
struct_union_member
::= { attribute_instance } variable_declaration ;
struct_union_member ::=
{ attribute_instance } data_type { packed_dimension }
variable_identifier variable_dimension { , variable_identifier variable_dimension } ;
struct_union ::= struct |
union
drive_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength0 , highz1 )
| ( strength1 , highz0 )
| ( highz0 , strength1 )
| ( highz1 , strength0 )
list_of_tf_port_identifiers
::= port_identifier { unpacked_dimension } [ = expression ]
{ , port_identifier
{ unpacked_dimension } [ = expression ] }
list_of_variable_port_identifiers
::= port_identifier variable_dimension [ = constant_expression
]
{ , port_identifier variable_dimension [ = constant_expression ] }
list_of_virtual_interface_decl ::=
variable_identifier [ = interface_instance_identifier ]
{ , variable_identifier [ = interface_instance_identifier ] }
const_assignment
::= const_identifier = constant_expression
defparam_assignment
::= hierarchical_parameter_identifier = constant_mintypmax_expression
net_decl_assignment
::= net_identifier { unpacked_dimension }
= expression
variable_decl_assignment
::=
variable_identifier variable_dimension [ =
constant_expression expression ]
| variable_identifier [
] = new [ constant_expression expression ] [ ( variable_identifier )
]
| class_variable_identifier [
parameter_value_assignment ] = new [ ( list_of_arguments
) ]
| [
covergroup_variable_identifier ] = new [
( list_of_arguments ) ]19
function_data_type8 ::=
data_type_common_item
integer_vector_type { packed_dimension } [ range ]
|
integer_atom_type
|
type_declaration_identifier { packed_dimension }
|
non_integer_type
| struct [packed
] {{ struct_union_member } } { packed_dimension }
| union [
packed ] { { struct_union_member } } { packed_dimension }
| enum [
integer_type { packed_dimension } ]
{ enum_identifier [ = constant_expression ] {
, enum_identifier [ = constant_expression ] } }
| string
| chandle
| void
function_body_declaration ::=
[ signing ] [ range_or_type
type_or_dimensions ]
[ interface_identifier .
] function_identifier ;
{ tf_item_declaration
function_item_declaration }
{ function_statement_or_null
}
endfunction [ : function_identifier
]
| [ signing ] [range_or_type type_or_dimensions]
[ interface_identifier .
] function_identifier ( [tf_port_list] ) ;
{ block_item_declaration }
{
function_statement_or_null }
endfunction [ : function_identifier ]
function_declaration ::=
function [ lifetime ]
function_body_declaration
function_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_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 ::=
tf_port_item { , tf_port_item }
named_function_proto::= [
signing ] function_data_type function_identifier (
[ list_of_tf_proto_formals list_of_function_proto_formals ] )
list_of_tf_proto_formals list_of_function_proto_formals ::=
[ { attribute_instance } tf_proto_formal function_proto_formal { , {
attribute_instance } tf_proto_formal function_proto_formal } ]
function_proto_formal ::=
tf_input_declaration
| tf_output_declaration
| tf_inout_declaration
| tf_ref_declaration
range_or_type type_or_dimensions ::=
packed_dimension
{ packed_dimension } range
| function_data_type
task_body_declaration ::=
[ interface_identifier .
] task_identifier ;
{ tf_item_declaration
task_item_declaration }
{ statement_or_null }
endtask [ : task_identifier
]
| [ interface_identifier . ] task_identifier ( [tf_port_list] ) ;
{ block_item_declaration }
{ statement_or_null }
endtask [ : task_identifier
]
task_declaration ::= task [ lifetime ]
task_body_declaration
tf_item_declaration task_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_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 } tf_data_type data_type
list_of_tf_variable_identifiers
tf_input_declaration ::=
input [
signing ] { packed_dimension } list_of_tf_port_identifiers list_of_tf_variable_identifiers
| input tf_data_type
data_type list_of_tf_variable_identifiers
tf_output_declaration ::=
output [ signing ] { packed_dimension } list_of_tf_port_identifiers list_of_tf_variable_identifiers
| output tf_data_type
data_type list_of_tf_variable_identifiers
tf_inout_declaration ::=
inout [
signing ] { packed_dimension } list_of_tf_port_identifiers list_of_tf_variable_identifiers
| inout tf_data_type
data_type list_of_tf_variable_identifiers
tf_ref_declaration ::=
[ const ] ref tf_data_type
data_type list_of_tf_variable_identifiers
tf_data_type
::=
data_type
| chandle
named_task_proto
::= task_identifier ( [
list_of_tf_proto_formals ] task_proto_formal task_proto_formal } )
tf_proto_formal task_proto_formal ::=
tf_input_declaration
| tf_output_declaration
| tf_inout_declaration
| tf_ref_declaration
Changes cancelled out resulting in no change.
block_item_declaration
::=
{ attribute_instance } data_declaration
| {
attribute_instance } local_parameter_declaration
| {
attribute_instance } parameter_declaration ;
| { attribute_instance } overload_declaration
overload_declaration ::=
bind overload_operator function data_type function_identifier (overload_proto_formals)
;
overload_operator ::= + | ++ | -
| -- | * | ** | / | % | == | !=
| < | <= | > | >= | =
overload_proto_formals ::= data_type {, data_type}
virtual_interface_declaration
::=
virtual
[interface] interface_identifier list_of_virtual_interface_decl
;
modport_declaration ::= modport
modport_item { , modport_item } ;
modport_item ::=
modport_identifier ( modport_ports_declaration { , modport_ports_declaration
} )
modport_ports_declaration
::=
{ attribute_instance } modport_simple_ports_declaration
| { attribute_instance }
modport_hierarchical_ports_declaration
| { attribute_instance }
modport_tf_ports_declaration
| {
attribute_instance } modport_clocking_declaration
modport_clocking_declaration ::= clocking
clocking_identifier
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 { , function_blocking_assignment variable_assignment } [ boolean_abbrev ]
| ( expression {,
function_blocking_assignment variable_assignment } ) [ boolean_abbrev ]
| sequence_instance [
sequence_abbrev ]
| ( sequence_expr )
[ sequence_abbrev ]
| sequence_expr and sequence_expr
| sequence_expr intersect
sequence_expr
| sequence_expr or sequence_expr
| first_match ( sequence_expr
)
| expression throughout sequence_expr
| sequence_expr within sequence_expr
A.2.11 Covergroup declarations
covergroup_declaration ::= covergroup covergroup_identifier