The subtype declaration has the following form: This rule includes a new notation, the name(function). It means that a name may appear, but that name should represent the name of a function. The word in parentheses specifies that the object should be of a certain kind or have a certain attribute.
In the section describing entities and architectures, port and generic clauses contained declarations for objects of some subtype. In that section the subtype was said to name the type of the object. More specifically though, it may also specify a subtype. The declarations we have already seen for objects of the bit_vector type are actually constrained subtype specifications, not just a type name. For example in we see that bit_vector is the type name (an unconstrained array type) and the (width-1 downto 0) part is the index constraint of the subtype specification. The bit_vector was defined to be an unconstrained array type so that many vectors could be constrained with different ranges, using the same subtype specification, that still have the same base type. It is also useful to use a subtype to constrain an array to different lengths because a subtype specification may appear directly in a declaration and does not require a new definition.
The function name part can be used to declare a resolved subtype. The resolved subtype is discussed in the next chapter with resolved signals.