Attributes (user-defined)
Formal Definition
A value, function, type, range,
signal, or constant that may be associated with one or more named
entities in a description.
Simplified Syntax
attribute attribute_name:
type;
-- attribute declaration
attribute attribute_name of
item : item_class is expression;
-- attribute specification
Description
VHDL allows attaching additional information to design elements
through new attributes for specified types. In order to assign an
attribute to a given design element, attribute specification is used.
The values assigned this way can be referred in the expressions
through declared attribute name.
The attribute declaration defines a new attribute within the scope of
the given declarative area. It consists of an identifier
specification, which represents user defined attribute and type mark
that indicates value type for this attribute. A user-defined
attribute can be of any VHDL type, except for an access type, file
type, and any complex type with elements of any of the two types. See
Example 1.
Attribute specification assigns an attribute declared earlier to a
chosen named entity. The named entities that can be assigned
attributes are: entity, architecture, configuration, procedure,
function, package, type, subtype, constant, signal, variable,
component, label, literal, units, group, or file. The named entities
are enumerated in entity names list. In such a way the attribute is
assigned to a given language unit. Finally, the attribute
specification contains an expression, which sets an attribute value
for the entities listed in the specification. See Example 2.
The attribute specification for most named entities must be declared
together with declarations of those entities. For some entities,
however, the attribute specification is written in other places.
The attribute specification for
library units such as entity, architecture configuration and
package cannot be directly placed in the library, which contains
library unit declarations. Because of that, the attribute
specification is placed in the declaration part of named entity
(Example 3).
The attribute specification for a subprogram
must be declared in the same visibility region as the subprogram's
declaration. In case of overloaded procedures and functions,
signatures must be used to point to the subprogram to which the
attribute is assigned (Example 4). If no signature is used the
attribute relates to all subprograms with the same name.
Functions declared as the operators are always overloaded, and that
is why they always require the signature in the attribute
specification to differentiate functions (Example 5).
Attribute specifications for ports
and generic parameters are placed in the declaration part of
the design entity or the block statement to which they belong. The
attribute specifications for formal parameters of subprograms are
placed in the declaration part of these subprograms (Example 6).
Attribute specifications for
labeled statements cannot be located directly in the place of
the statements' declarations. Therefore, the attribute specifications
for the label connected with any concurrent or sequential statements
are placed in the declaration part before the occurrence of a given
statement (Example 7).
In case of the sequential statement labels, the attribute
specification is placed in the declaration part of the process or subprogram.
The attribute specification for literal
must be declared in the same visibility block as the literal
declaration. In case when there are several literals with the same
names, the attribute specification for a given literal uses a
signature in order to distinguish which type a given literal belongs
to (Example 8). If no signature is used the attribute can be applied
to all literals with the same name.
When specifying attributes reserved words: others
and all can be used as
entity (item) names. In the first case, the attribute specification
refers to all the remaining visible named entities of a given entity
class which do not have the attribute value assigned to them. Such an
attribute specification must be the last in the declaration that
refers to this attribute. When the keyword all
is used, the attribute specification refers to all named
entities of the given class. Such an attribute specification must be
the first in the declaration part, which relates to this attribute.
See Example 9.
Examples
Example 1
package Attr_pkg is
attribute Component_symbol : String;
attribute Pin_code : Positive;
attribute Max_delay: Time;
type Point is record
x, y: Real;
end record;
attribute Coordinate : Point;
........
end package Attr_pkg;
The Atrr_pkg contains several attribute declarations, which can be
later specified and used in other design units.
Example 2
package Some_declarations is
use Work.Attr_pkg.Component_symbol,
Work.Attr_pkg.Coordinate,
Work.Attr_pkg.Pin_code,
Work.Attr_pkg.Max_delay;
constant Const_1: Positive
:= 10;
signal Sig_1: Bit_vector (0 to 31);
component Comp_1 is
port
( ... );
end component;
attribute Component_symbol of
Comp_1: component is "Counter_16";
attribute Coordinate of
Comp_1: component is
(0.0, 17.5);
attribute Pin_code of
Sig_1: signal is 17;
attribute Max_delay of
Const_1: constant is
10 ns;
.........
end package Some_declarations;
The package Some_declarations specifies attributes, which were
declared in the package Attr_pkg.
Example 3
package Test_pkg is
attribute Package_atr : String;
attribute Package_atr of Test_pkg:
package is "Training_package";
.........
end package Test_pkg;
The specification of a package attribute Package_atr for the package
Test_pkg is declared in the declaration part of the package.
Example 4
procedure Sub_values (a, b : in
Integer; result: out Integer);
procedure Sub_values (a, b : in
Bit_vector; result: out Bit_vector);
attribute Description : String;
attribute Description of
Sub_values [Integer,
Integer, Integer]:procedure is "Integer_sub_values";
attribute Description of
Sub_values
[Bit_vector, Bit_vector, Bit_vector] :
procedure is "Bit_vector_sub_values";
The specification of the attribute Description intended for
overloaded procedure Sub_values, which subtracts two values of
integer or Bit_vector types, requires signature specification. These
signatures (simplified parameter lists) enable to distinguish
versions of the procedure.
Example 5
function "-" (a, b
: New_logic) return New_logic;
attribute Characteristic : String;
attribute Characteristic of
"-" [ New_logic, New_logic return New_logic]: function is "New_logic_op";
To identify operator - overloaded for two values of type
New_logic it is necessary to use signature that will unambiguously
identify the overloading function.
Example 6
procedure Insert (fifo : inout
Fifo_type; element: in
Elem_type) is
attribute
Number of fifo: variable is 50;
attribute
Trace of element: constant is "Integer/Decimal";
.........
end procedure Insert;
The procedure Insert has two formal parameters of different classes.
Specifications of attributes Number and Trace for parameters fifo and
element, respectively, are placed in the declaration part of the procedure.
Example 7
architecture Struct of
ALU is
component Adder is
port (...)
end component;
attribute Coordinate of
the_Adder: label is (0.0, 0.12);
begin
the_Adder
: Adder port map
( ... );
.........
end architecture Struct;
Specification of the attribute Coordinate for the label the_Adder for
component instantiation statement is located in the declarative part
of the corresponding architecture body Struct.
Example 8
type Three_level_logic is
(Low, High, Idle);
type Four_level_logic is
(Low, High, Idle, Uninitialized);
attribute Hex_value : string
(1 to 2);
attribute Hex_value of
Low [return Four_level_logic]: literal is "F0";
attribute Hex_value of
High [return Four_level_logic]: literal is "F1";
attribute Hex_value of
Idle [return Four_level_logic]: literal is "F2";
attribute Hex_value of
Uninitialized: literal is "F3";
As the literals Low, High, Idle are overloaded, it is necessary to
use signature indicating their type in the specification of the
attribute Hex_value for these literals. However, this is not
necessary for the literal Uninitialized as it is not overloaded.
Example 9
B1: block
signal S1,
S2, S3: Std_logic;
attribute
Delay_attr: Time;
attribute
Delay_attr of all: signal is
100 ps;
begin
.........
end block;
The Delay_attr relates to all signals in the block B1.
Important Notes
|