#vhdl #modelsim
#vhdl #modelsim
Вопрос:
Это тестовый стенд, и у меня есть эти сигналы:
signal DATA_INPUT :std_logic_vector(0 to 31);
signal rand_num :integer;
Я пытаюсь поместить случайные числа в этот 32-битный сигнал следующим образом:
DATA_INPUT <= std_logic_vector(to_unsigned(rand_num, 32));
Мой вопрос в том, что мне нужны числа больше 31 бита, но когда случайные числа превышают это число: 2147483647, которое равно целому числу’ high, я получаю эту ошибку:
near "4294967295": (vcom-119) Integer value exceeds INTEGER'high.
# ** Error: tb.vhd: (vcom-1144) Value -1 (of type
std.STANDARD.NATURAL) is out of range 0 to 2147483647.
Я попытался изменить функцию TO_UNSIGNED() и изменить ЕСТЕСТВЕННЫЙ ввод на что-то другое, но ничего.
Вот функция TO_UNSIGNED из процесса IEEE и ГЕНЕРАТОРА СЛУЧАЙНЫХ чисел:
function TO_UNSIGNED(ARG, SIZE: NATURAL) return UNSIGNED is
variable RESULT: UNSIGNED (SIZE-1 downto 0);
variable i_val: NATURAl := ARG;
begin
if (SIZE < 1) then return NAU; end if;
for i in 0 to RESULT'left loop
if (i_val MOD 2) = 0 then
RESULT(i) := '0';
else RESULT(i) := '1';
end if;
i_val := i_val/2;
end loop;
if not(i_val=0) then
assert NO_WARNING
report "numeric_std.TO_UNSIGNED : vector truncated"
severity WARNING;
end if;
return RESULT;
end TO_UNSIGNED;
Генератор случайных чисел:
process
variable seed1, seed2 :positive;
variable rand :real;
variable range_of_rand :real:= 46340.0;
begin
uniform(seed1, seed2, rand);
rand_num <= integer(rand*range_of_rand);
wait for 1 ns;
end process;
Комментарии:
1. Возможно, вы захотите заглянуть в OSVVM, поскольку в нем есть RandomPkg, который может генерировать случайные SLV любой длины, а также использовать разные (неоднородные) распределения.
2. OSVVM пакет Джима Льюиса RandomPkg , о котором говорится в Руководстве пользователя по
impure function RandUnsigned (Size : natural) return unsigned
RandomPkg, выполняет рандомизацию больших векторов (раздел 6), используяimpure function Uniform (Min, Max : integer) return integer
который в вашем случае обеспечил бы два вызова, чтобы с помощью функции масштабирования ограничить случайное вещественное число целым числом, длина которого безопасна для натурального.
Ответ №1:
Вы можете создать новое, большее случайное число, объединив два.
Самое простое решение — преобразовать два случайных целых числа в векторы, а затем объединить, пока не получите необходимое количество битов. Это дает вам 64 бита:
DATA_INPUT <= std_logic_vector(to_unsigned(rand_num, 32)) amp; std_logic_vector(to_unsigned(rand_num, 32));