相应加法器的测试向量(test bench).vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:4k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- download from: www.pld.com.cn & www.fpga.com.cn 
  2. entity testbench is
  3. end;
  4. ------------------------------------------------------------------------
  5. -- testbench for 8-bit adder
  6. ------------------------------------------------------------------------
  7. library IEEE;
  8. use IEEE.std_logic_1164.all;
  9. architecture adder8 of testbench is 
  10.     component adderN 
  11. generic(N : integer);
  12. port (a    : in std_logic_vector(N downto 1);
  13.       b    : in std_logic_vector(N downto 1);
  14.       cin  : in std_logic;
  15.       sum  : out std_logic_vector(N downto 1);
  16.       cout : out std_logic);
  17.     end component;
  18.     constant N : integer := 8;
  19.     signal a    : std_logic_vector(N downto 1);
  20.     signal b    : std_logic_vector(N downto 1);
  21.     signal cin  : std_logic;
  22.     signal sum  : std_logic_vector(N downto 1);
  23.     signal cout : std_logic;
  24.     type test_record_t is record
  25. a :  std_logic_vector(N downto 1);
  26. b :  std_logic_vector(N downto 1);
  27. cin :  std_logic;
  28. sum :  std_logic_vector(N downto 1);
  29. cout :  std_logic;
  30.     end record;
  31.     type test_array_t is array(positive range <>) of test_record_t;
  32.     constant test_patterns : test_array_t := (
  33. (a => "00000000", b => "00000001", cin => '0', sum => "00000001", cout => '0'),
  34. (a => "00000001", b => "00000001", cin => '0', sum => "00000010", cout => '0'),
  35. (a => "00000001", b => "00000001", cin => '1', sum => "00000011", cout => '0'),
  36. (a => "00001010", b => "00000011", cin => '0', sum => "00001101", cout => '0'),
  37. (a => "00000011", b => "00001010", cin => '0', sum => "00001101", cout => '0'),
  38. (a => "00000101", b => "00000001", cin => '1', sum => "00001000", cout => '0'),
  39. (a => "00000011", b => "11111100", cin => '0', sum => "11111111", cout => '0'),
  40. (a => "00000011", b => "11111100", cin => '1', sum => "00000000", cout => '1'),
  41. (a => "01010101", b => "01010101", cin => '0', sum => "10101010", cout => '0'),
  42. (a => "00000000", b => "00000000", cin => '0', sum => "00000000", cout => '0')
  43.     );
  44.     --
  45.     -- convert a std_logic value to a character
  46.     --
  47.     type stdlogic_to_char_t is array(std_logic) of character;
  48.     constant to_char : stdlogic_to_char_t := (
  49. 'U' => 'U',
  50. 'X' => 'X',
  51. '0' => '0',
  52. '1' => '1',
  53. 'Z' => 'Z',
  54. 'W' => 'W',
  55. 'L' => 'L',
  56. 'H' => 'H',
  57. '-' => '-');
  58.     --
  59.     -- convert a std_logic_vector to a string
  60.     --
  61.     function to_string(inp : std_logic_vector)
  62.     return string
  63.     is
  64. alias vec : std_logic_vector(1 to inp'length) is inp;
  65. variable result : string(vec'range);
  66.     begin
  67. for i in vec'range loop
  68.     result(i) := to_char(vec(i));
  69. end loop;
  70. return result;
  71.     end;
  72. begin
  73.     -- instantiate the component
  74.     uut: adderN generic map(N)
  75. port map(a => a,
  76.  b => b,
  77.  cin => cin,
  78.  sum => sum,
  79.  cout => cout);
  80.  
  81.     -- provide stimulus and check the result
  82.     test: process
  83. variable vector : test_record_t;
  84. variable found_error : boolean := false;
  85.     begin
  86. for i in test_patterns'range loop
  87.     vector := test_patterns(i);
  88.     -- apply the stimuls
  89.     a <= vector.a;
  90.     b <= vector.b;
  91.     cin <= vector.cin;
  92.     -- wait for the outputs to settle
  93.     wait for 100 ns;
  94.     -- check the results
  95.     if (sum  /= vector.sum) then
  96. assert false
  97.     report "Sum is " & to_string(sum)
  98.     & ". Expected " & to_string(vector.sum);
  99. found_error := true;
  100.     end if;
  101.     if (cout /= vector.cout) then
  102. assert false
  103.     report "Cout is " & to_char(cout) & ". "
  104.     & "Expected value is " & to_char(vector.cout);
  105. found_error := true;
  106.     end if;
  107. end loop;
  108. assert not found_error
  109.   report "There were ERRORS in the test."
  110.   severity note;
  111. assert found_error
  112.   report "Test completed with no errors."
  113.   severity note;
  114. wait;
  115.     end process;
  116. end;
  117. configuration test_adder_behavioral of testbench is
  118.     for adder8
  119. for all: adderN 
  120.     use entity work.adderN(behavioral);
  121. end for;
  122.     end for;
  123. end test_adder_behavioral;
  124. configuration test_adder_structural of testbench is
  125.     for adder8
  126. for all: adderN 
  127.     use entity work.adderN(structural);
  128.     for structural
  129. -- configure the components that are generated 
  130. for gen
  131.     for all : adder
  132. use entity work.adder(structural);
  133.     end for;
  134. end for;
  135.     end for;
  136. end for;
  137.     end for;
  138. end test_adder_structural;