Генератор случайных чисел в VHDL - PullRequest
1 голос
/ 28 мая 2019

Я разрабатываю тестовый стенд, и мне нужно создать случайную последовательность битов для одного из входов системы, которая обычно контролируется пользователем.Я также хочу, чтобы эта последовательность битов не находилась в одном и том же порядке каждый раз, когда я запускаю симуляцию.

Я не могу использовать PRNG, поскольку его начальное состояние будет предопределено, то есть оно будет выдавать одни и те же числа каждый раз.Я также использовал универсальную функцию, но у меня была та же проблема.

RAND_GEN : process(clk) is
    variable seed1, seed2 : positive := 1;
    variable re           : real;
begin
    if rising_edge(clk) then
        uniform(seed1, seed2, re);
        if (re < 0.5) then
            rand_bit <= '0';
        else
            rand_bit <= '1';
        end if;
    end if;
end process;

Есть ли альтернативы для этой проблемы?

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

Тестирование со случайно сгенерированными входами является мощной техникой и является техникой, обычно используемой для проверки микросхем в наши дни.Обычно вы выполняете тест с известным, определенным начальным числом, тогда как вы хотите иметь возможность генерировать различное начальное число.Таким образом, вы абсолютно ДОЛЖНЫ записать это начальное значение при запуске теста и предоставить механизм для запуска теста с использованием этого начального значения.В противном случае, когда вы найдете ошибку, вы не сможете проверить, исправили ли вы ее.Вы можете найти его более полезным для фиксированного набора тестов с меньшим количеством сгенерированных вручную семян.

Вы можете использовать команду linux date с спецификатором формата %s, который выводит числосекунд с 01.01.1970 и перенаправить его в файл.

date +%s >! seed.txt

Затем прочитайте файл, например:

RAND_GEN : process(clk) is
    variable seed1, seed2 : positive := 1;
    variable re           : real;
    file F: TEXT;
    variable L: LINE;
    variable seed_RNG : boolean := false;
begin
    if not seed_RNG then
        file_open(F, "seed.txt", READ_MODE);
        readline (F, L);
        read (L, seed1);  -- or seed2
        file_close(F);
        report "seed1 = " & integer'image(seed1);
        seed_RNG := true;
    end if;
    if rising_edge(clk) then    
        uniform(seed1, seed2, re);
        if (re < 0.5) then
            rand_bit <= '0';
        else
            rand_bit <= '1';
        end if;
    end if;
end process;
0 голосов
/ 28 мая 2019

Просто для записи: на случай, если кому-то понадобится нечто подобное, я использовал вышеуказанные идеи, создав файл do, который сначала записывает дату в файл, а затем запускает файл do фактического тестового стенда, который читает это число в соответствии с предложением. до этого.

set t [clock seconds]
set outputFile [open date.txt w]
puts $outputFile $t
close $outputFile 
do testbench.do
0 голосов
/ 28 мая 2019

Я ничего не знаю о VHDL, но в целом я стараюсь избегать случайностей в тестах.Слабые юнит-тесты, например, плохие.Какое значение имеет тест, который иногда бывает неудачным?

В любом случае, если вы действительно хотите это сделать, у вас есть доступ к таймеру?Вы можете инициализировать PRNG с текущим временем в качестве начального числа.Не криптографически безопасен, но, вероятно, для этого случая использования достаточно хорош.

...