Section A.1.1

LRM-39

Change (changes in red):

include_statement ::= include <file_path_spec> ;

Section A.1.3

LRM-58

Change (changes in red):

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

LRM-58

Change (changes in red):

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 ]

Section A.1.4

LRM-86

Change (changes in red):

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

LRM-100

Change (changes in red):

list_of_port_declarations ::=

  ( [ ansi_port_declaration { , ansi_port_declaration }] )

| ( )

Section A.1.5

LRM-58

Change (changes in red):

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 ;

LRM-39 LRM-58 LRM-99

Change (changes in red):

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

Section A.1.6

LRM-58

Change (changes in red):

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

LRM-39 LRM-58 LRM-99

Change (changes in red):

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

Section A.1.7

LRM-99

Change (changes in red):

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

Section A.1.8

LRM-65 LRM-99

Change (change in red):

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

Section A.1.9

LRM-63 LRM-70 LRM-71

Change (changes in red):

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 }

Section A.1.10 (New)

LRM-58 LRM-65 LRM-77 LRM-99

Add (changes in red):

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

| overload_declaration

 

anonymous_program ::= program ; { anonymous_program_item } endprogram

 

anonymous_program_item ::=

  task_declaration

| function_declaration

| class_declaration

| covergroup_declaration

Section A.2.1.1

LRM-45

Change (changes in red):

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 ;

Section A.2.1.3

LRM-90

Change (changes in red):

constant_declaration ::= const data_type const_assignment ;

LRM-58 LRM-59 LRM-74 LRM-90

Change (changes in red):

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 :: *

LRM-45

Change (changes in red):

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 ;

LRM-89

Change (changes in red):

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 ;

Section A.2.2.1

LRM-76

Change (changes in red):

casting_type ::= simple_type | number size | signing

LRM-45 LRM-59 LRM-65 LRM-72 LRM-82

Change (changes in red):

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 ]

LRM-45 LRM-59 LRM-69

Change (changes in red):

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

LRM-45

Change (changes in red):

 

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

LRM-59 LRM-100

Change (changes in red):

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

Section A.2.2

LRM-100

Change (changes in red):

drive_strength ::=

  ( strength0 , strength1 )

| ( strength1 , strength0 )

| ( strength0 , highz1 )

| ( strength1 , highz0 )

| ( highz0 , strength1 )

| ( highz1 , strength0 )

Section A.2.3

LRM-100

Change (changes in red):

list_of_tf_port_identifiers ::= port_identifier { unpacked_dimension } [ = expression ]

{ , port_identifier { unpacked_dimension } [ = expression ] }

LRM-72

Change (changes in red):

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

Section A.2.4

LRM-90

Change (changes in red):

const_assignment ::= const_identifier = constant_expression

LRM-101

Change (changes in red):

defparam_assignment ::= hierarchical_parameter_identifier = constant_mintypmax_expression

LRM-92

Change (changes in red):

net_decl_assignment ::= net_identifier  { unpacked_dimension } = expression

LRM-59 LRM-61LRM-65 LRM-97

Change (changes in red):

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

Section A.2.6

LRM-45

Change (changes in red):

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

LRM-40 LRM-58 LRM-96 LRM-98

Change (changes in red):

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 ]

LRM-40

Change (changes in red):

 

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 }

LRM-65

Change (changes in red):

 

named_function_proto::= [ signing ] function_data_type function_identifier (  [ list_of_tf_proto_formals list_of_function_proto_formals ] )

LRM-40 LRM-65

Change (changes in red):

 

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

Section A.2.7

LRM-40 LRM-58 LRM-96 LRM-98

Change (changes in red):

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 }

LRM-40 LRM-45

Change (changes in red):

 

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

LRM-45 LRM-100

Change (changes in red):

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

LRM-40 LRM-65

Change (changes in red):

 

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

Section A.2.8

LRM-58 LRM-96

Changes cancelled out resulting in no change.

LRM-77

Change (changes in red):

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}

Section A.2.9

LRM-72

Change (changes in red):

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

Section A.2.10

LRM-100

Change (changes in red):

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

Section A.2.11 (New)

LRM-61 LRM-65

Change (changes in red):

A.2.11 Covergroup declarations

 

covergroup_declaration ::= covergroup  covergroup_identifier