-----------------------------------------------------------------------
-- testbench for 8-bit adder
-- reads file "vectors"
-----------------------------------------------------------------------
-
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE std.textio.ALL;
ARCHITECTURE adder8 OF testbench2 IS
-----------------------------------
-- component declaration for adderN
-----------------------------------
COMPONENT addern
GENERIC(n : integer);
PORT (a : IN std_logic_vector(n DOWNTO 1);
b : IN std_logic_vector(n DOWNTO 1);
cin : IN std_logic;
sum : OUT std_logic_vector(n DOWNTO 1);
cout : OUT std_logic);
END COMPONENT;
-- declare one large signal
SIGNAL ports : std_logic_vector(26 DOWNTO 1) := (OTHERS => 'Z');
-- declare an alias for each port
-- this makes it easier to connect the signals to the component
ALIAS a : std_logic_vector(8 DOWNTO 1) IS ports(26 DOWNTO 19);
ALIAS b : std_logic_vector(8 DOWNTO 1) IS ports(18 DOWNTO 11);
ALIAS cin : std_logic IS ports(10);
ALIAS sum : std_logic_vector(8 DOWNTO 1) IS ports(9 DOWNTO 2);
ALIAS cout : std_logic IS ports(1);
BEGIN
-- instantiate the component
uut: addern GENERIC MAP(8)
PORT MAP(a => a,
b => b,
cin => cin,
sum => sum,
cout => cout);
-- provide stimulus and check the result
test: PROCESS
FILE vector_file : text IS IN "vectors";
VARIABLE l : line;
VARIABLE vector_time : time;
VARIABLE r : real;
VARIABLE good_number : boolean;
VARIABLE signo : integer;
BEGIN
WHILE NOT endfile(vector_file) LOOP
readline(vector_file, l);
-- read the time from the beginning of the line
-- skip the line if it doesn't start with a number
read(l, r, good => good_number);
NEXT WHEN NOT good_number;
vector_time := r * 1 ns; -- convert real number to time
IF (now < vector_time) THEN -- wait until the vector time
WAIT FOR vector_time - now;
END IF;
signo := 26;
FOR i IN l'RANGE LOOP
CASE l(i) IS
WHEN '0' => -- Drive 0
ports(signo) <= '0';
WHEN '1' => -- Drive 1
ports(signo) <= '1';
WHEN 'h' | 'H' => -- Test for 1
ASSERT ports(signo) = '1';
WHEN 'l' | 'L' => -- Test for 0
ASSERT ports(signo) = '0';
WHEN 'x' | 'X' => -- Don't care
NULL;
WHEN ' ' | ht => -- Skip white space
NEXT;
WHEN OTHERS =>
-- Illegal character
ASSERT false
REPORT "Illegal character in vector file: " & l(i);
EXIT;
END CASE;
signo := signo - 1;
END LOOP;
END LOOP;
ASSERT false REPORT "Test complete";
WAIT;
END PROCESS;
END;
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |