A specified subset of values of a scalar type.
range left_bound to right_bound
range left_bound downto right_bound
range <>
The range specifies a subset of values of a scalar type. This range can be null range if the set contains no values. A range can be either ascending or descending.
A range is called ascending if it is specified with the keyword to as the direction and the left bound value is smaller than the right bound (otherwise the range is null). A range is descending if the range is specified with the keyword downto as the direction and the left bound is greater than the right bound (otherwise the range is null).
A value X belongs to a range if this range is not a null range and the following relation holds:
lower bound of the range <= X <= upper bound of the range
A range can be undefined. Such a range is used in declaration of unconstrained arrays and is illustrated in example 2.
Example 1
1 to 100
7 downto 0
5 to 0
The first range is an ascending range of the values of integer type.
The second range is also of integer type, but descending. Finally,
the third range is null.
Example 2
type Mem is array (NATURAL range <>) of Bit_Vector(7 downto 0);
The type Mem is declared as an unconstrained array of bytes (8-bit
wide vectors of bits). Note the way an undefined range is declared.
Ranges do not have to be bounded by discrete numbers. Enumeration types can also be used for ranges (for example 'a' to 'z').