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 [ ( list_of_tf_proto_formals
) ]
[ clocking_event ] ;
{ coverage_spec_or_option ; }
endgroup [ : covergroup_identifier
]
coverage_spec_or_option ::=
{attribute_instance}
coverage_spec
| {attribute_instance} coverage_option
coverage_option ::=
option.member_identifier = expression
| type_option.member_identifier
= expression
coverage_spec ::=
cover_point
| cover_cross
cover_point ::= [cover_point_identifer :] coverpoint expression
[ iff (expression) ]
bins_or_empty
bins_or_empty ::=
{ {attribute_instance} { bins_or_options ; } }
| ;
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) ]
bins_keyword::= bins | illegal_bins | ignore_bins
range_list ::= value_range { , value_range }
trans_list ::= trans_set { , trans_set }
trans_set ::= trans_range_list =>
trans_range_list {=>
trans_range_list }
trans_range_list ::=
trans_item
| trans_item [ [*
repeat_range ] ]
| trans_item [ [*->
repeat_range ] ]
| trans_item [ [*=
repeat_range ] ]
trans_item ::= { range_list
}
| value_range
repeat_range ::=
expression
| expression : expression
cover_cross ::= [cover_point_identifer:] cross
list_of_coverpoints [ iff ( expression ) ]
select_bins_or_empty
list_of_coverpoints ::=
cross_item , cross_item { , cross_item }
cross_item ::=
cover_point_identifier
| variable_identifier
select_bins_or_empty ::=
{ { bins_selections_or_option ; } }
| ;
bins_selection_or_option ::=
{attribute_instance}
coverage_option
| {attribute_instance} bins_selection
bins_selection ::= bins_keyword
bin_identifier =
select_expression
select_expression ::=
select_condition
| ! select_condition
| select_expression &&
select_expression
| select_expression || select_expression
| ( select_expression )
select_condition ::= binsof (
bins_expression ) [ intersect
open_range_list ]
bins_expression ::=
variable_indentifier
| cover_point_indentifier [ .
bins_indentifier ]
open_range_list ::= { open_value_range
{ ,
open_value_range } }
open_value_range ::=
value_range
| [ expression : $
]
| [$ : expression ]
name_of_gate_instance ::=
gate_instance_identifier { range unpacked_dimension }
ordered_parameter_assignment ::= expression | data_type param_expression
named_parameter_assignment ::= . parameter_identifier
( [ param_expression ] )
. parameter_identifier ( [expression ] )
| . parameter_identifier (
data_type )
name_of_instance ::=
module_instance_identifier { range unpacked_dimension }
list_of_port_connections20 ::=
ordered_port_connection { , ordered_port_connection }
|
dot_named_port_connection { , dot_named_port_connection }
| { named_port_connection , }
dot_star_port_connection
{ , named_port_connection }
ordered_port_connection
::= { attribute_instance } [ expression ]
named_port_connection ::= {
attribute_instance } . port_identifier[(
[ expression ] )]
| {
attribute_instance } .*
dot_named_port_connection
::=
{ attribute_instance } .port_identifier
|
named_port_connection
dot_star_port_connection
::= { attribute_instance } .*
A.4.4.1 A.4.1.3 Program instantiation
program_instance
::= program_instance_identifier { range
unpacked_dimension } ( [ list_of_port_connections ] )
udp_instance
::= [ name_of_udp_instance ] { range } ( output_terminal , input_terminal
{ , input_terminal } )
name_of_udp_instance
::= udp_instance_identifier { range
unpacked_dimension }
net_alias ::= alias net_lvalue = net_lvalue { = net_lvalue } ;
blocking_assignment
::=
variable_lvalue = delay_or_event_control expression
|
hierarchical_variable_identifier = new
[ constant_expression ] [ ( variable_identifier ) ]
| class_variable_identifier [
parameter_value_assignment ] = new [ ( list_of_arguments ) ]
| class_variable_identifier . randomize [
( ) ] with constraint_block ;
|
operator_assignment
function_blocking_assignment ::=
variable_lvalue = expression
variable_assignment ::= variable_lvalue =
expresssion
operator_assignment
|
inc_or_dec_expression
function_seq_block ::=
begin [ : block_identifier { block_item_declaration } ] {
function_statement_or_null }
end [ : block_identifier ]
Changes cancelled out resulting in no change.
statement ::= [
block_identifier : ] {
attribute_instance }
statement_item
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
| void ’ ( function_call )
| randsequence
| scope_randomize
| randcase_statement
| expect ( property_spec ) [ action_block ]
| expect ( property_instance ) [ action_block ]
function_statement ::= statement [ block_identifier : ] function_statement_item
function_statement_or_null ::=
function_statement
| { attribute_instance } ;
function_statement_item ::=
{ attribute_instance } function_blocking_assignment ;
| { attribute_instance }
function_case_statement
| { attribute_instance }
function_conditional_statement
| { attribute_instance }
inc_or_dec_expression ;
| { attribute_instance }
function_call ;
| { attribute_instance }
function_loop_statement
| { attribute_instance }
jump_statement
| { attribute_instance }
function_seq_block
| { attribute_instance }
disable_statement
| { attribute_instance }
system_task_enable
scope_randomize ::= [::]
randomize ( [ variable_identifier_list ] ) [ with { constraint_block } ]
variable_identifier_list
::= variable_identifier { ,
variable_identifier }
event_control ::=
@ hierarchical_event_identifier
| @ ( event_expression
)
| @*
| @ (*)
| @ sequence_instance
event_expression ::=
[ edge_identifier ] expression [ iff expression
]
|
sequence_instance [ iff expression ]
| event_expression or event_expression
| event_expression , event_expression
conditional_statement ::=
[ unique_priority
] if ( expression ) statement_or_null [ else statement_or_null
]
| if_else_if_statement unique_priority_if_statement
if_else_if_statement unique_priority_if_statement ::=
[ unique_priority ] if (
expression ) statement_or_null
{ else [
unique_priority ] if ( expression ) statement_or_null
}
[ else statement_or_null
]
function_conditional_statement
::=
[ unique_priority ] if ( expression ) function_statement_or_null
[ else function_statement_or_null
]
| function_if_else_if_statement
function_if_else_if_statement
::=
[ unique_priority ] if ( expression ) function_statement_or_null
{ else [ unique_priority
] if ( expression ) function_statement_or_null }
[ else function_statement_or_null
]
function_case_statement ::=
[ unique_priority ] case ( expression ) function_case_item
{ function_case_item } endcase
| [ unique_priority ] casez (
expression ) function_case_item { function_case_item } endcase
| [ unique_priority ] casex (
expression ) function_case_item { function_case_item } endcase
function_case_item ::=
expression { , expression } : function_statement_or_null
| default [ : ]
function_statement_or_null
randcase_statement
::=
randcase randcase_item { randcase_item } endcase
randcase_item ::=
expression : statement_or_null
function_loop_statement ::=
forever function_statement_or_null
| repeat ( expression )
function_statement_or_null
| while ( expression )
function_statement_or_null
| for ( variable_decl_or_assignment
{ , variable_decl_or_assignment } ; expression ;
variable_assignment { , variable_assignment
} ) function_statement_or_null
| do function_statement_or_null
while ( expression ) ;
loop_statement
::=
forever statement_or_null
| repeat ( expression
) statement_or_null
| while ( expression
) statement_or_null
| for ( variable_decl_or_assignment
{ , variable_decl_or_assignment } ; expression ;
variable_assignment
{ , variable_assignment } ) statement_or_null
| for (
for_initialization ;
expression ; for_step )
statement_or_null
| do statement_or_null
while ( expression ) ;
| foreach ( array_identifier
[ loop_variables ] ) statement
for_initialization ::=
list_of_variable_assignments
| data_type list_of_variable_assignments { , data_type list_of_variable_assignments }
for_step ::= for_step_assignment { , for_step_assignment }
for_step_assignment ::=
operator_assignment
| inc_or_dec_expression
variable_decl_or_assignment
::=
variable_declaration
|
variable_assignment
loop_variables ::= [ index_identifier ] { , [
index_identifier ] }
A.6.12 Randsequence
randsequence ::= randsequence ( [
production_ identifier ] )
production { production }
endsequence
production ::= [
function_data_type ] production_name [ (
tf_port_list ) ] : rs_rule { | rs_rule } ;
rs_rule ::= rs_production_list [ := expression [ rs_code_block ] ]
rs_production_list ::=
rs_prod { rs_prod }
| rand join [ (expression) ] production_item
production_item { production_item }
rs_ code_block ::= { { data_declaration } { statement_or_null } }
rs_prod ::=
production_item
| rs_code_block
| rs_if_else
| rs_repeat
| rs_case
production_item ::= production_identifier [ ( list_of_arguments ) ]
rs_if_else ::= if ( expression ) production_item [ else production_item
]
rs_repeat ::= repeat (
expression ) production_item
rs_case ::= case ( expression
) rs_case_item { rs_case_item } endcase
rs_case_item ::=
expression { , expression } : production_item
| default [:]
production_item
concatenation ::=
{ expression { , expression
} }
| { struct_member_label : expression { , struct_member_label
: expression } }
| { array_member_label : expression { , array_member_label
:
expression } }
constant_concatenation ::=
{ constant_expression
{ , constant_expression } }
| { struct_member_label : constant_expression { ,
struct_member_label : constant_expression } }
| { array_member_label : constant_expression { , array_member_label
:
constant_expression } }
multiple_concatenation
::= { constant_expression expression concatenation }22
streaming_expression ::= { stream_operator [ slice_size ] stream_concatenation }
stream_operator ::= >> | <<
slice_size ::=
type_identifier | constant_expression
stream_concatenation ::= { stream_expression
{ , stream_expression } }
stream_expression ::=
expression
| array_identifier [ with [ array_range_expression ] ]
array_range_expression ::=
expression
| expression : expression
| expression +: expression
| expression -: expression
list_of_arguments ::=
[ expression ] { , [ expression ] } { , . identifier ( [ expression ] ) }
| . identifier ( [
expression ] ) { , . identifier ( [ expression ] ) }
system_function_call ::= system_function_identifier [ ( expression
{ , expression } ) ]
array_method_call
::=
array_identifier . method_identifier [ ([ iterator_identifier ] ) ] [ with ( expression ) ]
conditional_expression ::= expression1 expression ?
{ attribute_instance } expression2 expression : expression3 expression
constant_param_expression ::=
constant_expression constant_mintypmax_expression | data_type
param_expression
::= mintypmax_expression | data_type
expression1
::= expression
expression2
::= expression
expression3
::= 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
| expression .
method_identifier { attribute_instance } [ (
list_of_arguments ) ]
inside_expression ::=
expression inside range_list_or_array { open_range_list
}
constant_primary ::=
constant_concatenation
| constant_function_call
| ( constant_mintypmax_expression
)
|
constant_multiple_concatenation
| genvar_identifier
| number
| enum_identifier
| parameter_identifier
| specparam_identifier
| casting_type ’ ( constant_expression
)
| casting_type ’ constant_concatenation
| casting_type ’ constant_multiple_concatenation
| time_literal
| ’0 | ’1 | ’z
| ’Z | ’x | ’X 13
module_path_primary ::=
number
| identifier
| module_path_concatenation
| module_path_multiple_concatenation
| function_call
| system_function_call
| constant_function_call
| ( module_path_mintypmax_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
| array_method_call
| constant_function_call
| class_identifier :: { class_identifier :: }
identifier
| class_scope :: identifier { [ expression ] } [ [ range_expression ] ]
| ( mintypmax_expression )
| casting_type ’ ( expression )
| void ’ ( function_call )
| casting_type ’ concatenation
| casting_type ’ multiple_concatenation
| streaming_expression
| time_literal
| ’0 | ’1 | ’z | ’Z | ’x | ’X
13
| null
array_identifier
::= identifier
block_identifier ::=
identifier
bin_identifier
::= identifier
class_identifier ::=
identifier
class_variable_identifier
::= variable_identifier
const_identifier
::= identifier
covergroup_identifier ::= identifier
covergroup_variable_identifier ::=
variable_identifier
cover_point_identifier ::= identifier
escaped_hierarchical_identifier4 ::=
escaped_hierarchical_branch
{ .simple_hierarchical_branch | .escaped_hierarchical_branch }
hierarchical_identifier ::=
{ identifier { [ constant_expression ] } . } identifier
simple_hierarchical_identifier
|
escaped_hierarchical_identifier
index_identifier
::= identifier
interface_identifier ::=
identifier
library_identifier ::=
identifier
member_identifier
::= identifier
simple_hierarchical_identifier3 ::=
simple_hierarchical_branch [ . escaped_identifier ]
type_declaration_identifier
::= type_identifier { unpacked_dimension }
A.9.4
Identifier branches
simple_hierarchical_branch3 ::=
simple_identifier { [ constant_expression unsigned_number
] } [ { . simple_identifier
{ [constant_expression unsigned_number] } } ]
escaped_hierarchical_branch4 ::=
escaped_identifier { [constant_expression unsigned_number] } [ { . escaped_identifier { [constant_expression unsigned_number] } } ]
3) The period
(.) in simple_hierarchical_identifier and simple_hierarchical_branch shall not
be preceded or
followed by
white_space.
4) The period
in escaped_hierarchical_identifier and escaped_hierarchical_branch shall be
preceded by
white_space,
but shall not be followed by white_space.
8) The
signed and unsigned keywords shall not be used within a function data type.
void Void functions,
non integer type functions, unpacked structure or union
functions, and functions with a typedef type cannot have a signing
declaration.
15) More than one unsized
dimension is permitted only in declarations of import DPI functions, see dpi_function_proto.
16) When a packed
dimension is used with the struct or
union keyword, the packed keyword shall also be used.
17) A charge
strength shall only be used with the trireg
keyword. When the vectored or scalared keyword
is used, there shall be at least one packed dimension.
18) In a
data_declaration that is not within the procedural context
it shall be illegal to use the automatic keyword.
19) It shall be legal
to omit the covergroup_variable_identifer from a covergroup instantiation only
if this implicit instantiation is within a class that has no other
instantiation of the covergroup.
20) The .* token shall appear at most once in a
list of port connections.
21) A
timeunits_declaration shall be legal as a non_port_module_item,
non_port_interface_item, non_port_program_item, package_item or class_item only
if it repeats and matches a previous timeunits_declaration within the same time
scope.
22) In a
multiple_concatenation, it shall be illegal for the multiplier not to be a
constant_expression unless the type of the concatenation is string.