Section A.1.5 (Also Section 15.11)

LRM-283

Changes:

module_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 ;

Section A.1.5

LRM-295

Changes:

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_statement combinational_construct

| { attribute_instance } latch_statement latch_construct

| { attribute_instance } ff_statement ff_construct

| { attribute_instance } net_alias

| { attribute_instance } final_construct

| module_common_item

| { attribute_instance } ;

Section A.1.6

LRM-295

Changes:

interface_or_generate_item ::=

 { attribute_instance } continuous_assign

| { attribute_instance } initial_construct

| { attribute_instance } always_construct

| { attribute_instance } combinational_statement combinational_construct

| { attribute_instance } latch_statement latch_construct

| { attribute_instance } ff_statement ff_construct

| { attribute_instance } local_parameter_declaration

| { attribute_instance } parameter_declaration ;

| module_common_item

| { attribute_instance } modport_declaration

| { attribute_instance } extern_tf_declaration

| { attribute_instance } final_construct

| { attribute_instance } ;

Section A.1.8 (Also Section 11.2, Section 12.3)

LRM-280

Changes:

class_item ::=

  { attribute_instance } [ rand_property ] [ hiding_property class_item_property ] data_declaration

| { attribute_instance } { tf_property } task_declaration

| { attribute_instance } { tf_property } function_declaration

| { attribute_instance } { tf_property } method_prototype

| { attribute_instance } constraint_prototype

| { attribute_instance } [ hiding_property class_item_property ] specparam_declaration

| { attribute_instance } [ hiding_property class_item_property ] local_parameter_declaration

| { attribute_instance } [ hiding_property class_item_property ] parameter_declaration ;

| { attribute_instance } [ hiding_property class_item_property ] constant_property

| { attribute_instance } constraint_declaration

constant_property ::=

const data_type const_identifier [ = constant_expression ] ;

extern_method_declaration ::=

  { tf_property } function [ automatic lifetime ] class_identifier :: function_body_declaration

| { tf_property } task [ automatic lifetime ] class_identifier :: task_body_declaration

method_prototype ::=

  task named_task_proto ;

| function named_function_proto ;

hiding_property class_item_property ::=

  static

| protected

rand_property ::=

  rand

| randc

tf_property ::=

  virtual

| hiding_property class_item_property

constraint_declaration ::=

[ static ] constraint constraint_identifier { { constraint_block } }

constraint_block ::=

  solve variable_identifier { , variable_identifier }

before variable_identifier { , variable_identifier } ;

| constraint_expression dist { { constraint_dist_item { , constraint_dist_item } } ;

constraint_expression ::=

  expression

| constraint_inside

| ! ( constraint_inside )

constraint_dist_item ::=

  range := constraint_expression

| range :/ constraint_expression

constraint_item ::=

  constraint_expression ;

| constraint_expression => constraint_item_or_block

| if ( constraint_expression ) constraint_item_or_block [ else constraint_item_or_block ]

constraint_item_or_block ::=

  constraint_item

| { { constraint_item_or_block } }

constraint_inside ::=

constraint_expression inside { range_list_or_array }

range_list_or_array ::=

  variable_identifier

| constraint_range { , constraint_range }

constraint_range ::=

  constraint_expression

| [ constraint_expression : constraint_expression ]

constraint_prototype ::=

[ static ] constraint constraint_identifier

extern_constraint_declaration ::=

[ static ] constraint class_identifier :: constraint_identifier { { constraint_block } }

 

class_item ::=

  { attribute_instance } class_property

| { attribute_instance } class_method

| { attribute_instance } class_constraint

class_property ::=

  { property_qualifier } data_declaration

| const { class_item_qualifier } data_type const_identifier [ = constant_expression ] ;

class_method ::=

  { method_qualifier } task_declaration

| { method_qualifier } function_declaration

|  extern { method_qualifier } method_prototype

class_constraint ::=

  constraint_prototype

| constraint_declaration

class_item_qualifier11 ::=

  static

| protected

| local

property_qualifier11 ::=

                  rand

| randc

| class_item_qualifier

method_qualifier11 ::=

                  virtual

| class_item_qualifier

method_prototype ::=

  task named_task_proto ;

| function named_function_proto ;

extern_method_declaration ::=

  function [ lifetime ] class_identifier :: function_body_declaration

| task [ lifetime ] class_identifier :: task_body_declaration

Section A.1.8 (Also Section 11.2, Section 12.3)

LRM-293 LRM-294

Changes (split A.1.8 into A.1.8 as defined above and A.1.9 as defined below):

A.1.9 Constraints

constraint_declaration ::= [ static ] constraint constraint_identifier { { constraint_block } }

constraint_block ::=

  solve identifier_list before identifier_list ;

| expression dist {  dist_list  } ;

| constraint_expression

constraint_expression ::=

  expression ;

                 | expression => constraint_set

                 | if ( expression ) constraint_set [ else 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 }

Remove editor’s notes:

Editor’s Note: Unmatched sets of curly-braces on preceding line (need to fix here and in section 12.4)

Editor’s Note: I am confused by the “constraint_item” and “constraing_item_or_block” productions. The seem to only refer to each other in a circular fashion.

Section A.2.7

LRM-55

Changes:

tf_input_declaration ::=

  input port_type [ signing ] { packed_dimension } list_of_tf_port_identifiers

| input tf_data_type list_of_tf_variable_identifiers

tf_output_declaration ::=

  output [ signing ] { packed_dimension } range list_of_tf_port_identifiers

| output tf_data_type list_of_tf_variable_identifiers

tf_inout_declaration ::=

  inout [ signing ] { packed_dimension } range list_of_tf_port_identifiers

| inout tf_data_type list_of_tf_variable_identifiers

Section A.2.10 (Also Section 17.7.2)

LRM-302

Changes:

goto_repetition ::= [*-> const_or_range_expression ]

 

Section A.2.2.1 (Also Section 3.2, Section 3.7, Section 3.11, and Section 3.12)

LRM-262

Changes:

data_type ::=

  singular_type

| struct [ signing ] { { struct_union_member } }

| union [ signing ] { { struct_union_member } }

data_type ::=

  integer_vector_type [ signing ] { packed_dimension } [ range ]

| integer_atom_type [ signing ]

| type_declaration_identifier { packed_dimension }

| non_integer_type

| struct packed [ signing ] { { struct_union_member } } { packed_dimension }

| 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 ] } }

| string

| event

| chandle

| class_scope_type_identifier

class_scope_type_identifier::=

  class_identifier :: { class_identifier  :: } type_declaration_identifier

| class_identifier :: { class_identifier  :: } class_identifier

LRM-262

Changes:

singular_type ::=

  integer_vector_type [ signing ] { packed_dimension } [ range ]

| integer_atom_type [ signing ]

| type_declaration_identifier { packed_dimension }

| non_integer_type

| struct packed [ signing ] { { struct_union_member } } { packed_dimension }

| union packed [ signing ] { { struct_union_member } } { packed_dimension }

| enum [ integer_type [ signing ] { packed_dimension } ]

{ enum_identifier [ = constant_expression ] { , enum_identifier [ = constant_expression ] } }

| string

| event

Section A.2.4 (Also Section 3.8)

LRM-263

Changes:

variable_decl_assignment ::=

  variable_identifier [ variable_dimension ] [ = constant_expression ]

| variable_identifier [ ] = new [ constant_expression ] [ ( variable_identifier ) ]

| class_identifier [ parameter_value_assignment ] = new [ ( list_of_arguments ) ]

Section A.2.5

LRM-262

Changes:

associative_dimension ::=

  [ singular_type ]

  [ data_type ]

| [ * ]

Section A.6.2

LRM-295

Changes:

 

initial_construct ::= initial statement_or_null

always_construct ::= always statement_or_null statement

combinational_statement combinational_construct ::= always_comb statement_or_null statement

latch_statement latch_construct ::= always_latch statement_or_null statement

ff_statement ff_construct ::= always_ff statement_or_null statement

final_construct ::= final function_statement

LRM-295

Remove editor’s note:

Editor’s Note: These production names are not consistent;, e.g. “always_xonstruct” vs. “combinational_statement”. I suggest that all these procedures be referred to as “_construct”.

Section A.6.2 (Also Section 15.14)

LRM-284

Changes:

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

Section A.6.11

LRM-284

Changes:

clocking_skew ::=

  edge_identifier [ delay_control ]

| delay_control

clocking_drive ::=

  clockvar_expression <= [ cycle_delay ] expression

| cycle_delay clockvar_expression <= expression

cycle_delay ::= ## expression

clockvar ::= clocking_indentifier . indentifier

clockvar_expression ::=

  clockvar range

| clockvar [ range_expression ]

Section A.8.3

LRM-296

Changes:

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

 

inside_expression ::= expression inside range_list_or_array

 

range_list_or_array ::=

  variable_identifier

| { value_range { , value_range } }

 

value_range ::=

  expression

| [ expression : expression ]

Section A.8.4 (Also Section 11.21)

LRM-279

Changes:

primary ::=

  number

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

[ . method_identifier { attribute_instance } [ ( expression { , expression } ) ] ]

| concatenation

| multiple_concatenation

| function_call

| system_function_call

| constant_function_call

| class_identifier :: { class_identifier :: } identifier

| ( mintypmax_expression )

| casting_type ( expression )

| void ’ ( function_call )

| casting_type concatenation

| casting_type multiple_concatenation

| time_literal

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

| null

Section A.8.6

LRM-296

Remove editor’s note:

Editor’s Note: This section does not list all the operators found in section 7.9, table 7-2. Should it?.

Section Notes

LRM-280

Changes:

10) implicit_class_handle shall only appear within the scope of a class_declaration or extern_method_declaration

 

11) In any one declaration, only one of protected or local is allowed, only one of rand or randc is allowed, and static and/or virtual can appear only once