alu_mul-fail: minimal beispiel...
[hwmod.git] / src / beh_alu_tb.vhd
1 library ieee;
2 use ieee.std_logic_1164.all;
3 use ieee.numeric_std.all;
4 use work.gen_pkg.all;
5
6 entity beh_alu_tb is
7 end entity beh_alu_tb;
8
9 architecture sim of beh_alu_tb is
10         component alu is
11                 port
12                 (
13                         sys_clk : in std_logic;
14                         sys_res_n : in std_logic;
15                         opcode : in alu_ops;
16                         op1 : in csigned;
17                         op2 : in csigned;
18                         op3 : out csigned;
19                         do_calc : in std_logic;
20                         calc_done : out std_logic
21                 );
22         end component alu;
23
24         signal sys_clk, sys_res_n, do_calc, calc_done : std_logic;
25         signal opcode : alu_ops;
26         signal op1, op2, op3 : csigned;
27         signal stop : boolean := false;
28 begin
29         inst : alu
30         port map
31         (
32                 sys_clk => sys_clk,
33                 sys_res_n => sys_res_n,
34                 do_calc => do_calc,
35                 calc_done => calc_done,
36                 op1 => op1,
37                 op2 => op2,
38                 op3 => op3,
39                 opcode => opcode
40         );
41
42         process
43         begin
44                 sys_clk <= '0';
45                 wait for 15 ns;
46                 sys_clk <= '1';
47                 wait for 15 ns;
48                 if stop = true then
49                         wait;
50                 end if;
51         end process;
52
53         process
54                 type alu_testv is record
55                         o1 : cinteger;
56                         o : alu_ops;
57                         o2 : cinteger;
58                         expected : cinteger;
59                 end record alu_testv;
60
61                 -- ggf. groesse des arrays erhoehen
62                 type alu_testv_array is array (natural range 0 to 5) of alu_testv;
63
64                 variable testmatrix : alu_testv_array :=
65                         ( 0 => (7, ALU_MUL, 3, 21),
66                           1 => (-7, ALU_MUL, 3, -21),
67                           2 => (268435456, ALU_MUL, -2, -536870912),
68                           3 => (268435456, ALU_MUL, 2**5, 0), -- um fuenf nach links shiften
69                           4 => (268435456 + 5, ALU_MUL, 2**5, 160), -- = 5 * (2^5)
70                           others => (0, ALU_MUL, 0, 0)
71                         );
72
73         begin
74                 -- init & reset
75                 sys_res_n <= '0';
76                 do_calc <= '0';
77                 opcode <= ALU_NOP;
78                 op1 <= (others => '0');
79                 op2 <= (others => '0');
80
81                 icwait(sys_clk, 30);
82                 sys_res_n <= '1';
83
84                 for i in testmatrix'range loop
85                         icwait(sys_clk, 10);
86                         op1 <= to_signed(testmatrix(i).o1,CBITS);
87                         opcode <= testmatrix(i).o;
88                         op2 <= to_signed(testmatrix(i).o2,CBITS);
89
90                         -- berechnung kann los gehen
91                         do_calc <= '1';
92
93                         -- warten auf die alu einheit
94                         wait on calc_done;
95                         icwait(sys_clk, 1);
96
97                         assert op3 = to_signed(testmatrix(i).expected,CBITS)
98                                 report "" & cinteger'image(testmatrix(i).o1) & 
99                                 " " & integer'image(to_integer(signed(opcode))) &
100                                 " " & cinteger'image(testmatrix(i).o2) &
101                                 "/= " & integer'image(to_integer(op3)) &
102                                 " -- erwartet: " & cinteger'image(testmatrix(i).expected);
103
104                         icwait(sys_clk, 2);
105                         -- ack it!
106                         do_calc <= '0';
107                 end loop;
108
109                 assert false
110                         report "alle testfaelle der ALU waren erfolgreich!";
111                 stop <= true;
112                 wait;
113         end process;
114 end architecture sim;