Как правильно тестировать последовательные компоненты с библиотекой тестирования VUnit и с использованием VHDL? Я использовал его для тестирования комбинаторных компонентов с помощью операторов wait for
и т. д. Пример этого здесь в моем репозитории github.
Очевидно, я должен генерировать тактовый сигнал с помощью clk <= not clk after half_period;
, но как его дождаться? Я пишу что-то вроде wait until rising_edge(clk)
. Но если я хочу перевести часы на несколько тактов? Есть ли лучший способ, чем копировать строку выше несколько раз?
У меня обычно есть что-то по этому поводу
procedure walk (
signal clk : in std_logic;
constant steps : natural := 1) is
begin
if steps /= 0 then
for step in 0 to steps - 1 loop
wait until rising_edge(clk);
end loop;
end if;
end procedure;
Просто убедитесь, что если вы ждете других сигналов, вам может потребоваться повторная синхронизация с часами.
Например
clk <= not clk after 5 ns;
...
wait for 1.5 ns;
-- This assignment will happen at 1.5 ns, not at a clock edge!
a <= '1';
walk(clk, 1);
-- If you need somethign happening at a clock edge and you're not sure of where in
-- time you are, might be worth synchronizing at the start
walk(clk, 1);
--
a <= '1';
walk(clk, 1);
a <= '0';
walk(clk, 0);
...
Надеюсь это поможет!
Если вы используете VUnit, у вас уже есть такая процедура. VUnit поставляется с библиотекой OSVVM для ее функций рандомизации, но он также содержит другие вещи, например Ждатьфорчасы. Чтобы включить OSVVM, вам нужно добавить следующее в ваш скрипт Python.
ui = VUnit.from_argv()
ui.add_osvvm()
Спасибо, не знал, что это существует. Я бы хотел, чтобы было больше руководств по написанию тестовых стендов с помощью VUnit и тестированию с помощью VHDL в целом.
Лучше всего этого добиться, вероятно, активно участвуя в открытом обсуждении. Здесь, на форумах VUnit и в других местах
Вы всегда можете использовать цикл for. Еще лучше написать многоразовую процедуру для ожидания нескольких тактов (используя aloop для ожидания нарастающего фронта несколько раз)
wait_for_clks(6,clk)