Управление VHDL-тестбенчами из внешних файлов стимулов с TEXTIO
Чтение стимулирующих данных из внешнего файла — мощный способ управления Device‑Under‑Test (DUT) в VHDL. Скриптуя последовательность значений сигналов и времен симуляции в простом текстовом файле, проектировщики могут быстро менять тестовые паттерны без модификации логики тестбенча. Эта статья, вторая в серии о файловом доступе в VHDL, демонстрирует, как читать файл стимулов с библиотекой TEXTIO и применять его значения к 4-входовому мультиплексору.
Обзор тестового случая
DUT — стандартный асинхронный 4-к-1 мультиплексор с 8-битными словами данных. Тестбенч не выполняет проверку выходов — он лишь управляет входами для визуального осмотра волновой формы. Объявление сущности приведено ниже для справки.
entity mux_4 is port( din_0 : in unsigned(7 downto 0); din_1 : in unsigned(7 downto 0); din_2 : in unsigned(7 downto 0); din_3 : in unsigned(7 downto 0); sel : in unsigned(1 downto 0); dout : out unsigned(7 downto 0)); end entity;
Сигналы, подключенные к DUT, объявлены в архитектуре тестбенча и инстанцированы с меткой DUT:
signal din_0 : unsigned(7 downto 0); signal din_1 : unsigned(7 downto 0); signal din_2 : unsigned(7 downto 0); signal din_3 : unsigned(7 downto 0); signal sel : unsigned(1 downto 0); signal dout : unsigned(7 downto 0); DUT: entity work.mux_4(rtl) port map ( din_0 => din_0, din_1 => din_1, din_2 => din_2, din_3 => din_3, sel => sel, dout => dout );
Проектирование файла стимулов
Хотя возможно много форматов, пример ниже иллюстрирует понятную, читаемую структуру. Каждая строка представляет шаг симуляции и содержит:
- wait_time — задержка от предыдущего шага (например,
10 ns) - sel — 2-битное значение селектора
- din_0 — din_3 — 8-битные значения данных в шестнадцатеричном формате
- Опциональный завершающий комментарий, начинающийся с
#, для вывода в консоль
Комментарии, начинающие строку, игнорируются тестбенчем; комментарии после набора данных выводятся в консоль симулятора.
# Column description: # wait_time | sel | din_0 | din_1 | din_2 | din_3 # Optional console printout 0 ns 0 AA BB CC DD # Setting initial values 10 ns 1 AA BB CC DD # Testing by changing the selector signal 10 ns 2 AA BB CC DD 10 ns 3 AA BB CC DD 10 ns 3 A1 B1 C1 D1 # Testing by changing all data inputs 10 ns 3 A2 B2 C2 D2 10 ns 3 A3 B3 C3 D3 10 ns 3 00 00 00 D2 # Changing all unselected inputs 10 ns 3 01 02 03 D2 10 ns 3 11 22 33 D2 1 ns 0 CC DD EE FF # Changing all inputs fast 1 ns 1 DD EE FF CC 1 ns 2 EE FF CC DD 1 ns 3 FF CC DD EE 10 ns 0 00 00 00 00 # Simulation stop
Чтение файла с TEXTIO
Ниже приведен основной процесс, открывающий файл стимулов, разбирающий каждую строку, присваивающий значения входам DUT и обрабатывающий комментарии. Пример предполагает хорошо отформатированный файл — один пробел разделяет колонки, а символ # сопровождается одним пробелом.
PROC_SEQUENCER : process file text_file : text open read_mode is "stimulus.txt"; variable text_line : line; variable ok : boolean; variable char : character; variable wait_time : time; variable selector : sel'subtype; variable data : dout'subtype; begin while not endfile(text_file) loop readline(text_file, text_line); -- Skip empty lines and single‑line comments if text_line.all'length = 0 or text_line.all(1) = '#' then next; end if; read(text_line, wait_time, ok); assert ok report "Read 'wait_time' failed for line: " & text_line.all severity failure; hread(text_line, selector, ok); assert ok report "Read 'sel' failed for line: " & text_line.all severity failure; sel <= selector; hread(text_line, data, ok); assert ok report "Read 'din_0' failed for line: " & text_line.all severity failure; din_0 <= data; hread(text_line, data, ok); assert ok report "Read 'din_1' failed for line: " & text_line.all severity failure; din_1 <= data; hread(text_line, data, ok); assert ok report "Read 'din_2' failed for line: " & text_line.all severity failure; din_2 <= data; hread(text_line, data, ok); assert ok report "Read 'din_3' failed for line: " & text_line.all severity failure; din_3 <= data; wait for wait_time; -- Print trailing comment to console, if any read(text_line, char, ok); -- Skip expected newline read(text_line, char, ok); if char = '#' then read(text_line, char, ok); -- Skip expected newline report text_line.all; end if; end loop; finish; end process;
Вывод симуляции
При запуске в ModelSim консоль отображает завершающие комментарии вместе с накопленным временем симуляции. Следующий фрагмент показывает последовательность напечатанных заметок:
# ** Note: Setting initial values # Time: 0 ns Iteration: 1 Instance: /file_stim_tb # ** Note: Testing by changing the selector signal # Time: 10 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Testing by changing all data inputs # Time: 40 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all unselected inputs # Time: 70 ns Iteration: 0 Instance: /file_stim_tb # ** Note: Changing all inputs fast # Time: 91 ns Iteration: 0 Instance: /file_stim_tbf # ** Note: Simulation stop # Time: 104 ns Iteration: 0 Instance: /file_stim_tb # Break in Process PROC_SEQUENCER at file_stim_tb.vhd line 98
Волновая форма, созданная тестбенчем, отражает тайминги и значения данных из файла, позволяя проектировщикам визуально верифицировать поведение DUT.
Ключевые выводы
- Внешние файлы стимулов дают проектировщикам детальный контроль над тестовыми последовательностями без изменения кода тестбенча.
- Использование
TEXTIOсохраняет тестбенч лаконичным, но требует дисциплинированного форматирования файла. - Всегда включайте механизм самопроверки — либо сравнением с поведенческой моделью, либо встраиванием ожидаемых выходов в файл стимулов.
Следуя приведенному выше примеру, вы можете использовать всю гибкость VHDL TEXTIO для управления сложными тестовыми сценариями, сохраняя чистую, поддерживаемую структуру тестбенча.

VHDL
- Освоение операторов using в C#: импорт, псевдонимы и статические директивы
- Работа с файлами в C: мастерство ввода-вывода с fopen, fprintf, fread и fseek
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Инициализация блочной памяти FPGA из текстовых файлов с помощью библиотеки TEXTIO в VHDL
- Как создать самопроверяющийся тестбенч в VHDL — практическое руководство
- Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
- Python JSON: кодирование, декодирование и работа с файлами — практическое руководство
- Работа с файлами в Verilog: открытие, чтение, запись и закрытие
- Заголовочные файлы в C: типы, подключение и лучшие практики
- Треугольная наждачная напильник: конструкция, применение и уход