Name
Formal Definition
A property of an identifier with
respect to some named entity. Each form of declaration associates an
identifier with a named entity. In certain places within the scope of
a declaration, it is valid to use the identifier to refer to the
associated named entity; these places are defined by the visibility
rules. At such places, the identifier is said to be the name of the
named entity.
Simplified Syntax
simple_name ::= identifier
selected_name ::= prefix . suffix
prefix ::= name | function_call
suffix ::= simple_name
| character_literal
| operator_symbol
| all
indexed_name ::= prefix ( expression { , expression } )
slice_name ::= prefix ( discrete_range )
attribute_name ::= prefix [ signature ] ' attribute_designator [ (
expression ) ]
Description
Any declaration that introduces a named entity defines an identifier
which enables reference to such an entity by using this identifier.
However, it is not always possible to refer to an entity or part of
it by using just its identifier. More general form of reference to
entities is by a name.
Names can also indicate objects of the access type, elements of the
composite type, parts of the composite object or unit attributes
which have an identifier in their declaration. The name can have any
of the following forms:
-
simple name
-
operator symbol
-
selected name
-
indexed name
-
slice name
-
attribute name
The selected name, indexed name, slice name and attribute name
contain prefix, which can be also a name or a function call. Prefix
of selected name, indexed name or slice name must indicate a
composite unit, which is composed of other units (Example 1).
The prefix of an attribute name can indicate any unit for which such
an attribute exists (Example 2).
SIMPLE NAME AND OPERATOR SYMBOL
The simple name consists only of the identifier, which is assigned to
a given unit in its declaration. The simple name can also indicate an
alias of a given unit (Example 3).
The operator symbol is a string literal, which indicates the function
declared for such an operator symbol (Example 4).
THE SELECTED NAME
The selected name serves for indicating a unit declared inside
another unit or in a design library. A selected name consists of the
prefix, which is the name of a composite unit, followed by a dot (.)
and then by a suffix which is either the name of the element (if
referenced individually) or the reserved word all
(if all elements in the composite unit are referenced to).
The selected name can indicate all the units declared in a library
and in a package. It can also define elements of a record, as well as
objects indicated by pointers. The prefix is the composite unit in
which the units are declared. The suffix can be a simple name,
character literal, the operator symbol or the reserved word all.
In the latter case, the name refers to all elements declared in a
unit. Several selected names are presented in Example 5.
The prefix may also have a form of a selected name (with two dots in
total), making the reference more complex. This form is used for
example in the use clause.
See Example 6.
The prefix in the selected name can indicate design entity,
architecture body, subprogram, block, process, generate statement or
loop statement. The entity indicated by the suffix of this name must
be declared inside a given construct (Example 7).
THE INDEXED NAME
The indexed name indicates an element of an array, which is indicated
by an expression list forming the array index. The number of
expressions in the list must match the array dimension and the
expressions values must fit within the respective index ranges
(Example 8).
The index name can have the same form as the function call. In such a
case, the name's interpretation depends on the context. If the
interpretation of such a name is impossible, then the name is ambiguous.
THE SLICE NAME
The slice name allows indicating a part of a one-dimensional array.
The part of the object indicated by the slice name is an object of
the same class, e.g. slice name of variable is also a variable. The
slice name consists of two elements: a prefix and a discrete range.
The prefix is the name of the array, while discrete range defines
which elements of the object are accessed through the slice name
(Example 9).
The discrete range must be compatible with the array range, i.e. the
range bounds must not be outside the range declared for the object
and the direction must be the same as in the object's declaration.
The slice name is called a null slice if its discrete range is a null
range. Null slices are illegal.
THE ATTRIBUTE NAME
The attribute name consists of two elements: a prefix and an
attribute designator (name). The prefix indicates a unit, for which
the attribute is specified and the attribute designator specifies the
name of the attribute (Example 10).
The specification of an attribute name may contain an expression, but
this is restricted only to those predefined attributes which require
such expression (see attributes
(predefined) for details). User-defined attributes may not be
used with expressions.
The prefix can also indicate the unit alias. In such a case,
attribute name defines the attribute of the unit and not the unit's
alias. There are only three exceptions from this rule: attributes
SIMPLE_NAME, PATH_NAME and INSTANCE_NAME (Example 11).
If the prefix indicates a subprogram, enumeration literal or an alias
of any of the two, then the attribute name can also contain the
signature, which helps to resolve any possible ambiguities arising
from multiple objects with the same name (Example 12).
Examples
Example 1
C.X
A(1,10)
B(1 to 2)
C is an object of a record type, A is an object of an array type or a
function call (the two numbers can be either indices of a two-dimensional
array or two parameters of a function call) and B is an object of an
array type.
Example 2
D'STABLE (5 ns)
Prefix D indicates a signal of any type.
Example 3
variable E: BIT_VECTOR (0 to 3);
alias F : BIT_VECTOR (0 to
3) is E;
E := "0000";
F := "1111";
E is a simple name which indicates the E variable, and F is a simple
name which indicates alias of the E variable.
Example 4
function "+"(a,b:
Integer) return REAL;
G := "+"(7,77);
In this example, "+" is an overloaded operator defined by
the associated function (declaration of which is given above the call
to the operator).
Example 5
WORK.N_GATES
DATA_RECORD.DAY
PAC_OPER."*"
STD_ULOGIC.'X'
NMOS_GATES.all
REC_PTR.all
The first name gives an access to the package N_Gates in the Work
library. The second refers to the element Day of the record
Data_Record. Note that both names are constructed in the same way and
their correct interpretation is possible only from the context (not
presented here). The third name relates to operation of a package.
Fourth is a value of a type. Finally, the last two names relate to
all declarations in a package and all objects addressed by the value
of an access type, respectively.
Example 6
A_LIB.PAC_OPER."+"
STD_LOGIC.STD_ULOGIC.'U'
The first complex name gives an access to the "+" operator
defined in the PAC_OPER package stored in the A_LIB library. The
second example refers to the value "U" declared by the
STD_ULOGIC type within STD_LOGIC package.
Example 7
B_1: block
signal Sig_X: BIT := '0';
begin
..................
Gen_1: for i in
1 to 10 generate
signal
Sig_X : Bit;
begin
.................
Sig_X
<= B_1.Sig_X;
end generate;
end block;
The access to the Sig_X signal declared in the B_1 block statement is
possible only by using the specification of the selected name in
which the prefix is the label of the block statement (i.e. B_1.Sig_X).
Example 8
type MEM_ARRAY is array
(1 to 8) of BIT;
variable Mem_Var : MEM_ARRAY
:= "01000000";
Mem_Var(7)
The Mem_Var variable is the object of the MEM_ARRAY which is a
one-dimensional array. That is why the expression list consists of
only one value. The index indicates the array's element equal to '1'.
Example 9
variable MEM : BIT_VECTOR
(15 downto 0);
MEM (15 downto 8)
The slice name presented in this example refers to the leftmost eight
elements of the variable MEM.
Example 10
signal CLK : BIT;
CLK'EVENT -- An attribute EVENT of the signal CLK
The EVENT attribute allows to check for an event that just occurred
on the signal indicated by the prefix (in this example CLK).
Example 11
alias MVL_ALIAS: MVL_ARRAY is MVL_VECTOR;
MVL_ALIAS'RIGHT(1)
MVL_ALIAS'SIMPLE_NAME
Attribute 'RIGHT indicates the right bound of the first range of
MVL_VECTOR variable. However, 'SIMPLE_NAME relates to the MVL_ALIAS alias.
Example 12
function "xor"
(L,R : STD_ULOGIC) return STD_ULOGIC;
attribute Built_In of
"xor": function is TRUE;
"xor"[ STD_ULOGIC, STD_ULOGIC return STD_ULOGIC]'Built_In
The signature appearing in the attribute name specification allows
describing the right function which has the Built_In attribute and
not the standard one.
Important Notes
-
Names must follow the rules of writing identifiers. In particular
they must start with a letter and be composed of numbers and
underscores. See identifier
for details.
-
None of the VHDL reserved words
may be used as a name for other items.
|