This annex provides a summary of the syntax for VHDL. Productions are ordered alphabetically by left-hand nonterminal name. The clause number indicates the clause where the production is given.
abstract_literal ::= decimal_literal | based_literal [§ 13.4] access_type_definition ::= access subtype_indication [§ 3.3 ] actual_designator ::= [§ 4.3.2.2] expression | signal_name | variable_name | file_name | open actual_parameter_part ::= parameter_association_list [§ 7.3.3] actual_part ::= [§ 4.3.2.2] actual_designator | function_name ( actual_designator ) | type_mark ( actual_designator ) adding_operator ::= + | - | & [§ 7.2] aggregate ::= [§ 7.3.2] ( element_association { , element_association } ) alias_declaration ::= [§ 4.3.3] alias alias_designator [ : subtype_indication ] is name [ signature ] ; alias_designator ::= identifier | character_literal | operator_symbol [§ 4.3.3] allocator ::= [§ 7.3.6] new subtype_indication | new qualified_expression architecture_body ::= [§ 1.2] architecture identifier of entity_name is architecture_declarative_part begin architecture_statement_part end [ architecture ] [ architecture_simple_name ] ; architecture_declarative_part ::= [§ 1.2.1] { block_declarative_item } architecture_statement_part ::= [§ 1.2.2] { concurrent_statement } array_type_definition ::= [§ 3.2.1] unconstrained_array_definition | constrained_array_definition assertion ::= [§ 8.2] assert condition [ report expression ] [ severity expression ] assertion_statement ::= [ label : ] assertion ; [§ 8.2] association_element ::= [§ 4.3.2.2] [ formal_part => ] actual_part association_list ::= [§ 4.3.2.2] association_element { , association_element } attribute_declaration : [§ 4.4] attribute identifier : type_mark ; attribute_designator ::= attribute_simple_name [§ 6.6]
attribute_name ::= [§ 6.6] prefix [ signature ] ' attribute_designator [ ( expression ) ] attribute_specification ::= [§ 5.1] attribute attribute_designator of entity_specification is expression ; base ::= integer [§ 13.4.2] base_specifier ::= B | O | X [§ 13.7] based_integer ::= [§ 13.4.2] extended_digit { [ underline ] extended_digit } based_literal ::= [§ 13.4.2] base # based_integer [ . based_integer ] # [ exponent ] basic_character ::= [§ 13.1] basic_graphic_character | format_effector basic_graphic_character ::= [§ 13.1] upper_case_letter | digit | special_character| space_character basic_identifier ::= letter { [ underline ] letter_or_digit } [§ 13.3.1] binding_indication ::= [§ 5.2.1] [ use entity_aspect ] [ generic_map_aspect ] [ port_map_aspect ] bit_string_literal ::= base_specifier " [ bit_value ] " [§ 13.7] bit_value ::= extended_digit { [ underline ] extended_digit } [§ 13.7] block_configuration ::= [§ 1.3.1] for block_specification { use_clause } { configuration_item } end for ; block_declarative_item ::= [§ 1.2.1] 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 ::= [§ 9.1]
{ block_declarative_item } block_header ::= [§ 9.1] [ generic_clause [ generic_map_aspect ; ] ] [ port_clause [ port_map_aspect ; ] ] block_specification ::= [§ 1.3.1] architecture_name | block_statement_label | generate_statement_label [ ( index_specification ) ] block_statement ::= [§ 9.1] block_label : block [ ( guard_expression ) ] [ is ] block_header block_declarative_part begin block_statement_part end block [ block_label ] ; block_statement_part ::= [§ 9.1] { concurrent_statement } case_statement ::= [§ 8.8] [ case_label : ] case expression is case_statement_alternative { case_statement_alternative } end case [ case_label ] ; case_statement_alternative ::= [§ 8.8] when choices => sequence_of_statements character_literal ::= ' graphic_character ' [§ 13.5] choice ::= [§ 7.3.2] simple_expression | discrete_range | element_simple_name | others choices ::= choice { | choice } [§ 7.3.2] component_configuration ::= [§ 1.3.2] for component_specification [ binding_indication ; ] [ block_configuration ] end for ; component_declaration ::= [§ 4.5] component identifier [ is ] [ local_generic_clause ] [ local_port_clause ] end component [ component_simple_name ] ; component_instantiation_statement ::= [§ 9.6] instantiation_label : instantiated_unit [ generic_map_aspect ] [ port_map_aspect ] ; component_specification ::= [§ 5.2]
instantiation_list : component_name composite_type_definition ::= [§ 3.2] array_type_definition | record_type_definition concurrent_assertion_statement ::= [§ 9.4] [ label : ] [ postponed ] assertion ; concurrent_procedure_call_statement ::= [§ 9.3] [ label : ] [ postponed ] procedure_call ; concurrent_signal_assignment_statement ::= [§ 9.5] [ label : ] [ postponed ] conditional_signal_assignment | [ label : ] [ postponed ] selected_signal_assignment concurrent_statement ::= [§ 9] block_statement | process_statement | concurrent_procedure_call_statement | concurrent_assertion_statement | concurrent_signal_assignment_statement | component_instantiation_statement | generate_statement condition ::= boolean_expression [§ 8.1] condition_clause ::= until condition [§ 8.1] conditional_signal_assignment ::= [§ 9.5.1] target <= options conditional_waveforms ; conditional_waveforms ::= [§ 9.5.1]
{ waveform when condition else } waveform [ when condition ] configuration_declaration ::= [§ 1.3] configuration identifier of entity_name is configuration_declarative_part block_configuration end [ configuration ] [ configuration_simple_name ] ; configuration_declarative_item ::= [§ 1.3] use_clause | attribute_specification | group_declaration configuration_declarative_part ::= [§ 1.3] { configuration_declarative_item } configuration_item ::= [§ 1.3.1] block_configuration | component_configuration configuration_specification ::= [§ 5.2] for component_specification binding_indication ; constant_declaration ::= [§ 4.3.1.1] constant identifier_list : subtype_indication [ := expression ] ; constrained_array_definition ::= [§ 3.2.1] array index_constraint of element_subtype_indication constraint ::= [§ 4.2] range_constraint | index_constraint context_clause ::= { context_item } [§ 11.3] context_item ::= [§ 11.3] library_clause | use_clause decimal_literal ::= integer [ . integer ] [ exponent ] [§ 13.4.1] declaration ::= [§ 4] 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 ::= [§ 8.4] transport | [ reject time_expression ] inertial design_file ::= design_unit { design_unit } [§ 11.1] design_unit ::= context_clause library_unit [§ 11.1] designator ::= identifier | operator_symbol [§ 2.1] direction ::= to | downto [§ 3.1] disconnection_specification ::= [§ 5.3]
disconnect guarded_signal_specification after time_expression ; discrete_range ::= discrete_subtype_indication | range [§ 3.2.1] element_association ::= [§ 7.3.2] [ choices => ] expression element_declaration ::= [§ 3.2.2] identifier_list : element_subtype_definition ; element_subtype_definition ::= subtype_indication [§ 3.2.2] entity_aspect ::= [§ 5.2.1.1] entity entity_name [ ( architecture_identifier) ] | configuration configuration_name | open entity_class ::= [§ 5.1] entity | architecture | configuration | procedure | function | package | type | subtype | constant | signal | variable | component | label | literal | units | group | file entity_class_entry ::= entity_class [ <> ] [§ 4.6] entity_class_entry_list ::= [§ 4.6] entity_class_entry { , entity_class_entry } entity_declaration ::= [§ 1.1] entity identifier is entity_header entity_declarative_part [ begin entity_statement_part ] end [ entity ] [ entity_simple_name ] ; entity_declarative_item ::= [§ 1.1.2] 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 ::= [§ 1.1.2] { entity_declarative_item } entity_designator ::= entity_tag [ signature ] [§ 5.1] entity_header ::= [§ 1.1.1] [ formal_generic_clause ] [ formal_port_clause ] entity_name_list ::= [§ 5.1] entity_designator { , entity_designator } | others | all entity_specification ::= [§ 5.1] entity_name_list : entity_class entity_statement ::= [§ 1.1.3]
concurrent_assertion_statement | passive_concurrent_procedure_call_statement | passive_process_statement entity_statement_part ::= [§ 1.1.3] { entity_statement } entity_tag ::= simple_name | character_literal | operator_symbol [§ 5.1] enumeration_literal ::= identifier | character_literal [§ 3.1.1] enumeration_type_definition ::= [§ 3.1.1] ( enumeration_literal { , enumeration_literal } ) exit_statement ::= [§ 8.11] [ label : ] exit [ loop_label ] [ when condition ] ; exponent ::= E [ + ] integer | E - integer [§ 13.4.1] expression ::= [§ 7.1] relation { and relation } | relation { or relation } | relation { xor relation } | relation [ nand relation ] | relation [ nor relation ] | relation { xnor relation } extended_digit ::= digit | letter [§ 13.4.2] extended_identifier ::= \ graphic_character { graphic_character } \ [§ 13.3.2] factor ::= [§ 7.1] primary [ ** primary ] | abs primary | not primary file_declaration ::= [§ 4.3.1.4] file identifier_list : subtype_indication [ file_open_information ] ; file_logical_name ::= string_expression [§ 4.3.1.4] file_open_information ::= [§ 4.3.1.4] [ open file_open_kind_expression ] is file_logical_name file_type_definition ::= [§ 3.4] file of type_mark floating_type_definition ::= range_constraint [§ 3.1.4] formal_designator ::= [§ 4.3.2.2] generic_name | port_name | parameter_name formal_parameter_list ::= parameter_interface_list [§ 2.1.1] formal_part ::= [§ 4.3.2.2] formal_designator | function_name ( formal_designator ) | type_mark ( formal_designator ) full_type_declaration ::= [§ 4.1] type identifier is type_definition ; function_call ::= [§ 7.3.3]
function_name [ ( actual_parameter_part ) ] generate_statement ::= [§ 9.7] generate_label : generation_scheme generate [ { block_declarative_item } begin ] { concurrent_statement } end generate [ generate_label ] ; generation_scheme ::= [§ 9.7] for generate_parameter_specification | if condition generic_clause ::= [§ 1.1.1] generic ( generic_list ) ; generic_list ::= generic_interface_list [§ 1.1.1.1] generic_map_aspect ::= [§ 5.2.1.2] generic map ( generic_association_list ) graphic_character ::= [§ 13.1] basic_graphic_character | lower_case_letter | other_special_character group_constituent ::= name | character_literal [§ 4.7] group_constituent_list ::= group_constituent { , group_constituent} [§ 4.7] group_declaration ::= [§ 4.7] group identifier : group_template_name ( group_constituent_list ) ; group_template_declaration ::= [§ 4.6] group identifier is ( entity_class_entry_list ) ; guarded_signal_specification ::= [§ 5.3] guarded_signal_list : type_mark identifier ::= basic_identifier | extended_identifier [§ 13.3] identifier_list ::= identifier { , identifier } [§ 3.2.2] if_statement ::= [§ 8.7] [ 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 ::= type identifier ; [§ 3.3.1] index_constraint ::= ( discrete_range { , discrete_range } ) [§ 3.2.1] index_specification ::= [§; 1.3.1] discrete_range | static_expression index_subtype_definition ::= type_mark range <> [§ 3.2.1] indexed_name ::= prefix ( expression { , expression } ) [§ 6.4] instantiated_unit ::= [§ 9.6]
[ component ] component_name | entity entity_name [ ( architecture_identifier ) ] | configuration configuration_name instantiation_list ::= [§ 5.2] instantiation_label { , instantiation_label } | others | all integer ::= digit { [ underline ] digit } [§ 13.4.1] integer_type_definition ::= range_constraint [§ 3.1.2] interface_constant_declaration ::= [§ 4.3.2] [ constant ] identifier_list : [ in ] subtype_indication [ := static_expression ] interface_declaration ::= [§ 4.3.2] interface_constant_declaration | interface_signal_declaration | interface_variable_declaration | interface_file_declaration interface_element ::= interface_declaration [§ 4.3.2.1] interface_file_declaration ::= [§ 4.3.2] file identifier_list : subtype_indication interface_list ::= [§ 4.3.2.1] interface_element { ; interface_element } interface_signal_declaration :: [§ 4.3.2] [signal] identifier_list : [ mode ] subtype_indication [ bus ] [ := static_expression ] interface_variable_declaration ::= [§ 4.3.2] [variable] identifier_list : [ mode ] subtype_indication [ := static_expression ] iteration_scheme ::= [§ 8.9] while condition | for loop_parameter_specification label ::= identifier [§ 9.7] letter ::= upper_case_letter | lower_case_letter [§; 13.3.1] letter_or_digit ::= letter | digit [§ 13.3.1] library_clause ::= library logical_name_list ; [§ 11.2] library_unit ::= [§ 11.1]
primary_unit | secondary_unit literal ::= [§ 7.3.1] numeric_literal | enumeration_literal | string_literal | bit_string_literal | null logical_name ::= identifier [§ 11.2] logical_name_list ::= logical_name { , logical_name } [§ 11.2] logical_operator ::= and | or | nand | nor | xor | xnor [§; 7.2] loop_statement ::= [§ 8.9] [ loop_label : ] [ iteration_scheme ] loop sequence_of_statements end loop [ loop_label ] ; miscellaneous_operator ::= ** | abs | not [§ 7.2] mode ::= in | out | inout | buffer | linkage [§ 4.3.2] multiplying_operator ::= * | / | mod | rem [§ 7.2] name ::= [§ 6.1] simple_name | operator_symbol | selected_name | indexed_name | slice_name | attribute_name next_statement ::= [§ 8.10] [ label : ] next [ loop_label ] [ when condition ] ; null_statement ::= [ label : ] null ; [§ 8.13] numeric_literal ::= [§ 7.3.1] abstract_literal | physical_literal object_declaration ::= [§ 4.3.1] constant_declaration | signal_declaration | variable_declaration | file_declaration operator_symbol ::= string_literal [§ 2.1] options ::= [ guarded ] [ delay_mechanism ] [§ 9.5] package_body ::= [§ 2.6] package body package_simple_name is package_body_declarative_part end [ package body ] [ package_simple_name ] ; package_body_declarative_item ::= [§ 2.6] 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 ::= [§ 2.6]
{ package_body_declarative_item } package_declaration ::= [§ 2.5] package identifier is package_declarative_part end [ package ] [ package_simple_name ] ; package_declarative_item ::= [§ 2.5] 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 ::= [§ 2.5] { package_declarative_item } parameter_specification ::= [§ 8.9] identifier in discrete_range physical_literal ::= [ abstract_literal ] unit_name [§ 3.1.3] physical_type_definition ::= [§ 3.1.3] range_constraint units primary_unit_declaration { secondary_unit_declaration } end units [ physical_type_simple_name ] port_clause ::= [§ 1.1.1] port ( port_list ) ; port_list ::= port_interface_list [§ 1.1.1.2] port_map_aspect ::= [§ 5.2.1.2] port map ( port_association_list ) prefix ::= [§ 6.1] name | function_call primary ::= [§ 7.1] name | literal | aggregate | function_call | qualified_expression | type_conversion | allocator | ( expression ) primary_unit :: [§ 11.1] entity_declaration | configuration_declaration | package_declaration primary_unit_declaration ::= identifier; procedure_call ::= procedure_name [ ( actual_parameter_part ) ] [§ 8.6] procedure_call_statement ::= [ label : ] procedure_call ; [§ 8.6] process_declarative_item ::= [§ 9.2]
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 ::= [§; 9.2] { process_declarative_item } process_statement ::= [§ 9.2] [ process_label : ] [ postponed ] process [ ( sensitivity_list ) ] [ is ] process_declarative_part begin process_statement_part end [ postponed ] process [ process_label ] ; process_statement_part ::= [§ 9.2] { sequential_statement } qualified_expression ::= [§ 7.3.4] type_mark ' ( expression ) | type_mark ' aggregate range ::= [§ 3.1] range_attribute_name | simple_expression direction simple_expression range_constraint ::= range range [§ 3.1] record_type_definition ::= [§ 3.2.2] record element_declaration { element_declaration } end record [ record_type_simple_name ] relation ::= [§ 7.1] shift_expression [ relational_operator shift_expression ] relational_operator ::= = | /= | < | <= | > | >= [§ 7.2] report_statement ::= [§ 8.3] [ label : ] report expression [ severity expression ] ; return_statement ::= [§ 8.12] [ label : ] return [ expression ] ; scalar_type_definition ::= [§ 3.1] enumeration_type_definition | integer_type_definition | floating_type_definition | physical_type_definition secondary_unit ::= [§ 11.1] architecture_body | package_body secondary_unit_declaration ::= identifier = physical_literal ; [§ 3.1.3] selected_name ::= prefix . suffix [§ 6.3] selected_signal_assignment ::= [§ 9.5.2]
with expression select target <= options selected_waveforms ; selected_waveforms ::= [§ 9.5.2] { waveform when choices , } waveform when choices sensitivity_clause ::= on sensitivity_list [§ 8.1] sensitivity_list ::= signal_name { , signal_name } [§ 8.1] sequence_of_statements ::= [§ 8] { sequential_statement } sequential_statement ::= [§ 8] 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 ::= [§ 7.1] simple_expression [ shift_operator simple_expression ] shift_operator ::= sll | srl | sla | sra | rol | ror [§ 7.2] sign ::= + | - [§ 7.2] signal_assignment_statement ::= [§ 8.4] [ label : ] target <= [ delay_mechanism ] waveform ; signal_declaration ::= [§ 4.3.1.2] signal identifier_list : subtype_indication [ signal_kind ] [ := expression ] ; signal_kind ::= register | bus [§; 4.3.1.2] signal_list ::= [§ 5.3] signal_name { , signal_name } | others | all signature ::= [ [ type_mark { , type_mark } ] [ return type_mark ] ] [§ 2.3.2] simple_expression ::= [§ 7.1] [ sign ] term { adding_operator term } simple_name ::= identifier [§ 6.2] slice_name ::= prefix ( discrete_range ) [§ 6.5] string_literal ::= " { graphic_character } " [§ 13.6] subprogram_body ::= [§ 2.2] subprogram_specification is subprogram_declarative_part begin subprogram_statement_part end [ subprogram_kind ] [ designator ] ; subprogram_declaration ::= [§ 2.1]
subprogram_specification ; subprogram_declarative_item ::= [§ 2.2] 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 subprogram_declarative_part ::= [§ 2.2] { subprogram_declarative_item } subprogram_kind ::= procedure | function [§ 2.2] subprogram_specification ::= [§ 2.1] procedure designator [ ( formal_parameter_list ) ] | [ pure | impure ] function designator [ ( formal_parameter_list ) ] return type_mark subprogram_statement_part ::= [§ 2.2] { sequential_statement } subtype_declaration ::= [§ 4.2] subtype identifier is subtype_indication ; subtype_indication ::= [§ 4.2] [ resolution_function_name ] type_mark [ constraint ] suffix ::= [§ 6.3] simple_name | character_literal | operator_symbol | all target ::= [§ 8.4] name | aggregate term ::= [§ 7.1] factor { multiplying_operator factor } timeout_clause ::= for time_expression [§ 8.1] type_conversion ::= type_mark ( expression ) [§ 7.3.5] type_declaration ::= [§ 4.1] full_type_declaration | incomplete_type_declaration type_definition ::= [§ 4.1] scalar_type_definition | composite_type_definition | access_type_definition | file_type_definition type_mark ::= [§ 4.2] type_name | subtype_name unconstrained_array_definition ::= [§ 3.2.1]
array ( index_subtype_definition { , index_subtype_definition } ) of element_subtype_indication use_clause ::= [§ 10.4] use selected_name { , selected_name } ; variable_assignment_statement ::= [§ 8.5] [ label : ] target := expression ; variable_declaration ::= [§ 4.3.1.3] [ shared ] variable identifier_list : subtype_indication [ := expression ] ; wait_statement ::= [§ 8.1] [ label : ] wait [ sensitivity_clause ] [ condition_clause ] [ timeout_clause ] ; waveform ::= [§ 8.4] waveform_element { , waveform_element } | unaffected waveform_element ::= [§ 8.4.1] value_expression [ after time_expression ] | null [ after time_expression ]