Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> VHDL

Управление 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 ); 

Проектирование файла стимулов

Хотя возможно много форматов, пример ниже иллюстрирует понятную, читаемую структуру. Каждая строка представляет шаг симуляции и содержит:

Комментарии, начинающие строку, игнорируются тестбенчем; комментарии после набора данных выводятся в консоль симулятора.

 # 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.

Ключевые выводы

Следуя приведенному выше примеру, вы можете использовать всю гибкость VHDL TEXTIO для управления сложными тестовыми сценариями, сохраняя чистую, поддерживаемую структуру тестбенча.

Управление VHDL-тестбенчами из внешних файлов стимулов с TEXTIO

VHDL

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