5. File I/O in VHDL

In VHDL, we can perform file handling using the TextIO library. This feature is very useful for documenting the results of a program that has been created. To use the TextIO library, we need to add it at the beginning of our program as follows: 
 use std.textio.all;
use ieee.std_logic_textio.all; -- For std_logic types
 
 5.1 Read File 
 When repeatedly simulating a design, changing the value of each input one by one can be time-consuming and inefficient. Therefore, we can use a feature from the TextIO library that can read inputs from a file to be used in the design simulation. 
 Here is how to read input from a file in VHDL. First, we can define the file to be read within a process statement and open it in read_mode : 
 process
 -- Define the file and its open mode
 file text_file : text open read_mode is "filename.txt";

 -- Variable to receive data from the file
 variable fileinp : integer;

 -- Line type variable to hold a row from the text file
 variable row : line;

 -- Variale to store file reading status
 variable ok : boolean
 
 Then, we can read the file using the readline and read procedures from the TextIO library as follows: 
 begin
 while not endfile(text_file) loop --loop until the end of the text file
 readline(text_file, row); --reads the line from the file
 
 -- Skip empty lines or comments that start with '#'
 if row.all'length = 0 or row.all(1) = '#' then
 next;
 end if;

 -- Reads a variable from the line and puts it into fileinp
 read(row, fileinp, ok); 
 
 assert ok
 report "Read 'sel' failed for line: " & row.all
 severity failure; --report if the file read fails
 
 wait for delay; --delay for the read iteration
 end loop;
end process;
 
 5.2 Write File 
 Besides reading a set of inputs to be used in a testbench, we can also use the TextIO library to save the results of our testbench to a file . This allows us to analyze the results without having to use a simulator like ModelSim or Vivado. 
 Here are the steps required to write the results of a testbench to a file. First, we can define the file to be created and open it in write_mode : 
 process
 -- Open "filename.txt" in write mode
 file text_file : text open write_mode is "filename.txt";

 -- Line type variable to build a row for the text file
 variable row : line;

 -- Variable holding the data to be written to the file
 variable data_write : integer;
 
 Then, we can use the write and writeline procedures rom the TextIO library to write data to the file as follows: 
 begin
 -- writes data to the file, left-justified, 15 characters
 write(row, data_write, left, 15); 

 writeline(text_file, row); -- writes the line to the file
end process;