parser: erste gehversuche. im moment wird die eingabe einfach zurueckgegeben zur...
[hwmod.git] / src / beh_parser_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_parser_tb is
7 end entity beh_parser_tb;
8
9 architecture sim of beh_parser_tb is
10         -- system
11         signal sys_clk, sys_res_n : std_logic;
12         -- history
13         signal p_rw, p_rget, p_rdone, p_wtake, p_wdone, p_finished : std_logic;
14         signal p_read, p_write : hbyte;
15         signal p_spalte : hspalte;
16
17         -- alu
18         signal opcode : alu_ops;
19         signal op1, op2, op3 : csigned;
20         signal do_calc, calc_done : std_logic;
21
22         --scanner
23         signal do_it : std_logic;
24         signal finished : std_logic;
25
26         signal stop : boolean := false;
27 begin
28         inst : entity work.parser(beh)
29         port map
30         (
31                 sys_clk => sys_clk,
32                 sys_res_n => sys_res_n,
33                 p_rw => p_rw,
34                 p_spalte => p_spalte,
35                 p_rget => p_rget,
36                 p_rdone => p_rdone,
37                 p_read => p_read,
38                 p_wtake => p_wtake,
39                 p_wdone => p_wdone,
40                 p_write => p_write,
41                 p_finished => p_finished,
42                 -- ALU
43                 opcode => opcode,
44                 op1 => op1,
45                 op2 => op2,
46                 op3 => op3,
47                 do_calc => do_calc,
48                 calc_done => calc_done,
49                 -- TODO: calc_error : in std_logic;
50                 -- Scanner
51                 do_it => do_it,
52                 finished => finished
53         );
54
55         instalu : entity work.alu(beh)
56         port map
57         (
58                 sys_clk => sys_clk,
59                 sys_res_n => sys_res_n,
60                 do_calc => do_calc,
61                 calc_done => calc_done,
62                 op1 => op1,
63                 op2 => op2,
64                 op3 => op3,
65                 opcode => opcode
66         );
67
68         process
69         begin
70                 sys_clk <= '0';
71                 wait for 15 ns;
72                 sys_clk <= '1';
73                 wait for 15 ns;
74                 if stop = true then
75                         wait;
76                 end if;
77         end process;
78
79         process
80                 -- textio stuff
81                 use std.textio.all;
82                 file f : text open read_mode is "../../src/parser.test";
83                 variable l : line;
84
85                 variable input : hstring;
86                 variable expectedresult : hstring;
87                 variable realresult : hstring;
88
89                 variable checkall : boolean := true;
90                 variable run_tc : boolean := true;
91                 variable i, j, k : natural;
92         begin
93                 -- init & reset
94                 sys_res_n <= '0';
95                 p_rdone <= '0';
96                 p_wdone <= '0';
97                 p_read <= (others => '0');
98                 do_it <= '0';
99
100                 icwait(sys_clk, 5);
101                 sys_res_n <= '1';
102
103                 i := 1;
104                 f_loop : while not endfile(f) loop
105                         realresult := (others => character'val(0));
106
107                         f1_loop : while not endfile(f) loop
108                                 readline (f, l);
109                                 input := (others => character'val(0));
110                                 if (l'length <= 72) then
111                                         input(1 to l'length) := l.all;
112                                         if (input(1) = '#') then
113                                                 next f1_loop;
114                                         else
115                                                 exit f1_loop;
116                                         end if;
117                                 else
118                                         report "fehler in parser.test: eingabe zu lange in testfall " & natural'image(i);
119                                         next f_loop;
120                                 end if;
121                         end loop f1_loop;
122
123                         f2_loop : while not endfile(f) loop
124                                 readline (f, l);
125                                 expectedresult := (others => character'val(0));
126                                 if (l'length <= 72) then
127                                         expectedresult(1 to l'length) := l.all;
128                                         if (expectedresult(1) = '#') then
129                                                 next f2_loop;
130                                         else
131                                                 exit f2_loop;
132                                         end if;
133                                 else
134                                         report "fehler in parser.test: eingabe zu lange in testfall " & natural'image(i);
135                                         next f_loop;
136                                 end if;
137                         end loop f2_loop;
138
139                         report "testcase(" & natural'image(i) & ").input: " & input;
140                         report "testcase(" & natural'image(i) & ").expectedresult: " & expectedresult;
141                         i := i + 1;
142
143                         icwait(sys_clk, 5);
144                         do_it <= '1';
145                         run_tc := true;
146                         j := 1; k := 1;
147
148                         while run_tc loop
149                                 wait on p_rget, p_wtake, p_finished, finished;
150                                 icwait(sys_clk, 2);
151
152                                 if p_rget = '1' then
153                                         p_read <= hbyte( to_unsigned(character'pos(input(j)),8) );
154                                         p_rdone <= '1';
155                                         j := j + 1;
156                                 end if;
157                                 if p_rget = '0' then
158                                         p_rdone <= '0';
159                                 end if;
160
161                                 if p_wtake = '1' then
162                                         realresult(k) := character'val(to_integer(unsigned(p_write)));
163                                         p_wdone <= '1';
164                                         k := k + 1;
165                                 end if;
166                                 if p_wtake = '0' then
167                                         p_wdone <= '0';
168                                 end if;
169
170                                 if p_finished = '1' or finished = '1' then
171                                         run_tc := false;
172                                 end if;
173                         end loop;
174                         
175                         do_it <= '0';
176                         report "realresult: " & realresult;
177                         if realresult /= expectedresult then
178                                 checkall := false;
179                         end if;
180                         report "==================";
181                 end loop f_loop;
182
183                 if checkall then
184                         report "alle testfaelle des Parser waren erfolgreich!";
185                 else
186                         report "nicht alle testfaelle des Parsers waren erfolgreich!";
187                 end if;
188                 stop <= true;
189                 wait;
190         end process;
191 end architecture sim;