std_logic_vector (to_unsigned(X, Y));

#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));