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/