Section A.1.3

LRM-174

Changes (changes in red and blue):

class_declaration ::=

[ virtual ] class [ lifetime ] class_identifier [ parameter_port_list ]

    [ extends class_identifier [parameter_value_assignment ] [ ( list_of_arguments) ] ] ;

   { class_item }

endclass [ : class_identifier]

Section A.2.2.1

LRM-170

Changes (changes in red and blue):

enum_base_type ::=

  integer_atom_type [ signing ]

| integer_vector_type [ signing ] [ packed_dimension ]

| type_identifier [ packed_dimension ]26

LRM-147

Changes (changes in red and blue):

enum_name_declaration ::=

  enum_identifier [ [ integral_number ] ] [ = constant_expression ]

| enum_identifier [ [ integral_number : integral_number ] ] [ = constant_expression ]

enum_identifier [ [ integral_number [ : integral_number] ] [ = constant_expression ]

 

EDITOR’S NOTE: I applied change 125 differently than the change instructions. The instructions had the new alternate syntax ( | [ integral_number : integral_number ] ) in the middle of the production, which seemed obscure, would not have fit well on one line, and was different than the convention used in most of the BNF. The change instruction were:

 

enum_name_declaration ::= enum_identifier [ [ constant_range_expression integral_number ] | [

integral_number : integral_number ] ] [ = constant_expression ]

Section A.2.5

LRM-160

Changes (changes in red and blue):

variable_dimension13 ::=

  { sized_or_unsized_dimension }

| associative_dimension

| queue_dimension

 

queue_dimension ::= [ $ [ : constant_expression ] ]

Section A.2.9

LRM-173

Changes (changes in red and blue):

modport_tf_port ::=

  task named_task_proto { , named_task_proto }

| function named_function_proto { , named_function_proto }

| task_or_function_identifier tf_identifier { , task_or_function_identifier tf_identifier }

Section A.2.10

LRM-180

Changes (changes in red and blue):

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 {, variable_assignment sequence_match_item} ) [ boolean_abbrev ]

| sequence_instance [ sequence_abbrev ]

| ( sequence_expr {, variable_assignment sequence_match_item } ) [ 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

 

sequence_match_item ::=

  variable_assignment

| subroutine_call

Section A.2.11

LRM-173

Changes (changes in red and blue):

hierarchical_btf_identifier :: =

  hierarchical_task_identifier

| hierarchical_function_identifier

  hierarchical_tf_identifier

| hierarchical_block_identifier

| hierarchical _identifier { class_scope :: } method_identifier

LRM-160

Changes (changes in red and blue):

open_value_range23 ::=

  value_range

| [ expression : $ ]

| [ $ : expression ]

Section A.3.1

LRM-172

Changes (changes in red and blue):

cmos_switch_instance ::= [ name_of_gate_instance name_of_instance ] ( output_terminal , input_terminal ,

ncontrol_terminal , pcontrol_terminal )

 

enable_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal , enable_terminal )

 

mos_switch_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal , enable_terminal )

 

n_input_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal , input_terminal { , input_terminal } )

 

n_output_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal { , output_terminal } ,

input_terminal )

 

pass_switch_instance ::= [name_of_gate_instance name_of_instance] ( inout_terminal , inout_terminal )

 

pass_enable_switch_instance ::= [name_of_gate_instance name_of_instance] ( inout_terminal , inout_terminal ,

enable_terminal )

 

pull_gate_instance ::= [name_of_gate_instance name_of_instance] ( output_terminal )

 

name_of_gate_instance ::= gate_instance_identifier { unpacked_dimension }

Section A.4.1.1

LRM-172

Changes (changes in red and blue):

module_instantiation ::=

module_identifier [ parameter_value_assignment ] module_instance hierarchical_instance { , module_instance hierarchical_instance } ;

LRM-172

Changes (changes in red and blue):

module_instance hierarchical_instance ::= name_of_instance ( [ list_of_port_connections ] )

 

name_of_instance ::= module_instance_identifier instance_identifier { unpacked_dimension }

Section A.4.1.2

LRM-172

Changes (changes in red and blue):

interface_instantiation ::=

interface_identifier [ parameter_value_assignment ] module_instance hierarchical_instance { , module_instance hierarchical_instance } ;

Section A.4.1.3

LRM-172

Changes (changes in red and blue):

program_instantiation ::=

program_identifier [ parameter_value_assignment ] program_instance hierarchical_instance { , program_instance hierarchical_instance } ;

 

program_instance ::= program_instance_identifier { range unpacked_dimension } ( [ list_of_port_connections

] )

Section A.5.4

LRM-172

Changes (changes in red and blue):

udp_instance ::= [ name_of_udp_instance name_of_instance ]  ( output_terminal , input_terminal { , input_terminal } )

 

name_of_udp_instance ::= udp_instance_identifier { range unpacked_dimension }

Section A.6.4

LRM-165 LRM-173

Changes (changes in red and blue):

statement_item ::=

  blocking_assignment ;

| nonblocking_assignment ;

| procedural_continuous_assignments ;

| case_statement

| conditional_statement

| inc_or_dec_expression ;

| function_call_statement subroutine_call_statement

| disable_statement

| event_trigger

| loop_statement

| jump_statement

| par_block

| procedural_timing_control_statement

| seq_block

| task_enable_statement

| wait_statement

| procedural_assertion_item

| clocking_drive

| randsequence_statement

| scope_randomize

| randcase_statement

| expect_property_statement

| randsequence_statement

| scope_randomize

| randcase_statement

Section A.6.7.1

LRM-150

Changes (changes in red and blue):

pattern ::=

  variable_identifier

| .*

| . constant_expression

| tagged member_identifier [ pattern ]

| { pattern , ... { , pattern } }

| { member_identifier : pattern , ... { , member_identifier : pattern } }

LRM-149

Changes (changes in red and blue):

EDITOR’S NOTE: Does the “...” indicate a repetition of something? If so, this is different than the convention used everywhere else in the BNF. If this “...” convention is to be used as well, it needs to be added to the convention explanations at the beginning of the annex.

Section A.6.9

LRM-173

Changes (changes in red and blue):

A.6.9 Task enable Subroutine call statements

system_task_enable ::= system_task_identifier [ ( [ expression ] { , [ expression ] } ) ] ;

 

task_enable ::= hierarchical_task_identifier [ ( list_of_arguments ) ] ;

 

task_enable_statement ::=

  task_enable

| task_method_call ;

| system_task_enable

 

subroutine_call_statement :=

  subroutine_call ;

| void ‘ ( function_subroutine_call ) ;

Section A.6.12

LRM-165

Changes (changes in red and blue):

randsequence_statement ::= randsequence ( [ production_ identifier ] )

production { production }

endsequence

Section A.8.1

LRM-160

Changes (changes in red and blue):

array_range_expression ::=

  expression

| expression : expression

| expression +: expression

| expression -: expression

 

            empty_queue24 ::= { }

Section A.8.2

LRM-173

Changes (changes in red and blue):

A.8.2 Function Subroutine calls

 

constant_function_call ::= function_identifier { attribute_instance }

[ ( list_of_constant_arguments ) ]

 

constant_function_call ::= function_subroutine_call27

 

function_call ::= hierarchical_function_identifier { attribute_instance } [ ( list_of_arguments ) ]

 

tf_call ::= hierarchical_tf_identifier { attribute_instance } [ ( list_of_arguments ) ]

 

system_tf_call ::= system_tf_identifier  [ ( list_of_arguments ) ]

 

subroutine_call ::=

  tf_call

| system_tf_call

| method_call

 

function_subroutine_call ::= subroutine_call

 

list_of_arguments ::=

  [ expression ] { , [ expression ] } { , . identifier ( [ expression ] ) }

| . identifier ( [ expression ] ) { , . identifier ( [ expression ] ) }

 

list_of_constant_arguments ::=

  [ constant_expression ] { , [ constant_expression ] }

| . identifier ( [ constant_expression ] ) { , . identifier ( [ constant_expression ] ) }

 

system_function_call ::= system_function_identifier [ ( expression { , expression } ) ]

 

function_call_statement ::=

  void ’ ( function_call ) ;

| void ’ ( function_method_call ) ;

| void ’ ( system_function_call ) ;

| function_call ;

| function_method_call ;

| system_function_call ;

 

function_method_call ::= method_call

 

task_method_call ::= method_call

Section A.8.3

LRM-160

Changes (changes in red and blue):

constant_range_expression ::=

  constant_expression

| msb_constant_expression : lsb_constant_expression

| constant_base_expression +: width_constant_expression

| constant_base_expression -: width_constant_expression

 

constant_range_expression ::= constant_expression | constant_range_or_indexed_range

 

constant_range_or_indexed_range ::= range | constant_indexed_range

 

constant_indexed_range ::=

  constant_base_expression +: width_constant_expression

| constant_base_expression –: width_constant_expression

LRM-173

Changes (changes in red and blue):

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

| function_method_call

| tagged_union_expression

LRM-160

Changes (changes in red and blue):

range_expression ::=

  expression

| msb_constant_expression : lsb_constant_expression

| base_expression +: width_constant_expression

| base_expression -: width_constant_expression

 

range_expression ::= expression | range_or_indexed_range

 

range_or_indexed_range ::= range | indexed_range

 

indexed_range ::=

  base_expression +: width_constant_expression

| base_expression –: width_constant_expression

Section A.8.4

LRM-160

Changes (changes in red and blue):

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 11

 

constant_primary ::=

  primary_literal

| parameter_identifier

| specparam_identifier

| genvar_identifier

| enum_identifier

| constant_concatentation

| constant_multiple_concatenation

| constant_function_call

| ( constant_mintypmax_expression )

| constant_cast

LRM-173

Changes (changes in red and blue)

module_path_primary ::=

  number

| identifier

| module_path_concatenation

| module_path_multiple_concatenation

| function_call

| system_function_call

| function_subroutine_call

| ( module_path_mintypmax_expression )

LRM-160 LRM-173

Changes (changes in red and blue)

primary ::=

  number

| [ implicit_class_handle . ] hierarchical_identifier { [ expression ] } [ [ range_expression ] ]

| concatenation

| multiple_concatenation

| function_call

| system_function_call

| class_scope :: identifier { [ expression ] } [ [ range_expression ] ]

| ( mintypmax_expression )

| casting_type ’ ( expression )

| casting_type ’ concatenation

| casting_type ’ multiple_concatenation

| streaming_expression

| time_literal

| ’0 | ’1 | ’z | ’Z | ’x | ’X 11

| null

 

primary ::=

  primary_literal

| [ implicit_class_handle . ] hierarchical_identifier select

| class_scope :: identifier select

| empty_queue

| concatenation

| multiple_concatenation

| function_call

| system_function_call

| function_subroutine_call

| ( mintypmax_expression )

| cast

| streaming_expression

| $25

| null

LRM-160

Changes (changes in red and blue):

implicit_class_handle7 ::= this | super | this . super

 

select ::= { [ expression ] }  [ [ range_or_indexed_range ] ]

 

constant_select ::=  { [ expression ] }  [ [ range_or_indexed_range ] ]

 

primary_literal ::= number | time_literal | unbased_unsized_literal

 

constant_cast ::=

  casting_type ‘ ( constant_expression )

| casting_type ‘ constant_concatenation

| casting_type ‘ constant_multiple_concatentation

 

cast ::=

  casting_type ‘ ( expression )

| casting_type ‘ concatenation

| casting_type ‘ multiple_concatentation

Section A.8.5

LRM-160

Changes (changes in red and blue):

net_lvalue ::=

hierarchical_net_identifier { [ constant_expression ] } [ [ constant_range_expression ] ]

hierarchical_net_identifier constant_select

| { net_lvalue { , net_lvalue } }

 

variable_lvalue ::=

[ implicit_class_handle . ] hierarchical_variable_identifier { [ expression ] } [ [ range_expression ] ]

[ implicit_class_handle . ] hierarchical_variable_identifier select

| { variable_lvalue { , variable_lvalue } }

Section A.8.7

LRM-160

Changes (changes in red and blue):

z_digit ::= z | Z | ?

 

unbased_unsized_literal ::= ‘0 | ‘1 | ‘z_or_x 11

Section A.9.3

LRM-172

Changes (changes in red and blue):

gate_instance_identifier ::= identifier

LRM-173

Changes (changes in red and blue):

hierarchical_function_identifier ::= hierarchical_identifier

 

hierarchical_identifier ::= { identifier { [ constant_expression ] } . } identifier

 

hierarchical_parameter_identifier ::= hierarchical_identifier

 

hierarchical_net_identifier ::= hierarchical_identifier

 

hierarchical_parameter_identifier ::= hierarchical_identifier

 

hierarchical_task_identifier ::= hierarchical_identifier

 

hierarchical_tf_identifier ::= hierarchical_identifier

 

hierarchical_variable_identifier ::= hierarchical_identifier

 

hierarchical_task_identifier ::= hierarchical_identifier

LRM-172

Changes (changes in red and blue):

module_instance_identifier ::= identifier

LRM-172

Changes (changes in red and blue):

program_instance_identifier ::= identifier

LRM-173

Changes (changes in red and blue):

system_function_identifier3 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }

 

system_task_identifier3 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }

 

system_tf_identifier3 ::= $[ a-zA-Z0-9_$ ]{ [ a-zA-Z0-9_$ ] }

LRM-173

Changes (changes in red and blue):

task_or_function_identifier ::= task_identifier | function_identifier

 

task_identifier ::= identifier

 

tf_identifier ::= identifier

LRM-172

Changes (changes in red and blue):

udp_instance_identifier ::= identifier

Section A.10 (New)

LRM-145

Change (turn NOTES under A.9 into a section) (changes in red and blue):

A.10 NOTES

LRM-173

Changes (changes in red and blue):

3) The $ character in a system_function_identifier or system_task_identifier system_tf_identifier shall not be followed by white_space. A system_function_identifier or system_task_identifier system_tf_identifier shall not be escaped.

LRM-160

Changes (changes in red and blue):

11) The apostrophe ( ‘ ) in constant_primary or primary unbased_unsized_literal shall not be followed by white_space.

LRM-160

Changes (changes in red and blue):

22) In a shallow copy the expression must evaluate to an object handle.

 

23) It shall be legal to use the $ primary in an open_value_range of the form [ expression : $ ]  or [ $ : expression ].

 

24) { }  shall only be legal in the context of  a queue.

 

25) The $ primary shall be legal only in a select for a queue variable or in an open_value_range.

LRM-170

Changes (changes in red and blue):

 

26) A type_identifier shall be legal as an enum_base_type if it denotes an integer_atom_type, with which additional packed dimensions are not permitted, or an integer_vector_type.

LRM-173

Changes (changes in red and blue):

27) In a constant_function_call, all arguments shall be constant_expressions.