Чтобы внести некоторую случайность в мой тестовый стенд, я хотел бы использовать псевдослучайные числа, засеянные текущим временем или эпохой Unix. Есть ли для этого функция (несинтезируемая из c) в VHDL? Мне нужно, чтобы он работал в VHDL 2008.
Обновил вопрос. Стандарт, на который я ориентируюсь, — 2008 год, поэтому функции VHDL 2019 для меня недоступны.
Чтобы сделать это в VHDL-2008, ваши сценарии должны быть в состоянии пройти в универсальном формате с временем UNIX/Epoch. Это, вероятно, лучший способ сделать это в любом случае, поскольку, как только вы заработаете, если / когда вы обнаружите сбой, вам нужно будет повторить тот же тест, который не прошел. Как правило, псевдослучайный подход достаточно хорош для генерации тестовых случаев, однако то, что вы предлагаете, хорошо подходит для запуска новых дополнительных тестов в качестве дополнительного уровня (помимо других ваших проверочных тестов) тестирования дизайна, когда пространство проверки велико.
Вам удалось избежать указания реализации инструмента VHDL, а передача дженериков зависит от реализации и непереносимости. Можете ли вы задать конкретный вопрос по программированию, чтобы сделать это по теме и избежать рекомендательного вопроса?
Вы используете их в системе CI? просто передать системное время будет работать, но может вызвать проблемы с повторяемостью. В CI в прошлом я просто передавал номер задания CI в качестве начального числа, так как он всегда разный для каждого запуска и делает повторное создание запуска локально простым поиском номера задания. В противном случае вы можете заставить TCL (или любой другой язык) сгенерировать для вас случайное число в качестве начального числа.
Можете ли вы показать мне, как это делается? Я просто запускаю свой тестовый стенд с ghdl 1.0 следующим образом: ghdl --elab-run --std=08 tb
Я просто хочу, чтобы некоторые случайные числа «оживили» мое тестирование.
Почему бы просто не передать общее значение параметра в той же командной строке, которую вы используете для запуска моделирования? Пример с bash
:
entity foo is
generic(seed: natural := 0);
end entity foo;
architecture bar of foo is
begin
assert false report natural'image(seed);
end architecture bar;
$ ghdl -a --std=08 foo.vhd
$ ghdl -r --std=08 foo
foo.vhd:7:3:@0ms:(assertion error): 0
$ ghdl -r --std=08 foo -gseed=$(date +%s)
foo.vhd:7:3:@0ms:(assertion error): 1648027085
IEEE Std 1076-2019 16.5.4 API даты и времени, но, вероятно, нет симулятора, который мог бы с невозмутимым видом утверждать, что сегодня поддерживает эту версию. EPOCH возвращает REAL, что даст вам 56-битную точность, преобразованную в INTEGER (64 бита в -2019). Мы не настолько близки к концу 64-битного диапазона эпохи UNIX, чтобы быть проблемой. Вы всегда можете передать дженерик в инструмент, поддерживающий дженерики командной строки и совместимый с более ранней версией стандарта. Для повторяемости при возникновении ошибок значение может быть сохранено.