]> rtime.felk.cvut.cz Git - fpga/pwm.git/blob - tb/tb_multiplier.vhd
MCC testbench tests all MCC entities/modules.
[fpga/pwm.git] / tb / tb_multiplier.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.std_logic_arith.all;
4 use ieee.std_logic_signed.all;
5
6 entity tb_multiplier is
7 end tb_multiplier;
8
9 --------------------------------------------------------------------------------
10
11 architecture testbench of tb_multiplier is
12
13   constant period : time := 2 us;
14   constant offset : time := 0 us;
15
16
17   signal clk      : std_logic;
18   signal reset    : std_logic;
19
20   signal A     : std_logic_vector (15 downto 0);
21   signal B     : std_logic_vector (15 downto 0);
22   signal prod  : std_logic_vector (31 downto 0);
23
24   signal test_vector_no : integer := 0;
25   
26
27   type test_vector_t is record
28     A    : std_logic_vector (15 downto 0);
29     B    : std_logic_vector (15 downto 0);
30     prod : std_logic_vector (31 downto 0);
31   end record;
32
33   type test_vector_array is array (natural range<>) of test_vector_t;
34
35   constant test_vectors : test_vector_array := (
36     (X"0000", X"0000", X"00000000"),
37     (X"0000", X"FFFF", X"00000000"),
38     (X"0001", X"0001", X"00000001"),
39     (X"7FFF", X"7FFF", X"3FFF0001"),
40     (X"FFFF", X"0001", X"FFFFFFFF"),
41     (X"FFFF", X"FFFF", X"00000001"),
42     (X"8000", X"7FFF", X"C0008000"),
43     (X"8000", X"FFFF", X"00008000"),
44     (X"8001", X"8001", X"BFFEFFFF"),
45     (X"8000", X"8000", X"C0000000"));
46   
47 --------------------------------------------------------------------------------
48   
49 begin
50
51   uut : entity work.multiplier
52     port map (
53       A     => A,
54       B     => B,
55       prod  => prod);
56
57   
58   CLK_PROC : process
59   begin
60     clk <= '0';
61     wait for offset;
62     
63     loop
64       clk <= '1';
65       wait for period/2;
66       clk <= '0';
67       wait for period/2;
68     end loop;
69   end process;
70
71
72   RSET_PROC : process
73   begin
74     reset <= '0';
75     wait for 1.5 * period;
76     reset <= '1';
77     wait for 1 * period;
78     reset <= '0';
79     wait;
80   end process;
81
82
83   TEST_VECTOR_PROC : process
84   begin
85     A <= (others => '0');
86     B <= (others => '0');
87     
88     wait for offset;
89     wait for 3 * period;
90     
91     for i in test_vectors'RANGE loop
92       test_vector_no <= i;
93       
94       A <= test_vectors(i).A;      
95       B <= test_vectors(i).B;
96       wait for period;
97
98       assert prod = test_vectors(i).prod
99         report "Invalid product - test vector no. " & integer'image(i)
100         severity warning;
101     end loop;
102
103     wait;
104   end process;
105   
106 end testbench;
107