Subtype
Formal Definition
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.
Simplified Syntax
subtype subtype_name is
base_type range range_constraint;
Description
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.
Examples
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.
Important Notes
-
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.
|