0% found this document useful (0 votes)
39 views26 pages

Basic Input and Output

The document discusses basic input and output in VHDL including file objects, file declarations, binary and text file I/O, the TEXTIO package for formatted text I/O, extending TEXTIO for other data types, useful code blocks for formatting output, reading formatted input, specifying filenames, and testing VHDL models using file I/O. It provides examples of how to perform file I/O operations in VHDL including opening, reading, writing, and closing files.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views26 pages

Basic Input and Output

The document discusses basic input and output in VHDL including file objects, file declarations, binary and text file I/O, the TEXTIO package for formatted text I/O, extending TEXTIO for other data types, useful code blocks for formatting output, reading formatted input, specifying filenames, and testing VHDL models using file I/O. It provides examples of how to perform file I/O operations in VHDL including opening, reading, writing, and closing files.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 26

Basic Input and Output

(1)
File Objects

• VHDL objects
– signals
– variables
– constants
– Files
• The file type permits us to declare and use file objects

VHDL Program

file:
type declaration
operations

(2)
File Declarations

• Files can be distinguished by the type of information stored


type text is file of string;
type IntegerFileType is file of integer;

• File declarations VHDL 1987


– file infile: text is in “inputdata.txt”;
– file outfile: text is out “outputdata.txt”;

• File declarations VHDL 1993


– file infile: text open read_mode is “inputdata.txt”;
– file outfile: text open write_mode is “outputdata.txt”;

(3)
Binary File I/O (VHDL 1993)

entity io93 is -- this entity is empty begin


end entity io93; file_open(fstatus, dataout,"myfile.txt",
architecture behavioral of io93 is write_mode); -- open the file
begin for j in 1 to 8 loop
process is write(dataout,count); -- some random
type IntegerFileType is file of integer; -- values to write to the file
file declarations count := count+2;
file dataout :IntegerFileType; end loop;
variable count : integer:= 0; wait; -- an artificial way to stop the process
variable fstatus: FILE_OPEN_STATUS; end process;
end architecture behavioral;

• VHDL provides read(f,value), write(f, value) and endfile(f)


• VHDL 93 also provides File_Open() and File_Close()
• Explicit vs. implicit file open operations

(4)
Binary File I/O (VHDL 1987)

-- variable check :integer :=0;


-- test of binary file I/O begin
-- for count in 1 to 10 loop
entity io87_write_test is check := check +1;
end io87_write_test; write(dataout, check);
architecture behavioral of io87_write_test is end loop;
begin wait;
process end process;
type IntegerFileType is file of integer; end behavioral;
file dataout :IntegerFileType is out
“output.txt”;

• VHDL 1987 provides read(f,value), write(f, value) and endfile(f)


• Implicit file open operations via file declarations

(5)
The TEXTIO Package
file
writeline()
line line
read(buf,c) line

write(buf,arg) line

• A file is organized by lines


• read() and write() procedures operate on line data structures
• readline() and writeline() procedures transfer data from-to files
• Text based I/O
• All procedures encapsulated in the TEXTIO package in the
library STD
– Procedures for reading and writing the pre-defined types from
lines
– Pre-defined access to std_input and std_output
– Overloaded procedure names
(6)
Example: Use of the TEXTIO Package
use STD.Textio.all; L1: write(buf, “This is an example of
entity formatted_io is -- this entity is empty formatted I/O”);
end formatted_io; L2: writeline(outfile, buf); -- write buffer to
architecture behavioral of formatted_io is file
begin L3: write(buf, “The First Parameter is =”);
process is L4: write(buf, count);
file outfile :text; -- declare the file to be a text file L5: write(buf, ‘ ‘);
variable fstatus :File_open_status; L6: write(buf, “The Second Parameter is = “);
variable count: integer := 5; L7: write(buf, value);
variable value : bit_vector(3 downto 0):= X”6”; L8: writeline(outfile, buf);
variable buf: line; -- buffer to file L9: write(buf, “...and so on”);
begin L10: writeline(outfile, buf);
file_open(fstatus, outfile,”myfile.txt”, L11: file_close(outfile); -- flush the buffer to
write_mode); -- open the file for writing the file
wait;
end process;
end architecture behavioral;

This is an example of formatted IO


Result The First Parameter is = 5 The Second Parameter is = 0110
...and so on

(7)
Extending TEXTIO for Other Datatypes

• Hide the ASCII format of TEXTIO from the user

• Create type conversion procedures for reading and


writing desired datatypes, e.g., std_logic_vector

• Encapsulate procedures in a package

• Install package in a library and make its contents


visible via the use clause

(8)
Example: Type Conversion

procedure write_v1d (variable f: out when ‘-’ => write(buf, ‘-’);


text; v : in std_logic_vector) is when ‘W’ => write(buf, ‘W’);
variable buf: line; when ‘L’ => write(buf, ‘L’);
variable c : character; when ‘H’ => write(buf, ‘H’);
begin when others => write(buf, character’(‘0’));
for i in v’range loop end case;
case v(i) is end loop;
when ‘X’ => write(buf, ‘X’); writeline (f, buf);
when ‘U’ => write(buf, ‘U’); end procedure write_v1d;
when ‘Z’ => write(buf, ‘Z’);
when ‘0’ => write(buf, character’(‘0’));
when ‘1’ => write(buf, character’(‘1’));

• Text based type conversion for user defined types


• Note: writing values vs. ASCII codes

(9)
Example: Type Conversion
procedure read_v1d (variable f:in text;
v : out std_logic_vector) is
variable buf: line;
variable c : character; when ‘0’ => v (i) := ‘0’;
when ‘1’ => v (i) := ‘1’;
begin when ‘-’ => v (i) := ‘-’;
readline(f, buf); when ‘W’ => v (i) := ‘W’;
for i in v’range loop when ‘L’ => v (i) := ‘L’;
read(buf, c); when ‘H’ => v (i) := ‘H’;
case c is when others => v (i) := ‘0’;
when ‘X’ => v (i) := ‘X’; end case;
when ‘U’ => v (i) := ‘U’; end loop;
when ‘Z’ => v (i) := ‘Z’; end procedure read_v1d

• read() is a symmetric process

(10)
Useful Code Blocks (from Bhasker95)

• Formatting the output


write (buf, “This is the header”);
writeline (outfile,buf);
write (buf, “Clk =”);
write (buf, clk);
write (buf, “, N1 =”);
write (buf, N1);
• Text output will appear as follows
This is the header
Clk = 0, N1 = 01001011

(11)
Useful Code Blocks (Bhaskar95)

• Reading formatted input lines


# this file is parsed to separate comments
0001 65 00Z111Z0
0101 43 0110X001

bit vector integer std_logic_vector

• The code block to read such files may be


while not (endfile(vectors) loop
readline(vectors, buf);
if buf(1) = ‘#’ then
continue;
end if;
convert to std_logic_vector
read(buf, N1);
read (buf, N2);
read (buf, std_str);

(12)
Useful Code Blocks: Filenames

process is
variable buf : line;
variable fname : string(1 to 10);
begin
--
-- prompt and read filename from standard input
--
write(output, “Enter Filename: “);
readline(input,buf);
read(buf, fname);
--
-- process code
--
end process;

• Assuming “input” is mapped to simulator console


– Generally “input” and “output” are mapped to standard input
and standard output respectively

(13)
Useful Code Blocks: Testing Models

library IEEE;

use IEEE.std_logic_1164.all; my I/O library


use STD.textio.all;
use Work.classio.all;
-- the package classio has been compiled into the working directory

entity checking is
end checking; -- the entity is an empty entity

architecture behavioral of checking is


begin

-- use file I/O to read test vectors and write test results
Testing process

end architecture behavioral;

(14)
Useful Code Blocks: Testing Models (cont.)

process is
-- use implicit file open
--
file infile : TEXT open read_mode is "infile.txt";
file outfile : TEXT open write_mode is "outfile.txt";
variable check : std_logic_vector (15 downto 0) := x"0008";
begin
-- copy the input file contents to the output file
while not (endfile (infile)) loop
read_v1d (infile, check); Can have a model here to test
--
--
write_v1d (outfile, check);
end loop;
file_close(outfile); -- flush buffers to output file
wait; -- artificial wait for this example Example: Usually will not have this in your models
end process;
end architecture behavioral;

(15)
Testbenches

Testbench output port

Model
Tester under
Test
tester. vhd model.vhd
input port
testbench.vhd

• Testbenches are transportable


• General approach: apply stimulus vectors and measure
and record response vectors
• Application of predicates establish correct operation of
the model under test

(16)
Example
library IEEE;
use IEEE.std_logic_1164.all;
use STD.textio.all;
use WORK.classio.all; -- declare the I/O package
entity srtester is -- this is the module generating the tests
port (R, S, D, Clk : out std_logic;
Q, Qbar : in std_logic);
end entity srtester;
architecture behavioral of srtester is
begin
clk_process: process -- generates the clock waveform with
begin -- period of 20 ns
Clk<= ‘1’, ‘0’ after 10 ns, ‘1’ after 20 ns, ‘0’ after 30 ns;
wait for 40 ns;
end process clk_process;

•Tester module to generate periodic signals and apply test vectors

(17)
Example (cont.)

Example (cont.)
io_process: process -- this process performs the test
file infile : TEXT is in “infile.txt”; -- functions
file outfile : TEXT is out “outfile.txt”;
variable buf : line;
variable msg : string(1 to 19) := “This vector failed!”;
variable check : std_logic_vector (4 downto 0);
begin
while not (endfile (infile)) loop -- loop through all test vectors in
read_v1d (infile, check); -- the file
-- make assignments here
wait for 20 ns; -- wait for outputs to be available after applying
if (Q /= check (1) or (Qbar /= check(0))) then -- error check
write (buf, msg);
writeline (outfile, buf);
write_v1d (outfile, check);
end if;
end loop;
wait; -- this wait statement is important to allow the simulation to halt!
end process io_process;
end architectural behavioral;

(18)
Structuring Testers

library IEEE;
use IEEE.std_logic_1164.all;
use WORK.classio.all; -- declare the I/O package
entity srbench is
end srbench;
architecture behavioral of srbench is
--
-- include component declarations here
--
-- configuration specification
--
for T1:srtester use entity WORK.srtester (behavioral);
for M1: asynch_dff use entity WORK.asynch_dff (behavioral);
signal s_r, s_s, s_d, s_q, s_qb, s_clk : std_logic;
begin
T1: srtester port map (R=>s_r, S=>s_s, D=>s_d, Q=>s_q, Qbar=>s_qb, Clk =>
s_clk);
M1: asynch_dff port map (R=>s_r, S=>s_s, D=>s_d, Q=>s_q, Qbar=>s_qb, Clk
=> s_clk);
end behavioral;

(19)
Stimulus Generation

• Stimulus vectors as well as reference vectors for


checking
• Stimulus source
• “on the fly” generation
– Local constant arrays
– File I/O
• Clock and reset generation
– Generally kept separate from stimulus vectors
– Procedural stimulus

(20)
Stimulus Generation: Example (Smith96)

process
begin
databus <= (others => ‘0’);
for N in 0 to 65536 loop
databus <= to_unsigned(N,16) xor
shift_right(to_unsigned(N,16),1);
for M in 1 to 7 loop
wait until rising_edge(clock);
end loop;
wait until falling_edge(Clock);
end loop;
--
-- rest of the the test program
--
end process;

• Test generation vs. File I/O: how many vectors would be need?

(21)
Stimulus Generation: Example (Smith96)

while not endfile(vectors) loop


readline(vectors, vectorline); -- file format is 1011011
if (vectorline(1) = ‘#’ then
next;
end if;
read(vectorline, datavar);
read((vectorline, A); -- A, B, and C are two bit vectors
read((vectorline, B); -- of type std_logic
read((vectorline, C);
--
--signal assignments
Indata <= to_stdlogic(datavar);
A_in <= unsigned(to_stdlogicvector(A)); -- A_in, B_in and C_in are of
B_in <= unsigned(to_stdlogicvector(B)); -- unsigned vectors
C_in <= unsigned(to_stdlogicvector(C));
wait for ClockPeriod;
end loop;

(22)
Validation

• Compare reference vectors with response vectors


and record errors in external files

• In addition to failed tests record simulation time

• May record additional simulation state

(23)
The “ASSERT” Statement

assert Q = check(1) and Qbar = check(0)


report “Test Vector Failed”
severity error;

Example of Simulator Console Output


Selected Top-Level: srbench (behavioral)
: ERROR : Test Vector Failed
: Time: 20 ns, Iteration: 0, Instance: /T1.
: ERROR : Test Vector Failed
: Time: 100 ns, Iteration: 0, Instance: /T1.

• Designer can report errors at predefined levels: NOTE,


WARNING, ERROR and FAILURE (enumerated type)
• Report argument is a character string written to simulation output
• Actions are simulator specific
• Concurrent vs. sequential assertion statements
• TEXTIO may be faster than ASSERT if we are not stopping the
simulation

(24)
Example: (Bhaskar 95)
architecture check_times of DFF is
constant hold_time: time:=5 ns;
constant setup_time : time:= 2 ns;
begin
process
variable lastevent: time;
begin
if d’event then
assert NOW = 0 ns or (NOW - lastevent) >=
hold_time
report “Hold time too short”
severity FAILURE;
lastevent := NOW;
end if;
-- check setup time
-- D flip flop behavioral model
end process;
end architecture check_times

• Report statements may be used in isolation

(25)
Summary

• Basic input/output
– ASCII I/O and the TEXTIO package
– binary I/O
– VHDL 87 vs. VHDL 93

• Testbenches

• The ASSERT statement

(26)

You might also like