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.
Example 1
subtype DIGITS is INTEGER range 0 to 9;
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.
Example 2
function RESOLVE_VALUE
(anonymous: BIT_VECTOR) return BIT;
subtype BIT_NEW is
RESOLVE_VALUE BIT;
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 base type.
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.