Требуется, чтобы агрегат имел локально статический выбор, когда существует более одного варианта.(Код для определения значения выражения создается во время анализа.)
IEEE Std 1076-2008 9.3.3.3 Агрегаты массива, параграф 6:
Помимо конечного элементаассоциация с единственным выбором others , остальные (если таковые имеются) ассоциаций элементов агрегата массива должны быть либо позиционными, либо именованными.Именованная ассоциация агрегата массива может иметь выбор, который не является локально статическим, или аналогично, выбор, который является нулевым диапазоном, только если агрегат включает в себя ассоциацию одного элемента и эта ассоциация элемента имеет единственный выбор.Выбор others является локально статическим, если применимое ограничение индекса является локально статическим.
Можно предоставить выражение значения константы (6.4.2.2 объявления константы) или начальное выражениепеременной или сигнала при вызове функции (выражение, 9.3.4 вызовы функций) при разработке (14.4.2.5 Объявления объекта).Функция может быть нечистой (4. Подпрограммы и пакеты, 4.1 Общие положения, 9.4.3 Глобальные статические основные цвета, ПРИМЕЧАНИЕ 2.).
Построение Минимального, Полного и Проверяемого примера позволяет этобыть продемонстрировано:
library ieee;
use ieee.std_logic_1164.all;
ravenwater_mcve is
generic (NBITS: natural := 42);
end entity;
architecture foo of ravenwater_mcve is
impure function leftbit return std_logic_vector is
variable retv: std_logic_vector (NBITS - 1 downto 0) :=
(others => '0');
begin
retv(retv'LEFT) := '1';
return retv;
end function;
constant NaR: std_logic_vector(NBITS - 1 downto 0) := leftbit;
-- (NBITS - 1 => '1', others => '0');
begin
end architecture;
MCVe анализирует, разрабатывает и моделирует.
Вы можете добавить процесс для определения правильного выражения значения:
RESULT:
process
begin
report "NaR = " & to_string(NaR);
wait;
end process;
И еслииспользуя стандартную редакцию VHDL до -2008, предоставьте функцию to_string:
function to_string (inp: std_logic_vector) return string is
variable image_str: string (1 to inp'length);
alias input_str: std_logic_vector (1 to inp'length) is inp;
begin
for i in input_str'range loop
image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
end loop;
return image_str;
end function;
И это приведет к:
ghdl -r ravenwater_mcve
ravenwater_mcve.vhdl: 33: 9: @ 0ms: (примечание к отчету): NaR = 100000000000000000000000000000000000000000
(возможно, мне следовало бы использовать меньшее значение по умолчанию для общей константы.)
Вы также можете передать значениеуниверсальный для чистой функции в качестве параметра.