Самопроверяющийся тестовый стенд — это программа VHDL, которая проверяет правильность тестируемого устройства (DUT), не полагаясь на то, что оператор вручную проверит выходные данные. Тестовый стенд с самопроверкой работает полностью самостоятельно и в конце выводит сообщение «ОК» или «Не удалось».
Каждый модуль VHDL должен иметь связанный тестовый стенд с самопроверкой. Важно иметь возможность в любое время убедиться, что все модули ведут себя должным образом. Например, когда вы вносите изменения в тестируемое устройство, подмодуль или интерфейсный модуль. Мы все знаем, что вещи могут сломаться, и лучшим инструментом для выявления таких проблем является тестовый стенд с самопроверкой.
Тестируемое устройство
Давайте сразу приступим к созданию примера самопроверяющегося тестового стенда. Во-первых, нам нужно что-то протестировать, DUT. Для этого я создал модуль в коде ниже. Это преобразователь двоичного кода в код Грея.
library ieee;
use ieee.std_logic_1164.all;
entity gray_converter is
port (
bin : in std_logic_vector;
gray : out std_logic_vector
);
end gray_converter;
architecture rtl of gray_converter is
begin
process(bin) is
begin
gray(gray'high) <= bin(bin'high);
for i in bin'high - 1 downto bin'low loop
gray(i) <= bin(i + 1) xor bin(i);
end loop;
end process;
end architecture;
Код Грея — это альтернативная схема кодирования чисел, отличная от обычного двоичного кодирования. Основное свойство и назначение кода Грея заключается в том, что при счете между соседними числовыми значениями изменяется только один бит.
Десятичный
Двоичный
Серый
0
0000
0000
1
0001
0001
2
0010
0011
3
<тд>0011тд>
0010
<тд>4тд>
0100
<тд>0110тд> <тд>5тд>
0101
<тд>0111тд> <тд>6тд> <тд>0110тд>
0101
<тд>7тд>
0111
0100
8
1000
1100
<тд>9тд>
1001
1101
<тд>10тд> <тд>1010тд>
1111
<тд>11тд>
1011
1110
12
1100
1010
<тд>13тд>
1101
1011
14
1110
1001
15
1111
1000
В приведенной выше таблице показано, чем код Грея отличается от двоичного кода.
Тестовый стенд
Мы начнем с создания базового тестового стенда и создания экземпляра тестируемого устройства в нем. В приведенном ниже коде показан файл тестового стенда с созданным экземпляром DUT и всеми необходимыми импортами.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.env.finish;
entity gray_converter_tb is
end gray_converter_tb;
architecture sim of gray_converter_tb is
signal bin : std_logic_vector(3 downto 0) := (others => '0');
signal gray : std_logic_vector(3 downto 0);
begin
DUT : entity work.gray_converter(rtl)
port map (
bin => bin,
gray => gray
);
end architecture;
Обратите внимание, что мы импортируем std.env.finish который требует VHDL-2008. Если вы попытаетесь скомпилировать тестовый стенд в ModelSim, ничего не меняя, вы получите следующую ошибку:
# ** Warning: gray_converter_tb.vhd(6): (vcom-1516)
Package "STD.ENV" does not exist in this language version.