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  [ ( 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 ]

Section A.3.1

LRM-45

Change (changes in red):

name_of_gate_instance ::= gate_instance_identifier { range unpacked_dimension }

Section A.4.1.1

LRM-39

Change (changes in red):

ordered_parameter_assignment ::= expression | data_type param_expression

 

named_parameter_assignment ::= . parameter_identifier ( [ param_expression ] )

. parameter_identifier ( [expression ] )

| . parameter_identifier ( data_type )

LRM-45

Change (changes in red):

name_of_instance ::= module_instance_identifier { range unpacked_dimension }

LRM-93

Change (changes in red):

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 } .*

Section A.4.4.1

LRM-45

Change (changes in red):

A.4.4.1 A.4.1.3 Program instantiation                                                                               

 

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

Section A.5.4

LRM-45

Change (changes in red):

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

 

name_of_udp_instance ::= udp_instance_identifier { range unpacked_dimension }

Section A.6.1

LRM-100

Change (changes in red):

net_alias ::= alias net_lvalue = net_lvalue { = net_lvalue } ;

Section A.6.2

LRM-59

Change (changes in red):

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

LRM-39

Change (changes in red):

function_blocking_assignment ::= variable_lvalue = expression

LRM-100

Change (changes in red):

variable_assignment ::= variable_lvalue = expresssion

  operator_assignment

| inc_or_dec_expression

Section A.6.3

LRM-39

Change (changes in red):

function_seq_block ::=

begin [ : block_identifier { block_item_declaration } ] { function_statement_or_null }

end [ : block_identifier ]

LRM-58 LRM-96

Changes cancelled out resulting in no change.

Section A.6.4

LRM-66

Change (changes in red):

statement ::= [ block_identifier : ] { attribute_instance } statement_item

LRM-39 LRM-41LRM-62 LRM-63 LRM-66 LRM-73

Change (changes in red):

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 }

Section A.6.5

LRM-73

Change (changes in red):

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

Section A.6.6

LRM-81

Changes (change in red):

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 ]

LRM-39

Change (changes in red):

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 ]

Section A.6.7

LRM-39

Change (changes in red):

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

LRM-66

Change (changes in red):

randcase_statement ::=

randcase randcase_item { randcase_item } endcase

randcase_item ::= expression : statement_or_null

Section A.6.8

LRM-39

Change (changes in red):

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

LRM-44 LRM-100

Change (changes in red):

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

Section A.6.12 (New)

LRM-62

Change (changes in red):

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

Section A.8.1

LRM-42

Change (changes in red):

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

LRM-100

Change (changes in red):

multiple_concatenation ::= { constant_expression expression concatenation }22

LRM-109

Change (changes in red):

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

Section A.8.2

LRM-104

Change (changes in red):

list_of_arguments ::=

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

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

LRM-43

Change (changes in red):

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

 

array_method_call ::=

array_identifier . method_identifier [ ([ iterator_identifier ] ) ] [ with ( expression ) ]

Section A.8.3

LRM-100

Change (changes in red):

conditional_expression ::= expression1 expression ? { attribute_instance } expression2 expression : expression3 expression

LRM-39

Change (changes in red):

constant_param_expression ::=

constant_expression constant_mintypmax_expression  | data_type

 

param_expression ::=  mintypmax_expression  | data_type

LRM-100

Change (changes in red):

expression1 ::= expression

expression2 ::= expression

expression3 ::= expression

LRM-69

Change (changes in red):

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

LRM-105

Change (changes in red):

inside_expression ::= expression inside range_list_or_array { open_range_list }

Section A.8.4

LRM-91

Change (changes in red):

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

LRM-39 LRM-41LRM-69

Change (changes in red):

module_path_primary ::=

  number

| identifier

| module_path_concatenation

| module_path_multiple_concatenation

| function_call

| system_function_call

| constant_function_call

| ( module_path_mintypmax_expression )

LRM-39 LRM-41 LRM-43 LRM-69 LRM-109

Change (changes in red):

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

Section A.9.3

LRM-63 LRM-65

Change (changes in red):

array_identifier ::= identifier

block_identifier ::= identifier

bin_identifier ::= identifier

LRM-59

Change (changes in red):

class_identifier ::= identifier

class_variable_identifier ::= variable_identifier

LRM-65 LRM-90

Change (changes in red):

const_identifier ::= identifier

covergroup_identifier ::= identifier

covergroup_variable_identifier ::= variable_identifier

cover_point_identifier ::= identifier

LRM-101

Change (changes in red):

escaped_hierarchical_identifier4 ::=

escaped_hierarchical_branch { .simple_hierarchical_branch | .escaped_hierarchical_branch }

LRM-101

Change (changes in red):

hierarchical_identifier ::=

                                { identifier { [ constant_expression ] } . } identifier

  simple_hierarchical_identifier

| escaped_hierarchical_identifier

LRM-63

Change (changes in red):

index_identifier ::= identifier

interface_identifier ::= identifier

LRM-59

Change (changes in red):

library_identifier ::= identifier

member_identifier ::= identifier

LRM-101

Change (changes in red):

simple_hierarchical_identifier3 ::= simple_hierarchical_branch [ . escaped_identifier ]

LRM-89

Change (changes in red):

type_declaration_identifier ::= type_identifier { unpacked_dimension }

Section A.9.4

LRM-39 LRM-101

Change (changes in red):

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

Section A Notes

LRM-101

Change and renumber all footnotes and references to footnotes (changes in red):

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.

LRM-45 LRM-77

Change (changes in red):

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.

LRM-45

Change (changes in red):

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.

LRM-59

Add (changes in red):

18) In a data_declaration that is not within the procedural context it shall be illegal to use the automatic keyword.

LRM-65

Add (changes in red):

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.

LRM-93

Add (changes in red):

20) The .* token shall appear at most once in a list of port connections.

LRM-99

Add (changes in red):

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.

LRM-100

Add (changes in red):

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.