Вызов функции.
При вызове функции выполняется функция с заданными значениями параметров. Упрощенный синтасис вызова функции:
\вызов функции\::=\имя функции\ ([\имя параметра\ =>] \выражение\
{,[\имя параметра\ => ] \выражение\});
где \имя функции\ - имя функции, определяемой ранее, \имя параметра\ - не обязательный формальный параметр этой функции. Выражение-параметр функции - должно давать результат типа, соответствующий имени параметра. Параметры можно задавать с поименованным или позиционированным связыванием. При позиционированном связывании параметры-выражения подставляются в порядке, определенном порядком следования имен параметров в определении функции. При поименованном связывании каждое имя, параметра связывается с соответствующим параметром с помощью символов "=>", причем порядок следования параметров может быть произвольным.
В отличие от процедуры, вызов функции возвращает только один параметр, зато он может участвовать как операнд в выражениях. В языке VHDL очень мало встроенных функций. Большинство функций реализовано в виде подпрограмм. Для преобразования типов чаще всего используются функции. Например, функция
function BIT_TO_INT(x:bit_vector) return natural is
variable t, j:integer:=0;
begin
for I in x'reverse_range loop
if ( x(I)='1') then
t:=t + 2**j;
end if;
j:=j+1;
end loop;
return t;
end function BIT_TO_INT;
преобразует вектор битов в целое. При этом атрибут x'reverse_range возвращает диапазон, обратный диапазону представления входного параметра. Например, если входной параметр – bit_vector(7 downto 0), то в оператор цикла подставится диапазон 0 to 7. Таким образом, получается функция, универсальная для множества различных параметров – операндов.
Ключевые слова pure и impure обозначают идеальную и неидеальную функции. В отличие от идеальной функции, неидеальная функция может возвращать различные результаты для одинаковых наборов входных параметров. Например, если входной параметр – глобальная переменная, то она может измениться в момент вызова функции и результат будет отличаться от ожидаемого. Поэтому глобальные переменные не могут быть операндами в идеальных функциях. Примером неидеальной функции является функция Now из пакета STANDARD, которая при вызове возвращает переменную предопределенного типа delay_length, равную текущему моменту времени моделирования. Естественно, что при различных вызовах этой функции она возвращает различные значения.