8. Несинтезируемые конструкции VHDL
Сами по себе языки описания аппаратуры имеют в себе как подмножество синтезируемых конструкций, т.е. тех, которые превращаются в схемы, так и набор не синтезируемых конструкций: эти конструкции могут быть использованы для описания поведения, которое будет выполняться при моделировании, но оно не имеет возможности превратиться в схему из логических элементов.
Тестбенч
Тестбенч (testbench) - это код, написанный на языке описания аппаратуры (как правило), используемый для создания воздействий на тестируемый код каких-либо воздействий и анализа результатов этих воздействий. По изначальной идее тестбенч - это стол, на котором стоит проверочное оборудование (генератор, блок питания, осциллограф, вольтметр и др.), которое настраивается под конкретную задачу, и на этот стол разработчик располагает элемент изделия, скажем, электрическую плату питания. Эту плату разработчик подключает проводами с одной стороны к оборудованию с другой стороны в соответствующие разъемы платы. После этого оборудование по очереди запускается с целью выявить потенциально возможные огрехи работы платы (плата не запускается, плата запускается и ничего не делает и др.).
картинка тестбенчка из презы елисея
Аналогично необходимо подготовить "стол" для проведения тестирования разрабатываемого кода.
Инициализация тестбенча
Текст кода инициализации тестбенча концептуально требует следующего: в архитектуре рядом с сигналами объявить о подключаемом компоненте (тестируемом коде), создать сигналы-"проводники", которыми будет произведено "подключение" ко входам и выходам тестируемого кода и в теле архитектуры произвести подключение. После этих операций можно писать сам код воздействий на блок.
Напишем тестбенч для следующего кода:
Как и у любого другого кода, у тестбенча неизменными остаются главные компоненты: объявление библиотек, описание entity и описание архитектуры.
library ieee;
use ieee.std_logic_1164.all;
entity no_sig_tb is
end entity;
architecture tb of no_sig_tb is
begin
end tb;
Однако, поскольку тестбенч подразумевает собой обертку вокруг тестируемого кода, входов и выходов у тестбенча может не быть, поэтому блок сущности можно оставить пустым. Добавим компонент и сигналы в архитектуру
library ieee;
use ieee.std_logic_1164.all;
entity no_sig_tb is
end entity;
architecture tb of no_sig_tb is
component no_sig is
port(
a1 : in std_logic;
a2 : in std_logic;
o1 : out std_logic
);
end component;
signal a1_sig : std_logic :='0';
signal a2_sig : std_logic:='0';
signal o1_sig : std_logic:='0';
begin
end tb;
конструкцией component производится объявление о том, какой внешний вид схемы, которую в данном тестбенче планируется подключать для работы, по сути это entity кода выше; сигналов понадобится столько же сколько и портов. Подключение компонента производится через создание уникальной копии компонента, instance, к которой описывается подключение сигналов.
Так же хорошее объяснение построения тестового окружения можно посмотреть по ссылке: https://fpgatutorial.com/how-to-write-a-basic-testbench-using-vhdl/