Section A.1.2

LRM-270

Changes (changes in red and blue):

config_declaration ::=

config config_identifier ;

design_statement

{ config_rule_statement }

endconfig [ : config_identifier ]

Section A.1.3

LRM-216 LRM-249

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 ) ] ];

[ extends class_type [ ( list_of_arguments ) ] ];

{ class_item }

endclass [ : class_identifier]

LRM-207 LRM-249

Changes (add ;) (changes in red and blue):

package_declaration ::=

{ attribute_instance } package package_identifier ;

[ timeunits_declaration ] { { attribute_instance } package_item }

endpackage [ : package_identifier ]

Section A.1.4

LRM-243

Changes (remove tab before production) (changes in red and blue):

list_of_port_declarations28 ::=

( [ { attribute_instance} ansi_port_declaration

{ , { attribute_instance} ansi_port_declaration } ] )

 

non_generic_port_declaration port_declaration ::=

  { attribute_instance } inout_declaration

| { attribute_instance } input_declaration

| { attribute_instance } output_declaration

| { attribute_instance } ref_declaration

| { attribute_instance } interface_port_declaration

LRM-243

Changes (changes in red and blue):

port_declaration ::=

  non_generic_port_declaration

| { attribute_instance } generic_interface_port_declaration

 

ansi_port_declaration ::=

  port_declaration

| port_type list_of_port_identifiers

 

port_direction ::=  input | output | inout | ref

 

net_port_header ::=  [ port_direction ] port_type

 

variable_port_header ::= [ port_direction ]  data_type

 

interface_port_header ::=

  interface_identifier  [ . modport_identifier ]

| interface  [ . modport_identifier ]

 

ansi_port_declaration ::=

  [ net_port_header | interface_port_header ] port_identifier { unpacked_dimension }

| [ variable_port_header ] port_identifier variable_dimension [ = constant_expression ]

| [ net_port_header | variable_port_header  ] . port_identifier ( [ expression ] )

Section A.1.5

LRM-242

Changes (changes in red and blue):

module_common_item ::=

  module_or_generate_item_declaration

| interface_instantiation

| program_instantiation

| concurrent_assertion_item

| bind_directive

| continuous_assign

| net_alias

| initial_construct

| final_construct

| always_construct

| combinational_construct

| latch_construct

| ff_construct

| ;

LRM-243

Changes (changes in red and blue):

module_item ::=

  non_generic_port_declaration port_declaration ;

| non_port_module_item

LRM-270

Changes (changes in red and blue):

module_or_generate_item_declaration ::=

  package_or_generate_item_declaration

| genvar_declaration

| clocking_declaration

| default clocking clocking_identifier ;

Section A.1.6

LRM-243

Changes (changes in red and blue):

interface_item ::=

  non_generic_port_declaration port_declaration ;

| non_port_interface_item

Section A.1.7

LRM-242 LRM-250

Changes (changes in red and blue):

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_declaration19

| class_declaration

Section A.1.8

LRM-250

Changes (changes in red and blue):

class_method ::=

  { method_qualifier } task_declaration

| { method_qualifier } function_declaration

| extern { method_qualifier } method_prototype

| { method_qualifier } class_constructor_declaration

| extern { method_qualifier } class_constructor_prototype

 

class_constructor_prototype ::=

function new ( [ tf_port_list ] ) ;

LRM-249

Changes (changes in red and blue):

extern_method_declaration ::=

  function [ lifetime ] class_identifier :: function_body_declaration

| task [ lifetime ] class_identifier :: task_body_declaration

LRM-250

Changes (changes in red and blue):

class_constructor_declaration ::=

function [ class_scope ] new [ ( [ tf_port_list ] ) ]  ;

{ block_item_declaration }

[ super . new [ ( list_of_arguments ) ] ; ]

{ function_statement_or_null }

endfunction [ : new ]

Section A.1.9

LRM-273

Changes (changes in red and blue):

dist_item ::= value_range [ dist_weight ]

  value_range := expression

| value_range :/ expression

 

dist_weight ::=

  := expression
:/ expression

Section A.1.10

LRM-240 LRM-249 LRM-250

Changes (changes in red and blue):

package_item ::=

  package_or_generate_item_declaration

| specparam_declaration

| concurrent_assertion_item_declaration

| anonymous_program

| timeunits_declaration19

 

package_or_generate_item_declaration ::=

  net_declaration

| data_declaration

| task_declaration

| function_declaration

| dpi_import_export

| extern_constraint_declaration

| extern_method_declaration

| class_declaration

| class_constructor_declaration

| parameter_declaration ;

| local_parameter_declaration

| covergroup_declaration

| overload_declaration

| concurrent_assertion_item_declaration

LRM-250

Changes (changes in red and blue):

anonymous_program_item ::=

  task_declaration

| function_declaration

| class_declaration

| class_constructor_declaration

| covergroup_declaration

Section A.2.1.1

LRM-243

Changes (changes in red and blue):

local_parameter_declaration ::=

  localparam [ signing ] { packed_dimension } list_of_param_assignments ;

| localparam data_type_or_implicit list_of_param_assignments ;

 

parameter_declaration ::=

  parameter [ signing ] { packed_dimension } list_of_param_assignments

| parameter data_type_or_implicit list_of_param_assignments

| parameter type list_of_type_assignments

Section A.2.1.2

LRM-243

Changes (changes in red and blue):

inout_declaration ::=

inout [ port_type ] list_of_port_identifiers

 

input_declaration ::=

  input [ port_type ] list_of_port_identifiers

| input data_type list_of_variable_identifiers

 

output_declaration ::=

  output [ port_type ] list_of_port_identifiers

| output data_type list_of_variable_port_identifiers

LRM-243

Changes (changes in red and blue):

generic_interface_port_declaration ::=

  interface list_of_interface_identifiers

| interface . modport_identifier list_of_interface_identifiers

Section A.2.2.1

LRM-243 LRM-249

Changes (changes in red and blue):

data_type_common_item data_type ::=

  integer_vector_type [ signing ] { packed_dimension }

| integer_atom_type [ signing ]

| type_identifier { packed_dimension }

| non_integer_type

| struct_union [ packed [ signing ] ] { struct_union_member { struct_union_member } }

{ packed_dimension }14

| enum [ enum_base_type ] { enum_name_declaration { , enum_name_declaration } }

| string

| chandle

| virtual [ interface ] interface_identifier

| [ class_scope | package_scope ] type_identifier { packed_dimension }

| class_type

| event

| ps_covergroup_identifier

 

data_type ::=

  data_type_common_item

| event

| class_scope_type_identifier

| covergroup_identifier

 

data_type_or_implicit ::=

  data_type

| [ signing ] { packed_dimension }

LRM-249

Changes (changes in red and blue):

class_scope_type_identifier::=

class_scope [ :: type_identifier ]

 

class_scope ::=

class_identifier [ parameter_value_assignment ]

{ :: class_identifier [ parameter_value_assignment ] }

class_scope ::=

class_type ::

 

class_type ::=

ps_class_identifier [ parameter_value_assignment ]

{ :: class_identifier [ parameter_value_assignment ] }

LRM-241

Changes (changes in red and blue):

integer_atom_type ::= byte | shortint | int | longint | integer | time

 

integer_vector_type ::= bit | logic | reg

 

non_integer_type ::= time | shortreal | real | realtime

LRM-243

Changes (changes in red and blue):

port_type ::=

  data_type

| net_type_or_trireg [ signing ] { packed_dimension }

| [ signing ] { packed_dimension }

 

port_type ::=

[ net_type_or_trireg ] [ signing ] { packed_dimension }

LRM-249

Changes (changes in red and blue):

simple_type ::= integer_type | non_integer_type | ps_type_identifier

LRM-246

Changes (changes in red and blue):

struct_union_member29 ::=

{ attribute_instance } data_type { packed_dimension }

data_type_or_void list_of_variable_identifiers ;

| { attribute_instance } void list_of_variable_identifiers ;

 

            data_type_or_void ::= data_type | void

Section A.2.2.3

LRM-247 LRM-249

Changes (changes in red and blue):

delay_value ::=

  unsigned_number

| real_number

| ps_identifier

| time_literal

Section A.2.3

LRM-243

Changes (changes in red and blue):

list_of_modport_port_identifiers ::= port_identifier { , port_identifier }

| . port_identifier ( [ expression ] ) { . port_identifier ( [ expression ] ) }

LRM-243

Changes (changes in red and blue):

list_of_port_identifiers ::= port_identifier { unpacked_dimension }

  { , port_identifier { unpacked_dimension } }

| . port_identifier ( [ expression ] ) { . port_identifier ( [ expression ] ) }

Section A.2.4

LRM-227

Changes (changes in red and blue):

param_assignment ::= parameter_identifier { unpacked_dimension } = constant_param_expression

LRM-249

Changes (changes in red and blue):

dynamic_array_new ::= new [ expression ] [ ( dynamic_array_variable_identifier  expression ) ]

Section A.2.6

LRM-249

Changes (changes in red and blue):

function_data_type6 ::= data_type_common_item | void

 

function_body_declaration ::=

  [ signing ] [ type_or_dimensions ]

[ interface_identifier . | class_scope ] function_identifier ;

{ tf_item_declaration }

{ function_statement_or_null }

  endfunction [ : function_identifier ]

| [ signing ] [ type_or_dimensions ]

[ interface_identifier .  | class_scope ] function_identifier ( [ tf_port_list ] ) ;

{ block_item_declaration }

{ function_statement_or_null }

  endfunction [ : function_identifier ]

LRM-243

Changes (changes in red and blue):

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

 

list_of_tf_proto_formals ::=

{ attribute_instance } tf_proto_formal { , { attribute_instance } tf_proto_formal }

LRM-261

Changes (task should be bold and red)  (changes in red and blue):

dpi_import_export ::=                                                          // from Annex A.2.6

  import "DPI" [ dpi_function_import_property ] [ c_identifier = ] dpi_function_proto ;

| import "DPI" [ dpi_task_import_property ] [ c_identifier = ] dpi_task_proto ;

| export "DPI" [ c_identifier = ] function function_identifier ;

| export "DPI" [ c_identifier = ] task task task_identifier ;

Section A.2.7

LRM-249

Changes (changes in red and blue):

task_body_declaration ::=

  [ interface_identifier . | class_scope ] task_identifier ;

{ tf_item_declaration }

{ statement_or_null }

  endtask [ : task_identifier ]

| [ interface_identifier . | class_scope ] task_identifier ( [ tf_port_list ] ) ;

{ block_item_declaration }

{ statement_or_null }

  endtask [ : task_identifier ]

LRM-243

Changes (changes in red and blue):

tf_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_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 } data_type list_of_tf_variable_identifiers

 

tf_port_item ::=

{ attribute_instance }

[ tf_port_direction ] data_type_or_implicit

port_identifier variable_dimension [ = expression ]

 

tf_input_declaration ::=

  input [ signing ] { packed_dimension } list_of_tf_variable_identifiers

| input data_type list_of_tf_variable_identifiers

 

tf_output_declaration ::=

  output [ signing ] { packed_dimension } list_of_tf_variable_identifiers

| output data_type list_of_tf_variable_identifiers

 

tf_inout_declaration ::=

  inout [ signing ] { packed_dimension } list_of_tf_variable_identifiers

| inout data_type list_of_tf_variable_identifiers

 

tf_ref_declaration ::=

[ const ] ref data_type list_of_tf_variable_identifiers

 

tf_port_direction ::= port_direction | const ref

 

tf_port_declaration ::=

{ attribute_instance } tf_port_direction data_type_or_implicit list_of_tf_variable_identifiers ;

 

named_task_proto ::= task_identifier ( [list_of_tf_proto_formals  tf_port_list ] )

 

task_proto_formal tf_proto_formal ::=

  tf_input_declaration

| tf_output_declaration

| tf_inout_declaration

| tf_ref_declaration

Section A.2.9

LRM-243

Changes (changes in red and blue):

modport_simple_ports_declaration ::=

  input list_of_modport_port_identifiers

| output list_of_modport_port_identifiers

| inout list_of_modport_port_identifiers

| ref [ data_type ] list_of_modport_port_identifiers

 

modport_simple_ports_declaration ::=

port_direction  modport_simple_port { , modport_simple_port }

 

modport_simple_port ::=

  port_identifier

| . port_identifier ( [ expression ] )

Section A.2.10

LRM-240

Changes (changes in red and blue):

concurrent_assertion_item ::= [ block_identifier : ] concurrent_assertion_statement

  concurrent_assert_statement

| concurrent_cover_statement

| concurrent_assertion_item_declaration

 

concurrent_assertion_statement ::=

  assert_property_statement

| assume_property_statement

| cover_property_statement

 

concurrent_assert_statement ::=

[block_identifier:] assert_property_statement

 

concurrent_cover_statement ::=

[block_identifier:] cover_property_statement

LRM-208 LRM-249

Changes (changes in red and blue):

property_instance ::=

ps_property_identifier [ ( [ actual_arg_list ] ) ]

LRM-208

Changes (changes in red and blue):

property_declaration ::=

property property_identifier [ property_formal_list ( [ list_of_formals ] ) ] ;

{ assertion_variable_declaration }

property_spec ;

endproperty [ : property_identifier ]

 

property_formal_list ::=

( formal_list_item { , formal_list_item } )

LRM-278

Changes (changes in red and blue):

property_spec ::=

  [clocking_event ] [ disable iff ( expression ) ] property_expr

| [ disable iff ( expression ) ] multi_clock_property_expr

 

property_expr ::=

  sequence_expr

| ( property_expr )

| not property_expr

| property_expr or property_expr

| property_expr and property_expr

| sequence_expr |-> property_expr

| sequence_expr |=> property_expr

| if ( expression ) property_expr [ else property_expr ]

| property_instance

| clocking_event property_expr

LRM-262 LRM-278

Changes (changes in red and blue):

multi_clock_property_expr ::=

  property_expr

! | multi_clock_sequence

| clocking_event multi_clock_property_expr

| ( multi_clock_property_expr )

| not multi_clock_property_expr

| multi_clock_property_expr or multi_clock_property_expr

| multi_clock_property_expr and multi_clock_property_expr

| multi_clock_sequence |-> multi_clock_property_expr

| multi_clock_sequence |=> multi_clock_property_expr

| if ( expression ) multi_clock_property_expr [ else multi_clock_property_expr ]

| property_instance

LRM-208 LRM-278

Changes (changes in red and blue):

sequence_declaration ::=

sequence sequence_identifier [ sequence_formal_list ( [ list_of_formals ] ) ] ;

{ assertion_variable_declaration }

sequence_spec ;

sequence_expr ;

endsequence [ : sequence_identifier ]

 

sequence_formal_list ::=

( formal_list_item { , formal_list_item } )

LRM-278

Changes (changes in red and blue):

sequence_spec ::=

  multi_clock_sequence

| sequence_expr

LRM-211 LRM-278

Changes (changes in red and blue):

multi_clock_sequence::=

  sequence_expr

| clocking_event multi_clock_sequence

| ( multi_clock_sequence )

| multi_clock_sequence ## multi_clock_sequence

| multi_clock_sequence cycle_delay_range multi_clock_sequence

LRM-208 LRM-278

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

| sequence_instance [ sequence_abbrev ]

| ( sequence_expr {