From: Cliff Cummings (cliffc@sunburst)
Date: Mon Apr 13 1998 - 09:12:25 PDT
BAD MSG:
//Key
/Errata
//Proposed enhancement
//BNF prior to proposed enhancement
//Work-in-progress?
//
A.1 Source text
X-Lines: 818
Content-Type: text/plain; charset="us-ascii"
Content-Length: 37864
X-Status: $$$$
X-UID: 0000000380
Status: RO
ource_text ::= { description }
description ::=
module_declaration
| udp_declaration
module_declaration ::=
module_keyword module_identifier [ list_of_ports ] ; { module_item } endmodule
module_keyword ::= module | macromodule
list_of_ports ::= ( port { , port } )
port ::=
[ port_expression ]
| . port_identifier ( [ port_expression ] )
port_expression ::=
port_reference
| { port_reference { , port_reference } }
port_reference ::=
port_identifier
| port_identifier [ constant_expression ]
| port_identifier [ msb_constant_expression : lsb_constant_expression ]
1995>module_item ::=
1995> module_item_declaration
1995> | parameter_override
1995> | continuous_assign
1995> | gate_instantiation
1995> | udp_instantiation
1995> | module_instantiation
1995> | specify_block
1995> | initial_construct
1995> | always_construct
1998 B01>module_item ::=
1998 B01> ungeneratable_module_item_declaration
1998 B01> | non_generated_module_item
1998 B01> | generated_instantiation
1998 B01> | specify_block
1998 B01>ungeneratable_module_item_declaration ::=
1998 B01> parameter_declaration
1998 B01> | local_parameter_declaration
1998 B01> | input_declaration
1998 B01> | output_declaration
1998 B01> | inout_declaration
1998 B01>non_generated_module_item ::=
1998 B01> generatable_module_item_declaration
1998 B01> | parameter_override
1998 B01> | continuous_assign
1998 B01> | gate_instantiation
1998 B01> | udp_instantiation
1998 B01> | module_instantiation
1998 B01> | initial_construct
1998 B01> | always_construct
1998 B01>generatable_module_item_declaration ::=
1998 B01> net_declaration
1998 B01> | reg_declaration
1998 B01> | integer_declaration
1998 B01> | real_declaration
1998 B01> | time_declaration
1998 B01> | realtime_declaration
1998 B01> | event_declaration
1998 B01> | task_declaration
1998 B01> | function_declaration
module_item_declaration ::=
parameter_declaration
1998 B??> | local_parameter_declaration
| input_declaration
| output_declaration
| inout_declaration
| net_declaration
| reg_declaration
| integer_declaration
| real_declaration
| time_declaration
| realtime_declaration
| event_declaration
| task_declaration
| function_declaration
parameter_override ::= defparam list_of_param_assignments ;
A.2 Declarations
1995>parameter_declaration ::= parameter list_of_param_assignments ;
1998 BE??>parameter_declaration ::= parameter [ range ] list_of_param_assignments ;
list_of_param_assignments ::= param_assignment { , param_assignment }
1998 B??>local_parameter_declaration ::= localparam list_of_local_param_assignments ;
1998 B??>list_of_local_param_assignments ::= param_assignment { , param_assignment }
param_assignment ::= parameter_identifier = constant_expression
1995>input_declaration ::= input [ range ] list_of_port_identifiers ;
1995>output_declaration ::= output [ range ] list_of_port_identifiers ;
1995>inout_declaration ::= inout [ range ] list_of_port_identifiers ;
1998 B19/B09/B14>input_declaration ::= input [ signed ] [ net_type ] [ range ] list_of_port_identifiers ;
1998 B19/B09/B14>output_declaration ::=
1998 B19/B09/B14> output [ signed ] [ net_type ] [ range ] list_of_port_identifiers ;
1998 B19/B09/B14> | output [ signed ] [ reg_type ] [ range ] list_of_reg_port_identifiers ;
1998 B19/B09/B14>inout_declaration ::= inout [ signed ] [ net_type ] [ range ] list_of_port_identifiers ;
list_of_port_identifiers ::= port_identifier { , port_identifier }
1998 B14>list_of_reg_port_identifiers ::= port_identifier [ = constant_expression ] { , port_identifier [ = constant_expression ] }
1995>reg_declaration ::= reg [ range ] list_of_register_identifiers ;
1995>event_declaration ::= event event_identifier { , event_identifier } ;
1995>list_of_real_identifiers ::= real_identifier { , real_identifier }
1995>list_of_register_identifiers ::= register_name { , register_name }
1995>register_name ::=
1995> register_identifier
1995> | memory_identifier [ upper_limit_constant_expression : lower_limit_constant_expression ]
1995>range ::= [ msb_constant_expression : lsb_constant_expression ]
1995>list_of_net_identifiers ::= net_identifier { , net_identifier }
(Question - were multi-dimensional tasks and functions also going to be permitted??? -
NO?! - breaks assignment rule)
(If this BNF is correct for multidimensional arrays, this will also be added to automatic tasks, etc.)
1998 B02/BE??>reg_declaration ::= reg [ signed | unsigned ] [ range ] list_of_regmem_identifiers ;
1998 B02>event_declaration ::= event list_of_event_identifiers ;
1998 B02>list_of_regmem_identifiers ::= register_name | memory_name { , register_name | memory_name }
1998 B02>list_of_register_identifiers ::= register_name { , register_name }
1998 B02/BE??>memory_name ::= memory_identifier [ upper_limit_constant_expression : lower_limit_constant_expression ]
1998 B02>register_name ::= register_identifier [ dimension { , dimension }]
1998 B02>list_of_real_identifiers ::= real_identifier [ dimension { , dimension }] { , real_identifier [ dimension { , dimension }] }
1998 B02>list_of_event_identifiers ::= event_identifier [ dimension { , dimension }] { , event_identifier [ dimension { , dimension }] }
1998 B02>range ::= [ msb_constant_expression : lsb_constant_expression ]
1998 B02>dimension ::= [ dimension_constant_expression : dimension_constant_expression ]
1998 B02>list_of_net_identifiers ::= net_identifier [ dimension { , dimension }] { , net_identifier [ dimension { , dimension }] }
time_declaration ::= time list_of_register_identifiers ;
integer_declaration ::= integer list_of_register_identifiers ;
real_declaration ::= real list_of_real_identifiers ;
realtime_declaration ::= realtime list_of_real_identifiers ;
1995>net_declaration ::=
1995> net_type [ vectored | scalared ] [ range ] [ delay3 ] list_of_net_identifiers ;
1995> | trireg [ vectored | scalared ] [ charge_strength ] [ range ] [ delay3 ]
1995> list_of_net_identifiers ;
1995> | net_type [ vectored | scalared ] [ drive_strength ] [ range ] [ delay3 ]
1998 B19>net_declaration ::=
1998 B19> net_type [ vectored | scalared ] [ signed | unsigned ] [ range ] [ delay3 ] list_of_net_identifiers ;
1998 B19> | trireg [ vectored | scalared ] [ signed | unsigned ] [ charge_strength ] [ range ] [ delay3 ]
1998 B19> list_of_net_identifiers ;
1998 B19> | net_type [ vectored | scalared ] [ signed | unsigned ] [ drive_strength ] [ range ] [ delay3 ]
list_of_net_decl_assignments ;
net_type ::= wire | tri | tri1 | supply0 | wand | triand | tri0 | supply1 | wor | trior
drive_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength0 , highz1 )
| ( strength1 , highz0 )
| ( highz0 , strength1 )
| ( highz1 , strength0 )
strength0 ::= supply0 | strong0 | pull0 | weak0
strength1 ::= supply1 | strong1 | pull1 | weak1
charge_strength ::= ( small ) | ( medium ) | ( large )
delay3 ::= # delay_value | # (delay_value [ , delay_value [ , delay_value ] ] )
delay2 ::= # delay_value | # (delay_value [ , delay_value ] )
delay_value ::= unsigned_number | parameter_identifier | constant_mintypmax_expression
list_of_net_decl_assignments ::= net_decl_assignment { , net_decl_assignment }
net_decl_assignment ::= net_identifier = expression
function_declaration ::=
1995> function [signed] [ range_or_type ] function_identifier ;
1998 B19> function [signed] [ range_or_type ] function_identifier ;
function_item_declaration { function_item_declaration }
statement
endfunction
1998 B??>reg_type ::= reg | integer | real | realtime | time
range_or_type ::= range | integer | real | realtime | time
function_item_declaration ::=
block_item_declaration
| input_declaration
1998 B04>recursive_function_declaration ::=
1998 B04> function [ automatic ] [ range_or_type ] function_identifier ;
1998 B04> recursive_function_item_declaration { function_item_declaration }
1998 B04> statement
1998 B04> endfunction
1998 B04>range_or_type ::= range | integer | real | realtime | time
1998 B04>recursive_function_item_declaration ::=
1998 B04> automatic_block_item_declaration
1998 B04> | automatic_input_declaration
task_declaration ::=
task task_identifier ;
{ task_item_declaration }
1995> statement_or_null
1998 BE??> statement
endtask
1998 B08>combinational_task_declaration ::=
1998 B08> task combinational_task_identifier ;
1998 B08> { task_item_declaration }
1998 B08> combinational_statement
1998 B08> endtask
1995>>task_argument_declaration ::=
1998 BE??>task_item_declaration ::=
block_item_declaration
1998 BE??> | input_declaration
| output_declaration
| inout_declaration
block_item_declaration ::=
parameter_declaration
1998 BE??> | local_parameter_declaration
| reg_declaration
| integer_declaration
| real_declaration
| time_declaration
| realtime_declaration
| event_declaration
1998 B04>recursive_reentrant_task_declaration ::=
1998 B04> task [ automatic ] task_identifier ;
1998 B04> { recursive_reentrant_task_item_declaration }
1998 B04> statement
1998 B04> endtask
1998 B04>recursive_reentrant_task_item_declaration ::=
1998 B04> automatic_block_item_declaration
1998 B04> | automatic_input_declaration
1998 B04> | automatic_output_declaration
1998 B04> | automatic_inout_declaration
1998 B04>automatic_block_item_declaration ::=
1998 B04> parameter_declaration
1998 B04> | local_parameter_declaration
1998 B04> | automatic_reg_declaration
1998 B04> | automatic_integer_declaration
1998 B04> | automatic_time_declaration
1998 B04> | automatic_real_declaration
1998 B04> | automatic_realtime_declaration
1998 B04> | automatic_event_declaration
1998 B04/B19>automatic_input_declaration ::= input [ automatic ] [ signed ] list_of_port_identifiers ;
1998 B04/B19>automatic_output_declaration ::= output [ automatic ] [ signed ] list_of_port_identifiers ;
1998 B04/B19>automatic_inout_declaration ::= inout [ automatic ] [ signed ] list_of_port_identifiers ;
1998 B04/B19>automatic_reg_declaration ::= reg [ automatic ] [ signed | unsigned ] [range] list_of_regmem_identifiers ;
1998 B04>automatic_integer_declaration ::= integer [ automatic ] list_of_register_identifiers ;
1998 B04>automatic_time_declaration ::= time [ automatic ] list_of_register_identifiers ;
1998 B04>automatic_real_declaration ::= real [ automatic ] list_of_real_identifiers ;
1998 B04>automatic_realtime_declaration ::= realtime [ automatic ] list_of_real_identifiers ;
1998 B04>automatic_event_declaration ::= event [ automatic ] list_of_event_identifiers ;
A.3 Primitive instances
gate_instantiation ::=
n_input_gatetype [drive_strength] [delay2] n_input_gate_instance { , n_input_gate_instance } ;
| n_output_gatetype [drive_strength] [delay2] n_output_gate_instance { , n_output_gate_instance } ;
| enable_gatetype [drive_strength] [delay3] enable_gate_instance { , enable_gate_instance } ;
| mos_switchtype [delay3] mos_switch_instance { , mos_switch_instance } ;
| pass_switchtype pass_switch_instance { , pass_switch_instance } ;
1995> | pass_en_switchtype [delay3] pass_en_switch_instance { , pass_en_switch_instance } ;
1998 BE??> | pass_en_switchtype [delay2] pass_enable_switch_instance { , pass_en_switch_instance } ;
| cmos_switchtype [delay3] cmos_switch_instance { , cmos_switch_instance } ;
| pullup [pullup_strength] pull_gate_instance { , pull_gate_instance } ;
| pulldown [pulldown_strength] pull_gate_instance { , pull_gate_instance } ;
n_input_gate_instance ::= [name_of_gate_instance] ( output_terminal , input_terminal { , input_terminal } )
n_output_gate_instance ::= [name_of_gate_instance] ( output_terminal , { output_terminal } , input_terminal )
enable_gate_instance ::= [name_of_gate_instance] ( output_terminal , input_terminal , enable_terminal )
mos_switch_instance ::= [name_of_gate_instance] ( output_terminal , input_terminal , enable_terminal )
pass_switch_instance ::= [name_of_gate_instance] ( inout_terminal , inout_terminal )
pass_enable_switch_instance ::= [name_of_gate_instance] ( inout_terminal , inout_terminal , enable_terminal )
cmos_switch_instance ::= [name_of_gate_instance] ( output_terminal , input_terminal ,
ncontrol_terminal , pcontrol_terminal)
pull_gate_instance ::= [name_of_gate_instance] (output_terminal )
name_of_gate_instance ::= gate_instance_identifier [range]
pullup_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength1 )
pulldown_strength ::=
( strength0 , strength1 )
| ( strength1 , strength0 )
| ( strength0 )
input_terminal ::= scalar_expression
enable_terminal ::= scalar_expression
ncontrol_terminal ::= scalar_expression
pcontrol_terminal ::= scalar_expression
output_terminal ::= terminal_identifier | terminal_identifier [ constant_expression ]
inout_terminal ::= terminal_identifier | terminal_identifier [ constant_expression ]
n_input_gatetype ::= and | nand | or | nor | xor | xnor
n_output_gatetype ::= buf | not
enable_gatetype ::= bufif0 | bufif1 | notif0 | notif1
mos_switchtype ::= nmos | pmos | rnmos | rpmos
pass_switchtype ::= tran | rtran
pass_en_switchtype ::= tranif0 | tranif1 | rtranif1 | rtranif0
cmos_switchtype ::= cmos | rcmos
<p>1995>A.4 Module instantiation
1998 B01>A.4 Module and generated instantiation
module_instantiation ::=
module_identifier [ parameter_value_assignment ] module_instance { , module_instance } ;
1995>parameter_value_assignment ::= # ( expression { , expression } )
1998 B06>parameter_value_assignment ::= # ( list_of_parameter_assignments )
1998 B06>list_of_parameter_assignments ::=
1998 B06> ordered_parameter_assignment { , ordered_parameter_assignment } |
1998 B06> named_parameter_assignment { , named_parameter_assignment }
1998 B06>ordered_parameter_assignment ::= expression
1998 B06>named_parameter_assignment ::= . parameter_identifier ( [expression] )
module_instance ::= name_of_instance ( [list_of_module_connections] )
name_of_instance ::= module_instance_identifier [ range ]
list_of_module_connections ::=
ordered_port_connection { , ordered_port_connection }
| named_port_connection { , named_port_connection }
ordered_port_connection ::= [ expression ]
named_port_connection ::= .port_identifier ( [ expression ] )
1998 B01>genvar_declaration ::= genvar list_of_genvar_identifiers ;
1998 B01>list_of_genvar_identifiers ::=
1998 B01> genvar_identifier { , genvar_identifier }
1998 B01>generated_instantiation ::= generate { generate_item } endgenerate
1998 B01>generate_item_or_null ::= generate_item | ;
1998 B01>generate_item ::=
1998 B01> generate_conditional_statement
1998 B01> | generate_case_statement
1998 B01> | generate_loop_statement
1998 B01> | generate_block
1998 B01> | non_generated_module_item
1998 B01>generate_conditional_statement ::=
1998 B01> if ( genvar_expression ) generate_item_or_null [ else generate_item_or_null ]
1998 B01>generate_case_statement ::= case ( genvar_expression )
1998 B01>genvar_case_item { genvar_case_item } endcase
1998 B01>genvar_case_item ::= genvar_expression { , genvar_expression } :
1998 B01> generate_item_or_null | default [ : ] generate_item_or_null
1998 B01>generate_loop_statement ::= for ( genvar_assignment ; genvar_expression ; genvar_assignment ) generate_item
1998 B01>genvar_assignment ::= genvar_identifier = genvar_expression
1998 B01>generate_block ::= begin [ : generate_block_identifier ] { generate_item } end
A.5 UDP declaration and instantiation
udp_declaration ::=
primitive udp_identifier ( udp_port_list ) ;
udp_port_declaration { udp_port_declaration }
udp_body
endprimitive
udp_port_list ::= output_port_identifier , input_port_identifier { , input_port_identifier }
udp_port_declaration ::=
1995> output_declaration
1995> | input_declaration
1995> | reg_declaration
1998 BE??> udp_output_declaration
1998 BE??> | udp_input_declaration
1998 BE??> | udp_reg_declaration
udp_body ::= combinational_body | sequential_body
combinational_body ::= table combinational_entry { combinational_entry } endtable
combinational_entry ::= level_input_list : output_symbol ;
sequential_body ::= [ udp_initial statement ] table sequential_entry { sequential_entry } endtable
udp_initial statement ::= initial udp_output_port_identifier = init_val ;
init_val ::= 1'b0 | 1'b1 | 1'bx | 1'bX | 1'B0 | 1'B1 | 1'Bx | 1'BX | 1 | 0
sequential_entry ::= seq_input_list : current_state : next state ;
seq_input_list ::= level_input_list | edge_input_list
level_input_list ::= level_symbol { level_symbol }
edge_input_list ::= { level_symbol } edge_indicator { level_symbol }
edge_indicator ::= ( level_symbol level_symbol ) | edge_symbol
current_state ::= level_symbol
next state ::= output_symbol | -
output_symbol ::= 0 | 1 | x | X
level_symbol ::= 0 | 1 | x | X | ? | b | B
edge_symbol ::= r | R | f | F | p | P | n | N | *
udp_instantiation ::= udp_identifier [ drive_strength ] [ delay2 ] udp_instance { , udp_instance } ;
udp_instance ::= [ name_of_udp_instance ] ( output_port_connection , input_port_connection
{ , input_port_connection } )
name_of_udp_instance ::= udp_instance_identifier [ range ]
A.6 Behavioral statements
continuous_assign ::= assign [drive_strength] [delay3] list_of_net_assignments ;
list_of_net_assignments ::= net_assignment { , net_assignment }
net_assignment ::= net_lvalue = expression
initial_construct ::= initial statement
always_construct ::= always statement
1998 B08>always_combinational_construct ::= always @* combinational_statement
tatement ::=
blocking_assignment ;
1995> | non_blocking assignment ;
1998 BE41> | non_blocking_assignment ;
| procedural_continuous_assignments ;
| procedural_timing_control_statement
| conditional_statement
| case_statement
| loop_statement
| wait_statement
| disable_statement
| event_trigger
| seq_block
| par_block
| task_enable
| system_task_enable
tatement_or_null ::= statement | ;
1995>blocking assignment ::= reg_lvalue = [ delay_or_event_control ] expression
1995>non-blocking assignment ::= reg_lvalue <= [ delay_or_event_control ] expression
1998 BE41>blocking_assignment ::= reg_lvalue = [ delay_or_event_control ] expression
1998 BE41>non_blocking_assignment ::= reg_lvalue <= [ delay_or_event_control ] expression
procedural_continuous_assignments ::=
1995> | assign reg_assignment ;
1998 BE41> assign reg_assignment ;
| deassign reg_assignment ;
| force reg_assignment ;
| force net_assignment ;
| release reg_lvalue ;
| release net_lvalue ;
procedural_timing_control_statement ::=
delay_or_event_control statement_or_null
1998 B08>combinational_statement ::=
1998 B08> combinational_blocking_assignment ;
1998 B08> | combinational_non_blocking_assignment ;
1998 B08> | combinational_procedural_timing_control_statement
1998 B08> | combinational_conditional_statement
1998 B08> | combinational_case_statement
1998 B08> | combinational_loop_statement
1998 B08> | disable_statement
1998 B08> | combinational_seq_block
1998 B08> | combinational_task_enable
1998 B08> | combinational_system_task_enable
1998 B08>combinational_blocking_assignment ::= reg_lvalue = [ delay_control ] expression
1998 B08>combinational_non_blocking_assignment ::= reg_lvalue <= [ delay_control ] expression
1998 B08>combinational_procedural_timing_control_statement ::=
1998 B08> delay_control combinational_statement_or_null
1998 BE??>function_statement ::=
1998 BE??> function_blocking_assignment ;
1998 BE??> | function_non_blocking_assignment ;
1998 BE??> | function_conditional_statement
1998 BE??> | function_case_statement
1998 BE??> | function_loop_statement
1998 BE??> | disable_statement
1998 BE??> | combinational_seq_block
1998 BE??> | combinational_system_task_enable
1998 BE??>function_blocking_assignment ::= reg_lvalue = expression
1998 BE??>function_non_blocking_assignment ::= reg_lvalue <= [ delay_control ] expression
1998 BE??>function_statement_or_null ::= function_statement | ;
delay_or_event_control ::=
delay_control
| event_control
| repeat ( expression ) event_control
delay_control ::=
# delay_value
| # ( mintypmax_expression )
event_control ::=
@ event_identifier
| @ ( event_expression )
event_expression ::=
expression
| event_identifier
| posedge expression
| negedge expression
| event_expression or event_expression
1998 B07> | event_expression , event_expression
conditional_statement ::=
1995> | if ( expression ) statement_or_null [ else statement_or_null ]
1998 BE41> if ( expression ) statement_or_null [ else statement_or_null ]
case_statement ::=
1995> | case ( expression ) case_item [ case_item ] endcase
1998 BE41> case ( expression ) case_item [ case_item ] endcase
| casez ( expression ) case_item [ case_item ] endcase
| casex ( expression ) case_item [ case_item ] endcase
case_item ::=
expression { , expression } : statement_or_null
| default [ : ] statement_or_null
loop_statement ::=
1995> | forever statement
1998 BE10> forever statement
| repeat ( expression ) statement
| while ( expression ) statement
| for ( reg_assignment ; expression ; reg_assignment ) statement
1998 B08>combinational_conditional_statement ::=
1998 B08> if ( expression ) combinational_statement_or_null [ else combinational_statement_or_null ]
1998 B08>combinational_case_statement ::=
1998 B08> case ( expression ) case_item [ combinational_case_item ] endcase
1998 B08> | casez ( expression ) case_item [ combinational_case_item ] endcase
1998 B08> | casex ( expression ) case_item [ combinational_case_item ] endcase
1998 B08>combinational_case_item ::=
1998 B08> expression { , expression } : combinational_statement_or_null
1998 B08> | default [ : ] combinational_statement_or_null
1998 B08>combinational_loop_statement ::=
1998 B08> forever combinational_statement
1998 B08> | repeat ( expression ) combinational_statement
1998 B08> | while ( expression ) combinational_statement
1998 B08> | for ( reg_assignment ; expression ; reg_assignment ) combinational_statement
1998 B08>combinational_seq_block ::= begin [ : block_identifier { block_item_declaration } ] { combinational_statement } end
1998 B08>combinational_task_enable ::= combinational_task_identifier [ ( expression { , expression } ) ] ;
1998 BE??>function_conditional_statement ::=
1998 BE??> if ( expression ) function_statement_or_null [ else function_statement_or_null ]
1998 BE??>function_case_statement ::=
1998 BE??> case ( expression ) case_item [ function_case_item ] endcase
1998 BE??> | casez ( expression ) case_item [ function_case_item ] endcase
1998 BE??> | casex ( expression ) case_item [ function_case_item ] endcase
1998 BE??>function_case_item ::=
1998 BE??> expression { , expression } : function_statement_or_null
1998 BE??> | default [ : ] function_statement_or_null
1998 BE??>function_loop_statement ::=
1998 BE??> forever function_statement
1998 BE??> | repeat ( expression ) function_statement
1998 BE??> | while ( expression ) function_statement
1998 BE??> | for ( reg_assignment ; expression ; reg_assignment ) function_statement
1998 BE??>function_seq_block ::= begin [ : block_identifier { block_item_declaration } ] { function_statement } end
reg_assignment ::= reg_lvalue = expression
wait_statement ::=
1995> | wait ( expression ) statement_or_null
1998 BE41> wait ( expression ) statement_or_null
event_trigger ::=
1995> | -> event_identifier ;
1998 BE41> -> event_identifier ;
disable_statement ::=
1995> | disable task_identifier ;
1998 BE41> disable task_identifier ;
| disable block_identifier ;
seq_block ::= begin [ : block_identifier { block_item_declaration } ] { statement } end
par_block ::= fork [ : block_identifier { block_item_declaration } ] { statement } join
task_enable ::= task_identifier [ ( expression { , expression } ) ] ;
system_task_enable ::= system_task_name [ ( expression { , expression } ) ] ;
system_task_name ::= $identifier Note: The $ may not be followed by a space.
A.7 Specify section
pecify_block ::= specify { specify_item } endspecify ;
specify_item ::=
specparam_declaration
| path_declaration
| system_timing_check
specparam_declaration ::= specparam list_of_specparam_assignments ;
list_of_specparam_assignments ::= specparam_assignment { , specparam_assignment }
specparam_assignment ::=
specparam_identifier = constant_expression
| pulse_control_specparam
pulse_control_specparam ::=
PATHPULSE$ = ( reject_limit_value [ , error_limit_value ] ) ;
| PATHPULSE$specify_input_terminal_descriptor$specify_output_terminal_descriptor
= ( reject_limit_value [ , error_limit_value ] ) ;
limit_value ::= constant_mintypmax_expression
path_declaration ::=
simple_path_declaration ;
| edge_sensitive_path_declaration ;
1995> | state-dependent_path_declaration ;
1998 BE41> | state_dependent_path_declaration ;
simple_path_declaration ::=
parallel_path_description = path_delay_value
| full_path_description = path_delay_value
parallel_path_description ::=
( specify_input_terminal_descriptor [ polarity_operator ] => specify_output_terminal_descriptor )
full_path_description
( list_of_path_inputs [ polarity_operator ] *> list_of_path_outputs )
list_of_path_inputs ::=
( specify_input_terminal_descriptor { , specify_input_terminal_descriptor }
list_of_path_outputs ::=
( specify_output_terminal_descriptor { , specify_output_terminal_descriptor }
specify_input_terminal_descriptor ::=
input_identifier
| input_identifier [ constant_expression ]
| input_identifier [ msb_constant_expression : lsb_constant_expression ]
specify_output_terminal_descriptor ::=
output_identifier
| output_identifier [ constant_expression ]
| output_identifier [ msb_constant_expression : lsb_constant_expression ]
input_identifier ::= input_port_identifier | inout_port_identifier
output_identifier ::= output_port_identifier | inout_port_identifier
polarity_operator ::= + | -
path_delay_value ::=
list_of_path_delay_expressions
| ( list_of_path_delay_expressions )
list_of_path_delay_expressions ::=
t_path_delay_expression
| trise_path_delay_expression , tfall_path_delay_expression
| trise_path_delay_expression , tfall_path_delay_expression , tz_path_delay_expression
| t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression
| t01_path_delay_expression , t10_path_delay_expression , t0z_path_delay_expression ,
tz1_path_delay_expression , t1z_path_delay_expression , tz0_path_delay_expression
t0x_path_delay_expression , tx1_path_delay_expression , t1x_path_delay_expression ,
tx0_path_delay_expression , txz_path_delay_expression , tzx_path_delay_expression
path_delay_expression ::= constant_mintypmax_expression
edge_sensitive_path_declaration ::=
parallel_edge_sensitive_path_description = path_delay_value
| full_edge_sensitive_path_description = path_delay_value
parallel_edge_sensitive_path_description ::=
( [ edge_identifier ] specify_input_terminal_descriptor =>
1995> specify_output_terminal_descriptor [ polarity_operator ] : data_source_expression ) )
1998 BE??> specify_output_terminal_descriptor [ polarity_operator ] : data_source_expression )
full_edge_sensitive_path_description ::=
( [ edge_identifier ] list_of_path_inputs *>
1995> list_of_path_inputs [ polarity_operator ] : data_source_expression ) )
1998 BE??> list_of_path_inputs [ polarity_operator ] : data_source_expression )
data_source_expression ::= expression
edge_identifier ::= posedge | negedge
state_dependent_path_declaration ::=
if ( conditional_expression ) simple_path_declaration
| if ( conditional_expression ) edge_sensitive_path_declaration
| ifnone simple_path_declaration
ystem_timing_check ::=
$setup ( timing_check_event , timing_check_event , timing_check_limit [ , notify_register ] ) ;
| $hold ( timing_check_event , timing_check_event , timing_check_limit [ , notify_register ] ) ;
| $period ( controlled_timing_check_event , timing_check_limit [ , notify_register ] ) ;
| $width ( controlled_timing_check_event , timing_check_limit ,
constant_expression [ , notify_register ] ) ;
| $skew ( timing_check_event , timing_check_event , timing_check_limit [ , notify_register ] ) ;
| $recovery ( controlled_timing_check_event , timing_check_event ,
timing_check_limit [ , notify_register ] ) ;
| $setuphold ( timing_check_event , timing_check_event , timing_check_limit ,
timing_check_limit [ , notify_register ] ) ;
1998 BE02> | $nochange ( reference_event , data_event , start_edge_offset ,
1998 BE02> end_edge_offset [ , notify_register ] ) ;
timing_check_event ::=
[timing_check_event_control] specify_terminal_descriptor [ &&& timing_check_condition ]
specify_terminal_descriptor ::=
specify_input_terminal_descriptor
| specify_output_terminal_descriptor
controlled_timing_check_event ::=
timing_check_event_control specify_terminal_descriptor [ &&& timing_check_condition ]
timing_check_event_control ::=
posedge
| negedge
| edge_control_specifier
edge_control_specifier ::= edge [ edge_descriptor [ , edge_descriptor ] ]
edge_descriptor ::=
01
| 10
| 0x
| x1
| 1x
| x0
timing_check_condition ::=
scalar_timing_check_condition
| ( scalar_timing_check_condition )
scalar_timing_check_condition ::=
expression
| ~ expression
| expression == scalar_constant
| expression === scalar_constant
| expression != scalar_constant
| expression !== scalar_constant
timing_check_limit ::= expression
scalar_constant ::=
1'b0 | 1'b1 | 1'B0 | 1'B1 | 'b0 | 'b1 | 'B0 | 'B1 | 1 | 0
notify_register ::= register_identifier
A.8 Expressions
1998 B01>genvar_expression ::=
1998 B01> genvar_primary
1998 B01> | unary_operator genvar_primary
1998 B01> | genvar_expression binary_operator genvar_expression
1998 B01> | genvar_expression ? genvar_expression : genvar_expression
1998 B01> | string
1998 B01>genvar_primary ::=
1998 B01> constant_primary
1998 B01> | genvar_identifier
1998 B01> | genvar_identifier [ genvar_expression ]
1998 B01> | genvar_identifier [ msb_constant_expression : lsb_constant_expression ]
1998 B01> | genvar_concatenation | genvar_multiple_concatenation
1998 B01> | genvar_function_call
1998 B01>genvar_function_call ::= genvar_function_identifier ( genvar_expression { , genvar_expression } )
net_lvalue ::=
net_identifier
| net_identifier [ expression ]
| net_identifier [ msb_constant_expression : lsb_constant_expression ]
| net_concatenation
reg_lvalue ::=
reg_identifier
| reg_identifier [ expression ]
| reg_identifier [ msb_constant_expression : lsb_constant_expression ]
| reg_concatenation
constant_expression ::=
constant_primary
| unary_operator constant_primary
| constant_expression binary_operator constant_expression
| constant_expression ? constant_expression : constant_expression
| string
constant_primary ::=
number
| parameter_identifier
| constant_concatenation
| constant_multiple_concatenation
1998 B21??> | constant_function_call
constant_mintypmax_expression ::=
constant_expression
| constant_expression : constant_expression : constant_expression
mintypmax_expression ::=
expression
| expression : expression : expression
expression ::=
primary
| unary_operator primary
| expression binary_operator expression
| expression ? expression : expression
| string
unary_operator ::=
+ | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~
1995>binary_operator ::=
1995> + | - | * | / | % | == | != | === | !== | && | ||
1995> | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | <<
1998 B19>binary_operator ::=
1998 B19/B27> + | - | * | / | % | == | != | === | !== | && | || | **
1998 B19> | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<<
1995>primary ::=
1995> number
1995> | identifier
1995> | identifier [ expression ]
1995> | identifier [ msb_constant_expression : lsb_constant_expression ]
1995> | concatenation
1995> | multiple_concatenation
1995> | function_call
1995> | ( mintypmax_expression )
1998 B02>primary ::=
1998 B02> number
1998 B02> | identifier
1998 B02> | identifier [ expression ] { [ expression ] }
1998 B02> | identifier [ expression ] { [ expression ] } [ [ msb_constant_expression : lsb_constant_expression ] ]
1998 B02> | identifier [ msb_constant_expression : lsb_constant_expression ]
1998 B02> | concatenation
1998 B02> | multiple_concatenation
1998 B02> | function_call
1998 B02> | constant_function_call
1998 B02> | ( mintypmax_expression )
number ::=
decimal_number
| octal_number
| binary_number
| hex_number
| real_number
1995>real_number ::=
1995> [ sign ] unsigned_number . unsigned_number
1995> | [ sign ] unsigned_number [ . unsigned_number ] e [ sign ] unsigned_number
1995> | [ sign ] unsigned_number [ . unsigned_number ] e [ sign ] unsigned_number
1998 BE08/BE35>real_number1 ::=
1998 BE08/BE35> unsigned_number . unsigned_number
1998 BE08/BE35> | unsigned_number [ . unsigned_number ] e [ sign ] unsigned_number
1998 BE08/BE35> | unsigned_number [ . unsigned_number ] E [ sign ] unsigned_number
1995>decimal_number ::=
1995> [ sign ] unsigned_number
1995> | [ size ] decimal_base unsigned_number
1995>binary_number ::= [ size ] binary_base binary_digit { _ | binary_digit }
1995>octal_number ::= [ size ] octal_base octal_digit { _ | octal_digit }
1995>hex_number ::= [ size ] hex_base hex_digit { _ | hex_digit }
1998 BE08>decimal_number ::=
1998 BE08/BE35> unsigned_number
1998 BE08> | [ size ] decimal_base unsigned_number
1998 BE??> | [ size ] decimal_base xz_digit { _ | xz_digit }
1998 BE08>binary_number ::= [ size ] binary_base binary_value
1998 BE08>octal_number ::= [ size ] octal_base octal_value
1998 BE08>hex_number ::= [ size ] hex_base hex_value
sign ::= + | -
size ::= unsigned_number
1995>unsigned_number ::= decimal_digit { _ | decimal_digit }
1998 BE08>unsigned_number1 ::= decimal_digit { _ | decimal_digit }
1998 BE08>binary_value1::= binary_digit { _ | binary_digit }
1998 BE08>octal_value1::= octal_digit { _ | octal_digit }
1998 BE08>hex_value1::= hex_digit { _ | hex_digit }
1995>decimal_base ::= 'd | 'D
1995>binary_base ::= 'b | 'B
1995>octal_base ::= 'o | 'O
1995>hex_base ::= 'h | 'H
1998 BE08>decimal_base1::= 'd | 'D
1998 BE08>binary_base1::= 'b | 'B
1998 BE08>octal_base1::= 'o | 'O
1998 BE08>hex_base1::= 'h | 'H
1998 B19>decimal_base1 ::= '[s|S]d | '[s|S]D
1998 B19>binary_base1 ::= '[s|S]b | '[s|S]B
1998 B19>octal_base1 ::= '[s|S]o | '[s|S]O
1998 B19>hex_base1 ::= '[s|S]h | '[s|S]H
1995>decimal_digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
1995>binary_digit ::= x | X | z | Z | 0 | 1
1995>octal_digit ::= x | X | z | Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
1995>hex_digit ::= x | X | z | Z | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | A | B | C | D | E | F
1998 BE??>decimal_digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | _
1998 BE34>binary_digit ::= x | X | z | Z | ? | 0 | 1 | _
1998 BE34>octal_digit ::= x | X | z | Z | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | _
1998 BE34>hex_digit ::= x | X | z | Z | ? | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | A | B | C | D | E | F | _
1998 B??>xz_digit ::= x | X | z | Z | ?
concatenation ::= { expression { , expression } }
multiple_concatenation ::= { expression { , expression { , expression } } }
function_call ::=
function_identifier ( expression { , expression } )
| name_of_system_function [ ( expression { , expression } ) ]
1998 B??>constant_function_call ::=
1998 B??> function_identifier ( constant_expression { , constant_expression } )
1998 B??> | name_of_system_function [ ( constant_expression { , constant_expression } ) ]
1995>name_of_system_function ::= $identifier
1998 BE08>name_of_system_function2 ::= $identifier
string ::= " { Any_ASCII_Characters_except_new_line } "
NOTES
1- Embedded spaces are illegal
2- The $ in name_of_system_function may not be followed by a space
A.9 General
comment ::=
short_comment
| long_comment
short_comment ::= // comment_text \n
long_comment ::= /* comment_text */
comment_text ::= { Any_ASCII_character }
1995>identifier ::= IDENTIFIER [ { .IDENTIFIER } ]
1995>IDENTIFIER ::=
1995> simple_identifier
1995> | escaped_identifier
1995>simple_identifier ::= [a-zA-Z][a-zA-Z0-9_$]
1998 BE??>identifier ::=
1998 BE??> simple_identifier
1998 BE??> | escaped_identifier
1998 BE01>simple_identifier3 ::= [a-zA-Z_] [ { [a-zA-Z0-9_$] } ]
1998 BE01>arrayed_reference3 ::= [a-zA-Z_] [ { [a-zA-Z0-9_$] } ] [ { [0-9_] } ]
1998 BE??>hierarchical_identifier ::=
1998 BE??> simple_hierarchical_identifier
1998 BE??> | escaped_hierarchical_identifier
1998 BE??>simple_hierarchical_identifier3 ::=
1998 BE??> simple_hierarchical_branch [ .escaped_identifier ]
1998 BE??>escaped_hierarchical_identifier4 ::=
1998 BE??> escaped_hierarchical_branch [ { .simple_hierarchical_branch | .escaped_hierarchical_branch } ]
1998 BE??>simple_hierarchical_branch3 ::=
1998 BE??> simple_identifier [ [ unsigned_number ] ] [ { .simple_identifier [ [ unsigned_number ] ] } ]
1998 BE??>escaped_hierarchical_branch4 ::=
1998 BE??> escaped_identifier [ [ unsigned_number ] ] [ { .escaped_identifier [ [ unsigned_number ] ] } ]
escaped_identifier ::= \ {Any_ASCII_character_except_white_space} white_space
1995>white_space ::= space | tab | newline
1998 BE??>white_space ::= space | tab | newline | eof5
1995>NOTE - The period in identifier may not be preceded or followed by a space
1998 BE??>NOTE
1998 BE??>3 - A simple_identifier and arrayed_reference shall have at least one character and no spaces
1998 BE??>3 - The period in simple_hierarchical_identifier and simple_hierarchical_branch shall not
1998 BE??> be preceded or followed by white_space
1998 BE??>4 - The period in escaped_hierarchical_identifier and escaped_hierarchical_branch shall
1998 BE??> be preceded by white_space but shall not be followed by white_space
1998 BE??>5 - End of file
This archive was generated by hypermail 2.1.4
: Mon Jul 08 2002 - 12:52:48 PDT
and
sponsored by Boyd Technology, Inc.