~~NOTOC~~
====== BNF ======
===== abstract_literal =====
abstract_literal ::= decimal_literal | based_literal
===== access_type_definition =====
access_type_definition ::= access subtype_indication
===== actual_designator =====
actual_designator ::=
expression
| signal _name
| variable _name
| file _name
| open
===== actual_parameter_part =====
actual_parameter_part ::= parameter _association_list
===== actual_part =====
actual_part ::=
actual_designator
| function _name ( actual_designator )
| type_mark ( actual_designator )
===== adding_operator =====
adding_operator ::= + | - | &
===== aggregate =====
aggregate ::=
( element_association { , element_association } )
===== alias_declaration =====
alias_declaration ::=
alias alias_designator [ : subtype_indication ] is name [ signature ] ;
===== alias_designator =====
alias_designator ::= identifier | character_literal | operator_symbol
===== allocator =====
allocator ::=
new subtype_indication
| new qualified_expression
===== architecture_body =====
architecture_body ::=
architecture identifier of entity _name is
architecture_declarative_part
begin
architecture_statement_part
end [architecture] [ architecture _simple_name ] ;
===== architecture_declarative_part =====
architecture_declarative_part ::=
{ block_declarative_item }
===== architecture_statement_part =====
architecture_statement_part ::=
{ concurrent_statement }
===== array_type_definition =====
array_type_definition ::=
unconstrained_array_definition | constrained_array_definition
===== assertion =====
assertion ::=
assert condition
[ report expression ]
[ severity expression ]
===== assertion_statement =====
assertion_statement ::= [ label : ] assertion ;
===== association_element =====
association_element ::=
[ formal_part => ] actual_part
===== association_list =====
association_list ::=
association_element { , association_element }
===== attribute_declaration =====
attribute_declaration ::=
attribute identifier : type_mark ;
===== attribute_designator =====
attribute_designator ::= attribute _simple_name
===== attribute_name =====
attribute_name ::=
prefix [ signature ] ' attribute_designator [ ( expression ) ]
===== attribute_specification =====
attribute_specification ::=
attribute attribute_designator of entity_specification is expression ;
===== base =====
base ::= integer
===== base_specifier =====
base_specifier ::= B | O | X
===== based_integer =====
based_integer ::=
extended_digit { [ underline ] extended_digit }
===== based_literal =====
based_literal ::=
base # based_integer [ . based_integer ] # [ exponent ]
===== basic_character =====
basic_character ::=
basic_graphic_character | format_effector
===== basic_graphic_character =====
basic_graphic_character ::=
upper_case_letter | digit | special_character| space_character
===== basic_identifier =====
basic_identifier ::= letter { [ underline ] letter_or_digit }
===== binding_indication =====
binding_indication ::=
[ use entity_aspect ]
[ generic_map_aspect ]
[ port_map_aspect ]
===== bit_string_literal =====
bit_string_literal ::= base_specifier " [ bit_value ] "
===== bit_value =====
bit_value ::= extended_digit { [ underline ] extended_digit }
===== block_configuration =====
block_configuration ::=
for block_specification
{ use_clause }
{ configuration_item }
end for ;
===== block_declarative_item =====
block_declarative_item ::=
subprogram_declaration
| subprogram_body
| type_declaration
| subtype_declaration
| constant_declaration
| signal_declaration
| shared _variable_declaration
| file_declaration
| alias_declaration
| component_declaration
| attribute_declaration
| attribute_specification
| configuration_specification
| disconnection_specification
| use_clause
| group_template_declaration
| group_ declaration
===== block_declarative_part =====
block_declarative_part ::=
{ block_declarative_item }
===== block_header =====
block_header ::=
[ generic_clause
[ generic_map_aspect ; ] ]
[ port_clause
[ port_map_aspect ; ] ]
===== block_specification =====
block_specification ::=
architecture _name
| block_statement _label
| generate_statement _label [ ( index_specification ) ]
===== block_statement =====
block_statement ::=
block _label :
block [ ( guard _expression ) ] [ is ]
block_header
block_declarative_part
begin
block_statement_part
end block [ block _label ] ;
===== block_statement_part =====
block_statement_part ::=
{ concurrent_statement }
===== case_statement =====
case_statement ::=
case expression is
case_statement_alternative
{ case_statement_alternative }
end case [ case_label ] ;
===== case_statement_alternative =====
case_statement_alternative ::=
when choices =>
sequence_of_statements
===== character_literal =====
character_literal ::= ' graphic_character '
===== choice =====
choice ::=
simple_expression
| discrete_range
| element _simple_name
| others
===== choices =====
choices ::= choice { | choice }
===== component_configuration =====
component_configuration ::=
for component_specification
[ binding_indication ; ]
[ block_configuration ]
end for ;
===== component_declaration =====
component_declaration ::=
component identifier [ is ]
[ local _generic_clause ]
[ local _port_clause ]
end component [ component _simple_name ] ;
===== component_instantiation_statement =====
component_instantiation_statement ::=
instantiation _label :
instantiated_unit
[ generic_map_aspect ]
[ port_map_aspect ] ;
===== component_specification =====
component_specification ::=
instantiation_list : component _name
===== composite_type_definition =====
composite_type_definition ::=
array_type_definition
| record_type_definition
===== concurrent_assertion_statement =====
concurrent_assertion_statement ::=
[ label : ] [ postponed ] assertion ;
===== concurrent_procedure_call_statement =====
concurrent_procedure_call_statement ::=
[ label : ] [ postponed ] procedure_call ;
===== concurrent_signal_assignment_statement =====
concurrent_signal_assignment_statement ::=
[ label : ] [ postponed ] conditional_signal_assignment
| [ label : ] [ postponed ] selected_signal_assignment
===== concurrent_statement =====
concurrent_statement ::=
block_statement
| process_statement
| concurrent_procedure_call_statement
| concurrent_assertion_statement
| concurrent_signal_assignment_statement
| component_instantiation_statement
| generate_statement
===== condition =====
condition ::= boolean _expression
===== condition_clause =====
condition_clause ::= until condition
===== conditional_signal_assignment =====
conditional_signal_assignment ::=
target <= options conditional_waveforms ;
===== conditional_waveforms =====
conditional_waveforms ::=
{ waveform when condition else }
waveform [ when condition ]
===== configuration_declaration =====
configuration_declaration ::=
configuration identifier of entity _name is
configuration_declarative_part
block_configuration
end [ configuration ] [ configuration _simple_name ] ;
===== configuration_declarative_item =====
configuration_declarative_item ::=
use_clause
| attribute_specification
| group_ declaration
===== configuration_declarative_part =====
configuration_declarative_part ::=
{ configuration_declarative_item }
===== configuration_item =====
configuration_item ::=
block_configuration
| component_configuration
===== configuration_specification =====
configuration_specification ::=
for component_specification binding_indication ;
===== constant_declaration =====
constant_declaration ::=
constant identifier_list : subtype_indication [ := expression ] ;
===== constrained_array_definition =====
constrained_array_definition ::=
array index_constraint of element _subtype_indication
===== constraint =====
constraint ::=
range_constraint
| index_constraint
===== context_clause =====
context_clause ::= { context_item }
===== context_item =====
context_item ::=
library_clause
| use_clause
===== decimal_literal =====
decimal_literal ::= integer [ . integer ] [ exponent ]
===== declaration =====
declaration ::=
type_declaration
| subtype_declaration
| object_declaration
| interface_declaration
| alias_declaration
| attribute_declaration
| component_declaration
| group_template_declaration
| group_ declaration
| entity_declaration
| configuration_declaration
| subprogram_declaration
| package_declaration
===== delay_mechanism =====
delay_mechanism ::=
transport
| [ reject time _expression ] inertial
===== design_file =====
design_file ::= design_unit { design_unit }
===== design_unit =====
design_unit ::= context_clause library_unit
===== designator =====
designator ::= identifier | operator_symbol
===== direction =====
direction ::= to | downto
===== disconnection_specification =====
disconnection_specification ::=
disconnect guarded_signal_specification after time _expression ;
===== discrete_range =====
discrete_range ::= discrete _subtype_indication | range
===== element_association =====
element_association ::=
[ choices => ] expression
===== element_declaration =====
element_declaration ::=
identifier_list : element_subtype_definition ;
===== element_subtype_definition =====
element_subtype_definition ::= subtype_indication
===== entity_aspect =====
entity_aspect ::=
entity entity _name [ ( architecture _identifier) ]
| configuration configuration _name
| open
===== entity_class =====
entity_class ::=
entity
| architecture
| configuration
| procedure
| function
| package
| type
| subtype
| constant
| signal
| variable
| component
| label
| literal
| units
| group
| file
===== entity_class_entry =====
entity_class_entry ::= entity_class [ <> ]
===== entity_class_entry_list =====
entity_class_entry_list ::=
entity_class_entry { , entity_class_entry }
===== entity_declaration =====
entity_declaration ::=
entity identifier is
entity_header
entity_declarative_part
[ begin
entity_statement_part ]
end [ entity ] [ entity _simple_name ] ;
===== entity_declarative_item =====
entity_declarative_item ::=
subprogram_declaration
| subprogram_body
| type_declaration
| subtype_declaration
| constant_declaration
| signal_declaration
| shared _variable_declaration
| file_declaration
| alias_declaration
| attribute_declaration
| attribute_specification
| disconnection_specification
| use_clause
| group_template_declaration
| group_ declaration
===== entity_declarative_part =====
entity_declarative_part ::=
{ entity_declarative_item }
===== entity_designator =====
entity_designator ::= entity_tag [ signature ]
===== entity_header =====
entity_header ::=
[ formal _generic_clause ]
[ formal _port_clause ]
===== entity_name_list =====
entity_name_list ::=
entity_designator { , entity_designator }
| others
| all
===== entity_specification =====
entity_specification ::=
entity_name_list : entity_class
===== entity_statement =====
entity_statement ::=
concurrent_assertion_statement
| passive _concurrent_procedure_call_statement
| passive _process_statement
===== entity_statement_part =====
entity_statement_part ::=
{ entity_statement }
===== entity_tag =====
entity_tag ::= simple_name | character_literal | operator_symbol
===== enumeration_literal =====
enumeration_literal ::= identifier | character_literal
===== enumeration_type_definition =====
enumeration_type_definition ::=
( enumeration_literal { , enumeration_literal } )
===== exit_statement =====
exit_statement ::=
[ label : ] exit [ loop _label ] [ when condition ] ;
===== exponent =====
exponent ::= E [ + ] integer | E -integer
===== expression =====
expression ::=
relation { and relation }
| relation { or relation }
| relation { xor relation }
| relation [ nand relation ]
| relation [ nor relation ]
| relation { xnor relation }
===== extended_digit =====
extended_digit ::= digit | letter
===== extended_identifier =====
extended_identifier ::= \ graphic_character { graphic_character } \
===== factor =====
factor ::=
primary [ ** primary ]
| abs primary
| not primary
===== file_declaration =====
file_declaration ::=
file identifier_list : subtype_indication [ file_open_information ] ;
===== file_logical_name =====
file_logical_name ::= string _expression
===== file_open_information =====
file_open_information ::=
[ open file_open_kind _expression ] is file_logical_name
===== file_type_definition =====
file_type_definition ::=
file of type_mark
===== floating_type_definition =====
floating_type_definition ::= range_constraint
===== formal_designator =====
formal_designator ::=
generic _name
| port _name
| parameter _name
===== formal_parameter_list =====
formal_parameter_list ::= parameter _interface_list
===== formal_part =====
formal_part ::=
formal_designator
| function _name ( formal_designator )
| type_mark ( formal_designator )
===== full_type_declaration =====
full_type_declaration ::=
type identifier is type_definition ;
===== function_call =====
function_call ::=
function _name [ ( actual_parameter_part ) ]
===== generate_statement =====
generate_statement ::=
generate _label :
generation_scheme generate
[ { block_declarative_item }
begin ]
{ concurrent_statement }
end generate [ generate _label ] ;
===== generation_scheme =====
generation_scheme ::=
for generate _parameter_specification
| if condition
===== generic_clause =====
generic_clause ::=
generic ( generic_list ) ;
===== generic_list =====
generic_list ::= generic _interface_list
===== generic_map_aspect =====
generic_map_aspect ::=
generic map ( generic _association_list )
===== graphic_character =====
graphic_character ::=
basic_graphic_character | lower_case_letter | other_special_character
===== group_constituent =====
group_constituent ::= name | character_literal
===== group_constituent_list =====
group_constituent_list ::= group_constituent { , group_constituent }
===== group_declaration =====
group_ declaration ::=
group identifier : group_ template _name ( group_constituent_list ) ;
===== group_template_declaration =====
group_template_declaration ::=
group identifier is ( entity_class_entry_list ) ;
===== guarded_signal_specification =====
guarded_signal_specification ::=
guarded _signal_list : type_mark
===== identifier =====
identifier ::= basic_identifier | extended_identifier
===== identifier_list =====
identifier_list ::= identifier { , identifier }
===== if_statement =====
if_statement ::=
[ if _label : ]
if condition then
sequence_of_statements
{ elsif condition then
sequence_of_statements }
[ else
sequence_of_statements ]
end if [ if _label ] ;
===== incomplete_type_declaration =====
incomplete_type_declaration ::= type identifier ;
===== index_constraint =====
index_constraint ::= ( discrete_range { , discrete_range } )
===== index_specification =====
index_specification ::=
discrete_range
| static _expression
===== index_subtype_definition =====
index_subtype_definition ::= type_mark range <>
===== indexed_name =====
indexed_name ::= prefix ( expression { , expression } )
===== instantiated_unit =====
instantiated_unit ::=
[ component ] component _name
| entity entity _name [ ( architecture _identifier ) ]
| configuration configuration _name
===== instantiation_list =====
instantiation_list ::=
instantiation _label { , instantiation _label }
| others
| all
===== integer =====
integer ::= digit { [ underline ] digit }
===== integer_type_definition =====
integer_type_definition ::= range_constraint
===== interface_constant_declaration =====
interface_constant_declaration ::=
[ constant ] identifier_list : [ in ] subtype_indication [ := static _expression ]
===== interface_declaration =====
interface_declaration ::=
interface_constant_declaration
| interface_signal_declaration
| interface_variable_declaration
| interface_file_declaration
===== interface_element =====
interface_element ::= interface_declaration
===== interface_file_declaration =====
interface_file_declaration ::=
file identifier_list : subtype_indication
===== interface_list =====
interface_list ::=
interface_element { ; interface_element }
===== interface_signal_declaration =====
interface_signal_declaration ::=
[ signal ] identifier_list : [ mode ] subtype_indication [ bus ] [ := static _expression ]
===== interface_variable_declaration =====
interface_variable_declaration ::=
[ variable ] identifier_list : [ mode ] subtype_indication [ := static _expression ]
===== iteration_scheme =====
iteration_scheme ::=
while condition
| for loop _parameter_specification
===== label =====
label ::= identifier
===== letter =====
letter ::= upper_case_letter | lower_case_letter
===== letter_or_digit =====
letter_or_digit ::= letter | digit
===== library_clause =====
library_clause ::= library logical_name_list ;
===== library_unit =====
library_unit ::=
primary_unit
| secondary_unit
===== literal =====
literal ::=
numeric_literal
| enumeration_literal
| string_literal
| bit_string_literal
| null
===== logical_name =====
logical_name ::= identifier
===== logical_name_list =====
logical_name_list ::= logical_name { , logical_name }
===== logical_operator =====
logical_operator ::= and | or | nand | nor | xor | xnor
===== loop_statement =====
loop_statement ::=
[ loop _label : ]
[ iteration_scheme ] loop
sequence_of_statements
end loop [ loop _label ] ;
===== miscellaneous_operator =====
miscellaneous_operator ::= ** | abs | not
===== mode =====
mode ::= in | out | inout | buffer | linkage
===== multiplying_operator =====
multiplying_operator ::= * | / | mod | rem
===== name =====
name ::=
simple_name
| operator_symbol
| selected_name
| indexed_name
| slice_name
| attribute_name
===== next_statement =====
next_statement ::=
[ label : ] next [ loop _label ] [ when condition ] ;
===== null_statement =====
null_statement ::= [ label : ] null ;
===== numeric_literal =====
numeric_literal ::=
abstract_literal
| physical_literal
===== object_declaration =====
object_declaration ::=
constant_declaration
| signal_declaration
| variable_declaration
| file_declaration
===== operator_symbol =====
operator_symbol ::= string_literal
===== options =====
options ::= [ guarded ] [ delay_mechanism ]
===== package_body =====
package_body ::=
package body package _simple_name is
package_body_declarative_part
end [ package_body ] [ package _simple_name ] ;
===== package_body_declarative_item =====
package_body_declarative_item ::=
subprogram_declaration
| subprogram_body
| type_declaration
| subtype_declaration
| constant_declaration
| shared _variable_declaration
| file_declaration
| alias_declaration
| use_clause
| group_template_declaration
| group_ declaration
===== package_body_declarative_part =====
package_body_declarative_part ::=
{ package_body_declarative_item }
===== package_declaration =====
package_declaration ::=
package identifier is
package_declarative_part
end [ package ] [ package _simple_name ] ;
===== package_declarative_item =====
package_declarative_item ::=
subprogram_declaration
| type_declaration
| subtype_declaration
| constant_declaration
| signal_declaration
| shared _variable_declaration
| file_declaration
| alias_declaration
| component_declaration
| attribute_declaration
| attribute_specification
| disconnection_specification
| use_clause
| group_template_declaration
| group_ declaration
===== package_declarative_part =====
package_declarative_part ::=
{ package_declarative_item }
===== parameter_specification =====
parameter_specification ::=
identifier in discrete_range
===== physical_literal =====
physical_literal ::= [ abstract_literal ] unit _name
===== physical_type_definition =====
physical_type_definition ::=
range_constraint
units
base_unit_declaration
{ secondary_unit_declaration }
end units [ physical_type _simple_name ]
===== port_clause =====
port_clause ::=
port ( port_list ) ;
===== port_list =====
port_list ::= port _interface_list
===== port_map_aspect =====
port_map_aspect ::=
port map ( port _association_list )
===== prefix =====
prefix ::=
name
| function_call
===== primary =====
primary ::=
name
| literal
| aggregate
| function_call
| qualified_expression
| type_conversion
| allocator
| ( expression )
===== primary_unit =====
primary_unit ::=
entity_declaration
| configuration_declaration
| package_declaration
===== primary_unit_declaration =====
primary_unit_declaration ::= identifier ;
===== procedure_call =====
procedure_call ::=
procedure _name [ ( actual_parameter_part ) ]
===== procedure_call_statement =====
procedure_call_statement ::= [ label : ] procedure_call ;
===== process_declarative_item =====
process_declarative_item ::=
subprogram_declaration
| subprogram_body
| type_declaration
| subtype_declaration
| constant_declaration
| variable_declaration
| file_declaration
| alias_declaration
| attribute_declaration
| attribute_specification
| use_clause
| group_template_declaration
| group_ declaration
===== process_declarative_part =====
process_declarative_part ::=
{ process_declarative_item }
===== process_statement =====
process_statement ::=
[ process _label : ]
[ postponed ] process [ ( sensitivity_list ) ] [ is ]
process_declarative_part
begin
process_statement_part
end [ postponed ] process [ process _label ] ;
===== process_statement_part =====
process_statement_part ::=
{ sequential_statement }
===== qualified_expression =====
qualified_expression ::=
type_mark ' ( expression )
| type_mark ' aggregate
===== range =====
range ::=
range _attribute_name
| simple_expression direction simple_expression
===== range_constraint =====
range_constraint ::= range range
===== record_type_definition =====
record_type_definition ::=
record
element_declaration
{ element_declaration }
end record [ record_type _simple_name ]
===== relation =====
relation ::=
shift_expression [ relational_operator shift_expression ]
===== relational_operator =====
relational_operator ::= = | /= | < | <= | > | >=
===== report_statement =====
report_statement ::=
[ label : ]
report expression
[ severity expression ] ;
===== return_statement =====
return_statement ::= [ label ] return [ expression ] ;
===== scalar_type_definition =====
scalar_type_definition ::=
enumeration_type_definition
| integer_type_definition
| floating_type_definition
| physical_type_definition
===== secondary_unit =====
secondary_unit ::=
architecture_body
| package_body
===== secondary_unit_declaration =====
secondary_unit_declaration ::= identifier = physical_literal ;
===== selected_name =====
selected_name ::= prefix . suffix
===== selected_signal_assignment =====
selected_signal_assignment ::=
with expression select
target <= options selected_waveforms ;
===== selected_waveforms =====
selected_waveforms ::=
{ waveform when choices , }
waveform when choices
===== sensitivity_clause =====
sensitivity_clause ::= on sensitivity_list
===== sensitivity_list =====
sensitivity_list ::= signal _name { , signal _name }
===== sequence_of_statements =====
sequence_of_statements ::=
{ sequential_statement }
===== sequential_statement =====
sequential_statement ::=
wait_statement
| assertion_statement
| report_statement
| signal_assignment_statement
| variable_assignment_statement
| procedure_call_statement
| if_statement
| case_statement
| loop_statement
| next_statement
| exit_statement
| return_statement
| null_statement
===== shift_expression =====
shift_expression ::=
simple_expression [ shift_operator simple_expression ]
===== shift_operator =====
shift_operator ::= sll | srl | sla | sra | rol | ror
===== sign =====
sign ::= + | -
===== signal_assignment_statement =====
signal_assignment_statement ::=
[ label : ] target <= [ delay_mechanism ] waveform ;
===== signal_declaration =====
signal_declaration ::=
signal identifier_list : subtype_indication [ signal_kind ] [ := expression ] ;
===== signal_kind =====
signal_kind ::= register | bus
===== signal_list =====
signal_list ::=
signal _name { , signal _name }
| others
| all
===== signature =====
signature ::= [ [ type_mark { , type_mark } ] [ return type_mark ] ]
===== simple_expression =====
simple_expression ::=
[ sign ] term { adding_operator term }
===== simple_name =====
simple_name ::= identifier
===== slice_name =====
slice_name ::= prefix ( discrete_range )
===== string_literal =====
string_literal ::= " { graphic_character } "
===== subprogram_body =====
subprogram_body ::=
subprogram_specification is
subprogram_declarative_part
begin
subprogram_statement_part
end [ subprogram_kind ] [ designator ] ;
===== subprogram_declaration =====
subprogram_declaration ::=
subprogram_specification ;
===== subprogram_declarative_item =====
subprogram_declarative_item ::=
subprogram_declaration
| subprogram_body
| type_declaration
| subtype_declaration
| constant_declaration
| variable_declaration
| file_declaration
| alias_declaratio
| attribute_declaration
| attribute_specification
| use_clause
| group_template_declaration
| group_ declaratio
===== subprogram_declarative_part =====
subprogram_declarative_part ::=
{ subprogram_declarative_item }
===== subprogram_kind =====
subprogram_kind ::= procedure | function
===== subprogram_specification =====
subprogram_specification ::=
procedure designator [ ( formal_parameter_list ) ]
| [ pure | impure ] function designator [ ( formal_parameter_list ) ]
return type_mark
===== subprogram_statement_part =====
subprogram_statement_part ::=
{ sequential_statement }
===== subtype_declaration =====
subtype_declaration ::=
subtype identifier is subtype_indication ;
===== subtype_indication =====
subtype_indication ::=
[ resolution_function _name ] type_mark [ constraint ]
===== suffix =====
suffix ::=
simple_name
| character_literal
| operator_symbol
| all
===== target =====
target ::=
name
| aggregate
===== term =====
term ::=
factor { multiplying_operator factor }
===== timeout_clause =====
timeout_clause ::= for time _expression
===== type_conversion =====
type_conversion ::= type_mark ( expression )
===== type_declaration =====
type_declaration ::=
full_type_declaration
| incomplete_type_declaration
===== type_definition =====
type_definition ::=
scalar_type_definition
| composite_type_definition
| access_type_definition
| file_type_definition
===== type_mark =====
type_mark ::=
type _name
| subtype _name
===== unconstrained_array_definition =====
unconstrained_array_definition ::=
array ( index_subtype_definition { , index_subtype_definition } )
of element _subtype_indication
===== use_clause =====
use_clause ::=
use selected_name { , selected_name } ;
===== variable_assignment_statement =====
variable_assignment_statement ::=
[ label : ] target := expression ;
===== variable_declaration =====
variable_declaration ::=
[ shared ] variable identifier_list : subtype_indication [ := expression ] ;
===== wait_statement =====
wait_statement ::=
[ label : ] wait [ sensitivity_clause ] [ condition_clause ] [ timeout_clause ] ;
===== waveform =====
waveform ::=
waveform_element { , waveform_element }
| unaffected
===== waveform_element =====
waveform_element ::=
value _expression [ after time _expression ]
| null [ after time _expression ]