A type together with a constraint.
A value belongs to a subtype of a
given type if it belongs to the type and satisfies the constraint;
the given type is called the base type of the subtype. A type is a
subtype of itself. Such a subtype is said to be unconstrained because
it corresponds to a condition that imposes no restriction.
subtype subtype_name is
base_type range range_constraint;
Subtype distinguishes a
subset of values of some type.
The part of the subtype
declaration is the subtype indication, which denotes some other type
or subtype. The type_mark in a subtype_indication must refer to a
type or a subtype that was declared earlier (Example 1).
The constraints given in the subtype indication must correspond to
the subtype. For scalar types - range constrains can be applied, for
arrays - index constraints are applicable. Records cannot have any
constraints. Access type may have index type constraints only when
their type_mark denotes an array type. If the subtype declaration
does not contain any constraints then the subtype is the same as the
(sub)type denoted by the type_mark.
A special form of the subtype indication may include a resolution
function name (Example 2). This form is not allowed for
declarations of access and file subtypes.
There are two predefined subtypes specified in the package STANDARD: natural
and positive. Both
are subtypes of the type INTEGER. The package Std_Logic_1164 also
contains declarations of subtypes, which are constrained subtypes of
the Std_Logic: X01, X01Z, UX01, and UX01Z.
subtype DIGITS is
INTEGER range 0
INTEGER is a predefined type and the subtype DIGITS will constrain
the type to ten values only, reducing the size of registers if the
specification is synthesized.
(anonymous: BIT_VECTOR) return BIT;
subtype BIT_NEW is
The subtype BIT_NEW is a resolved version of the type BIT due to the
reference to a resolution function RESOLVE_VALUE specified earlier.
A subtype declaration does not define a new type.
A subtype is the same type as its base type; thus, no type conversion
is needed when objects of a subtype and its base type are assigned
(in either direction). Also, the set of operations allowed on
operands of a subtype is the same as the set of operations on its
Using subtypes of enumerated and integer types for synthesis is
strongly recommended as synthesis tools infer an appropriate number
of bits in synthesized registers, depending on the range.