ECE 368 CAD-Based Logic Design Shantanu Dutt Lecture 11 File I/O and Textio in VHDL (courtesy of Karam Chatha, ASU) Files • In all the testbenches we created so far, the test stimuli were coded inside each testbench. • Hence, if we need to change the test stimuli we need to modify the model or create a new model. • Input and output files can be used to get around this problem. File Definition and Declaration • A file class needs to be defined before it can be used. file_type_defn <= type file_type_name is file of type_mark ; type integer _file is file of integer ; • Once defined, a file object can be declared. file_decl <= file id { , …} : subtype_indication [ [ open file_open_kind ] is string_expr ; type file_open_kind is (read_mode, write_mode, append_mode); file table: integer _file open read_mode is “table.dat” ; File reading • Given a file definition, VHDL implicitly provides the following subprograms: type file_type is file of element_type; procedure read ( file f: file_type; value : out element_type; length : out natural); function endfile ( file f: file_type ) return boolean; If the length of the element is greater than the length of the actual data on the file, it is placed left justified in the element. p1: process is type bit_vector_file is file of bit_vectors; file vectors: bit_vector_file open read_mode is “vec.dat”; variable next_vector : bit_vector (63 downto 0); variable actual_len: natural; begin while not endfile(vectors) loop read (vectors,next_vector,actual_len); if actual_len > next_vector’length then report “vector too long”; else for bit_index in 1 to actual_len loop …. end loop; end if; end loop; wait; end process; Example File writing • Given a file definition, VHDL implicitly provides the following subprograms: type file_type is file of element_type; procedure write ( file f: file_type; value : in element_type); Problem Description • Write a process description that writes the data of integer type from an input signal to a file. • Assume that the input signal “s1” is an “in” port of the top level entity. • Assume the file name to be “out.dat”. Example P1: process (s1) is type integer_file is file of integer; file out_file: integer_file open write_mode is “out.dat”; begin write (out_file,s1); end; Files in Subprograms • In all the examples of file I/O thus far, files are opened at the start of simulation, and automatically closed at end of simulation. • However, for files declared in subprograms, files are opened and closed at each invocation of the subprogram. Example function read_array (file_name: string; len: natural) return integer_vector is type integer_file is file of integer; file data_file: integer_file open read_mode is file_name; variable result: integer_vector(1 to len); variable index: integer := 1; begin while not endfile(data_file) and index <= len loop read(data_file, result(index)); index:= index + 1; end loop; return result; end; File open and close • In the examples discussed thus far: • we have opened the files at definition. • we have implicitly closed the files. • VHDL permits explicit opening and closing of files. File open and close VHDL provides two implicit procedures: procedure file_open (status : out file_open_status; file f: file_type; extern_name: in string; open_kind : in file_open_mode := read_mode); type file_open_status is (open_ok, status_error, name_error, mode_error); procedure file_close (file f: file_type); Open errors status_error: file object previously open and associated with a physical file. name_error: in read mode indicates file does not exist. in write mode indicates file cannot be created. in append mode indicates both. mode_error: indicates file cannot be opened in the specified mode. File procedure parameters procedure read_transform (file f: transform_file; variable transform : out transform_array) is begin for i in transform’range(1) loop for j in transform’range(2) loop if endfile(f) then report “unexpected end of file” severity error; return end if; read (f,transform(i,j)); end loop; end loop; end; VHDL does not permit reading or writing of 2-D arrays. Package textio • The file that we have created can read only one type of objects. • The package textio provides useful functions for reading general text files. • The package is part of the standard library “std”. Package textio type line is access string; type text is file of string; type side is (right,left); subtype width is natural; file input: text open read_mode is “std_input”; file output: text open write_mode is “std_output”; procedure readline (file f: text; L: inout line); procedure writeline (file f: text; L: inout line); Using textio procedures • The type “access” denotes a pointer in VHDL. • textio works with a pointer to a line of text or string. • A pointer is an object that has the starting address of the line of text. Pointer String • “readline” and “writeline” read and write an entire string that is pointed to by the pointer. textio read procedures procedure read (L : inout line; value: out bit; good: out boolean); procedure read (L : inout line; value: out bit_vector; good: out boolean); procedure read (L : inout line; value: out boolean; good: out boolean); procedure read (L : inout line; value: out character; good: out boolean); procedure read (L : inout line; value: out integer; good: out boolean); procedure read (L : inout line; value: out real; good: out boolean); procedure read (L : inout line; value: out string; good: out boolean); procedure read (L : inout line; value: out time; good: out boolean); textio read operation • Every read operation that reads a data type other than “character” skips whitespace (ws) characters: Space, Tab. Reading a character does not skip ws chars since they are legitimate characters; if they need to be skipped, then that does need to be done explicitly at the point of the ws character w/ a read: read(L,c), where “c” is of type character. • If the line contains the following items: fred “cat” 1001010 12 -4.7 a 10 ns readline(file_id,L); read (L,s); -- L is a string, s is a string read (L,s); read (L,bv); -- bv is a bit_vector read (L,i); -- i is an integer read (L,r); -- r is a real read (L,c); read(L,c); -- c is a character read (L,t); -- t is a time textio write procedures procedure write (L : inout line; value: in bit; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in bit_vector; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in boolean; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in character; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in integer; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in real; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in string; justified: in side := right; field: in width := 0); procedure write (L : inout line; value: in time; justified: in side := right; field: in width; unit: in time:= ns); textio write operation write (L,i,left,5); -- L is a line, i = 45 write (L,’ ‘); write (L,i,right,5); write (L,’ ‘); write (L,”fred”); write (L,’ ‘); write (L,”101”); write (L,’ ‘); write (L,r,left,3); -- r = 3.14159 write (L,’ ‘); write (L,t,left,0,ms); -- t = 23 micro secs writeline(file_id,L); 45bbb bbb45 fred 101 3.1 0.023 ms