Basic Input and Output
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
(3)
Binary File I/O (VHDL 1993)
(4)
Binary File I/O (VHDL 1987)
(5)
The TEXTIO Package
file
writeline()
line line
read(buf,c) line
write(buf,arg) line
(7)
Extending TEXTIO for Other Datatypes
(8)
Example: Type Conversion
(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
(10)
Useful Code Blocks (from Bhasker95)
(11)
Useful Code Blocks (Bhaskar95)
(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;
(13)
Useful Code Blocks: Testing Models
library IEEE;
entity checking is
end checking; -- the entity is an empty entity
-- use file I/O to read test vectors and write test results
Testing process
(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
Model
Tester under
Test
tester. vhd model.vhd
input port
testbench.vhd
(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;
(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
(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)
(22)
Validation
(23)
The “ASSERT” Statement
(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
(25)
Summary
• Basic input/output
– ASCII I/O and the TEXTIO package
– binary I/O
– VHDL 87 vs. VHDL 93
• Testbenches
(26)