Section A.1.1

LRM-292

Changes (changes in red and blue):

library_descriptions ::=

  library_declaration

| include_statement

| config_declaration

| ;

Section A.1.2

LRM-292

Changes (changes in red and blue):

config_rule_statement ::=

  default_clause liblist_clause

| inst_clause liblist_clause

| inst_clause use_clause

| cell_clause liblist_clause

| cell_clause use_clause

| ;

Section A.1.3

LRM-292

Changes (changes in red and blue):

description ::=

  module_declaration

| udp_declaration

| interface_declaration

| program_declaration

| package_declaration

| { attribute_instance } package_item

| { attribute_instance } bind_directive

| { attribute_instance } ;

Section A.1.4

LRM-295

Changes (changes in red and blue):

port_reference ::=

  port_identifier [ [ constant_range_expression ] ] constant_select

| { attribute_instance } specparam_declaration

| program_declaration

| module_declaration

| timeunits_declaration19

Section A.1.5

LRM-292

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

| ;

LRM-297

Changes (changes in red and blue):

bind_directive ::=

  bind module_identifier bind_instantiation ;

| bind name_of_instance bind_instantiation ;

  bind hierarchical_identifier constant_select bind_instantiation ;

Section A.1.6

LRM-292

Changes (including ; after method_prototype) (changes in red and blue):

extern_tf_declaration ::=

  extern method_prototype ;

| extern forkjoin task named_task_proto task_prototype ;

Section A.1.8

LRM-292

Changes (changes in red and blue):

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_declaration19

| ;

LRM-292

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

LRM-292

Changes (changes in red and blue):

method_prototype ::=

  task named_task_proto ; task_prototype

| function named_function_proto ; function_prototype

Section A.1.9

LRM-288

Changes (changes in red and blue):

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

 

constraint_block_item ::=

  solve identifier_list before identifier_list ;

| constraint_expression

 

constraint_block ::= { { constraint_block_item } }

 

constraint_expression ::=

  expression_or_dist ;

| expression –> constraint_set

| if ( expression ) constraint_set [ else constraint_set ]

| expression dist { dist_list } ;

| foreach ( array_identifier [ loop_variables ] ) constraint_set

LRM-288

Changes (changes in red and blue):

constraint_prototype ::= [ static ] constraint constraint_identifier ;

 

extern_constraint_declaration ::=

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

Section A.1.10

LRM-292

Changes (changes in red and blue):

package_or_generate_item_declaration ::=

  net_declaration

| data_declaration

| task_declaration

| function_declaration

| dpi_import_export

| extern_constraint_declaration

| class_declaration

| class_constructor_declaration

| parameter_declaration ;

| local_parameter_declaration

| covergroup_declaration

| overload_declaration

| concurrent_assertion_item_declaration

| ;

 

anonymous_program ::= program ; { anonymous_program_item } endprogram

 

anonymous_program_item ::=

  task_declaration

| function_declaration

| class_declaration

| covergroup_declaration

| class_constructor_declaration

| ;

Section A.2.5

LRM-295

Changes (changes in red and blue):

unpacked_dimension ::=

  [ dimension_constant_expression : dimension_constant_expression constant_range ]

| [ dimension_constant_expression constant_expression ]

 

packed_dimension12 ::=

  [dimension_constant_expression : dimension_constant_expression constant_range ]

| unsized_dimension

 

range ::= [ msb_constant_expression : lsb_constant_expression ]

Section A.2.6

LRM-292

Changes (changes in red and blue):

function_data_type6 ::= data_type | void

 

function_data_type_or_implicit ::=

  function_data_type

| [ signing ] { packed_dimension }

 

function_body_declaration ::=

  [ signing ] [ type_or_dimensions ] function_data_type_or_implicit

  [ interface_identifier . | class_scope ] function_identifier ;

  { tf_item_declaration }

  { function_statement_or_null }

  endfunction [ : function_identifier ]

| [ signing ] [ type_or_dimensions ] function_data_type_or_implicit

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

  { block_item_declaration }

  { function_statement_or_null }

  endfunction [ : function_identifier ]

 

function_declaration ::=

function [ lifetime ] function_body_declaration

 

named_function_proto function_prototype::= [ signing ] function function_data_type function_identifier ( [ tf_port_list ] )

 

type_or_dimensions ::=

  packed_dimension { packed_dimension }

| function_data_type

LRM-292

Changes (changes in red and blue):

dpi_function_proto9,10 ::= function named_function_proto function_prototype

 

dpi_task_proto10 ::= task named_task_proto task_prototype

Section A.2.7

LRM-292

Changes (changes in red and blue):

named_task_proto task_prototype ::= task task_identifier ( [ tf_port_list ] )

Section A.2.9

LRM-292

Changes (changes in red and blue):

modport_tf_ports_declaration ::=

import_export modport_tf_port { ,  modport_tf_port }

 

modport_tf_port ::=

  task named_task_proto { , named_task_proto }

| function named_function_proto { , named_function_proto }

  method_prototype

| tf_identifier { , tf_identifier }

Section A.2.10

LRM-285

Changes (changes in red and blue):

property_spec ::=

  [clocking_event ] [ disable iff (expression expression_or_dist) ] 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 expression_or_dist ) property_expr [ else property_expr ]

| property_instance

| clocking_event property_expr

LRM-285

Changes (changes in red and blue):

sequence_match_item ::=

 variable_assignment operator_assignment

| inc_or_dec_expression

| subroutine_call

LRM-288

Changes (changes in red and blue):

expression_or_dist ::= expression [ dist { { dist_list } } ]

Section A.2.11

LRM-283

Changes (changes in red and blue):

coverage_event ::=

  clocking_identifier clocking_event

| @@( block_event_expression )

LRM-288

Changes (changes in red and blue):

trans_range_list ::=

  trans_item

| trans_item [ [ * [*  repeat_range ] ]

| trans_item [ [ –> [–> repeat_range ] ]

| trans_item [ [ = [= repeat_range ] ]

LRM-282

Changes (bold {} around open_range_list) (changes in red and blue):

select_condition ::= binsof ( bins_expression ) [ intersect { open_range_list } ]

LRM-282

Changes (changes in red and blue):

open_range_list ::= { open_value_range { , open_value_range } }

Section A.5.2

LRM-292

Changes (changes in red and blue):

udp_port_declaration ::=

  udp_output_declaration ; ;

| udp_input_declaration ; ;

| udp_reg_declaration ; ;

Section A.6.2

LRM-302

Changes (changes in red and blue):

blocking_assignment ::=

variable_lvalue = delay_or_event_control expression

| hierarchical_dynamic_array_variable_identifier = dynamic_array_new

| class_variable_identifier = class_new

| [ implicit_class_handle . | class_scope | package_scope ] hierarchical_variable_identifier select = class_new

| operator_assignment

Section A.6.6

LRM-290

Changes (changes in red and blue):

cond_predicate ::=

expression_or_cond pattern expression_or_cond_pattern { && expression_or_cond_pattern }

Section A.6.9

LRM-282

Changes (formatting problem) (changes in red and blue):

A.6.9 Subroutine call statements

subroutine_call_statement :=

  subroutine_call ;

| void ’ ( function_subroutine_call ) ;

subroutine_call_statement :=

  subroutine_call ;

| void ’ ( function_subroutine_call ) ;

Section A.6.11

LRM-295 LRM-296

Changes (changes in red and blue):

clockvar ::= clocking_identifier . identifier hierarchical_identifier

 

clockvar_expression ::=

  clockvar range

| clockvar [ range_expression ] select

Section A.7.5.1

LRM-292

Changes (changes in red and blue):

$setup_timing_check ::=

$setup ( data_event , reference_event , timing_check_limit [ , [ notify_reg notifier ] ] ) ;

 

$hold_timing_check ::=

$hold ( reference_event , data_event , timing_check_limit [ , [ notify_reg notifier ] ] ) ;

 

$setuphold_timing_check ::=

$setuphold ( reference_event , data_event , timing_check_limit , timing_check_limit

[ , [ notify_reg notifier] [ , [ stamptime_condition ] [ , [ checktime_condition ]

[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;

 

$recovery_timing_check ::=

$recovery ( reference_event , data_event , timing_check_limit [ , [ notify_reg notifier ] ] ) ;

 

$removal_timing_check ::=

$removal ( reference_event , data_event , timing_check_limit [ , [ notify_reg notifier] ] ) ;

 

$recrem_timing_check ::=

$recrem ( reference_event , data_event , timing_check_limit , timing_check_limit

[ , [ notify_reg notifier] [ , [ stamptime_condition ] [ , [ checktime_condition ]

[ , [ delayed_reference ] [ , [ delayed_data ] ] ] ] ] ] ) ;

 

$skew_timing_check ::=

$skew ( reference_event , data_event , timing_check_limit [ , [ notify_reg notifier ] ] ) ;

 

$timeskew_timing_check ::=

$timeskew ( reference_event , data_event , timing_check_limit

[ , [ notify_reg notifier ] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;

 

$fullskew_timing_check ::=

$fullskew ( reference_event , data_event , timing_check_limit , timing_check_limit

[ , [ notify_reg notifier] [ , [ event_based_flag ] [ , [ remain_active_flag ] ] ] ] ) ;

 

$period_timing_check ::=

$period ( controlled_reference_event , timing_check_limit [ , [ notify_reg notifier] ] ) ;

 

$width_timing_check ::=

$width ( controlled_reference_event , timing_check_limit , threshold [ , [ notify_reg notifier] ] ) ;

 

$nochange_timing_check ::=

$nochange ( reference_event , data_event , start_edge_offset ,

end_edge_offset [ , [ notify_reg notifier ] ] ) ;

Section A.7.5.2

LRM-292

Changes (changes in red and blue):

notify_reg notifier ::= variable_identifier

Section A.8.1

LRM-288

Changes (changes in red and blue):

stream_expression ::=

  expression [ with [ array_range_expression ] ]

| array_identifier [ with [ array_range_expression ] ]

Section A.8.2

LRM-288

Changes (changes in red and blue):

randomize_call ::=

randomize { attribute_instance }

[ ( [ variable_identifier_list | null ] ) ]

[ with { { constraint_block } } ]

Section A.8.3

LRM-295

Changes (changes in red and blue):

base_expression ::= expression

LRM-295

Changes (changes in red and blue):

constant_base_expression ::= constant_expression

LRM-295

Changes (changes in red and blue):

constant_range_expression ::=

  constant_expression

| constant_range_or_indexed_range constant_part_select_range

LRM-295

Changes (changes in red and blue):

constant_range ::= constant_expression : constant_expression

 

constant_range_or_indexed_range constant_part_select_range ::= constant_range | constant_indexed_range

 

constant_indexed_range ::=

  constant_base_expression constant_expression +: width_constant_expression constant_expression

| constant_base_expression constant_expression -: width_constant_expression constant_expression

 

dimension_constant_expression ::= constant_expression

LRM-295

Changes (changes in red and blue):

lsb_constant_expression ::= constant_expression

LRM-295

Changes (changes in red and blue):

msb_constant_expression ::= constant_expression

 

range_expression ::= expression | range_or_indexed_range part_select_range

 

range_or_indexed_range part_select_range ::= constant_range | indexed_range

 

indexed_range ::=

  base_expression expression +: width_constant_expression constant_expression

| base_expression expression -: width_constant_expression constant_expression

 

width_constant_expression ::= constant_expression

Section A.8.4

LRM-295

Changes (changes in red and blue):

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

 

constant_select ::= { [constant_expression ] } [ [ range_or_indexed_range constant_part_select_range ] ]

Section A.10

LRM-292

Changes (and renumber all notes and places used) (changes in red and blue):

6) The signed and unsigned keywords shall not be used within a function data type. Void functions, non integer type functions, unpacked structure or union functions, and functions with a typedef type cannot have a signing declaration.

LRM-291

Changes (changes in red and blue):

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