parser: ausdruecke werden erfolgreich geparst, einschraenkungen:
[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, calc_error : 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                 calc_error => calc_error,
50                 -- TODO: calc_error : in std_logic;
51                 -- Scanner
52                 do_it => do_it,
53                 finished => finished
54         );
55
56         instalu : entity work.alu(beh)
57         port map
58         (
59                 sys_clk => sys_clk,
60                 sys_res_n => sys_res_n,
61                 do_calc => do_calc,
62                 calc_done => calc_done,
63                 calc_error => calc_error,
64                 op1 => op1,
65                 op2 => op2,
66                 op3 => op3,
67                 opcode => opcode
68         );
69
70         process
71         begin
72                 sys_clk <= '0';
73                 wait for 15 ns;
74                 sys_clk <= '1';
75                 wait for 15 ns;
76                 if stop = true then
77                         wait;
78                 end if;
79         end process;
80
81         process
82                 -- textio stuff
83                 use std.textio.all;
84                 file f : text open read_mode is "../../src/parser.test";
85                 variable l : line;
86
87                 variable input : hstring;
88                 variable expectedresult : hstring;
89                 variable realresult : hstring;
90                 variable hstrtmp : hstring;
91
92                 variable checkall : boolean := true;
93                 variable run_tc : boolean := true;
94                 variable i, j, k, y : natural;
95         begin
96                 -- init & reset
97                 sys_res_n <= '0';
98                 p_rdone <= '0';
99                 p_wdone <= '0';
100                 p_read <= (others => '0');
101                 do_it <= '0';
102
103                 icwait(sys_clk, 5);
104                 sys_res_n <= '1';
105
106                 i := 1;
107                 f_loop : while not endfile(f) loop
108                         realresult := (71 => character'val(0), others => character'val(32));
109
110                         f1_loop : while not endfile(f) loop
111                                 readline (f, l);
112                                 input := (others => character'val(0));
113                                 if (l'length <= 72) then
114                                         input(1 to l'length) := l.all;
115                                         if (input(1) = '#') then
116                                                 next f1_loop;
117                                         else
118                                                 exit f1_loop;
119                                         end if;
120                                 else
121                                         report "fehler in parser.test: eingabe zu lange in testfall " & natural'image(i);
122                                         next f_loop;
123                                 end if;
124                         end loop f1_loop;
125
126                         f2_loop : while not endfile(f) loop
127                                 readline (f, l);
128                                 expectedresult := (others => character'val(0));
129                                 if (l'length <= 72) then
130                                         expectedresult(1 to l'length) := l.all;
131                                         if (expectedresult(1) = '#') then
132                                                 next f2_loop;
133                                         else
134                                                 y := l'length;
135                                                 exit f2_loop;
136                                         end if;
137                                 else
138                                         report "fehler in parser.test: eingabe zu lange in testfall " & natural'image(i);
139                                         next f_loop;
140                                 end if;
141                         end loop f2_loop;
142
143                         -- ergebnis string richtig formatieren
144                         hstrtmp := expectedresult;
145                         expectedresult := (71 => character'val(0), others => character'val(32));
146                         for x in 1 to 70 loop
147                                 if hstrtmp(x) /= character'val(0) then
148                                         expectedresult((70-y) + x) := hstrtmp(x);
149                                 end if;
150                         end loop;
151
152
153                         report "testcase(" & natural'image(i) & ").input: " & input;
154                         report "testcase(" & natural'image(i) & ").expectedresult: " & expectedresult;
155                         i := i + 1;
156
157                         icwait(sys_clk, 5);
158                         do_it <= '1';
159                         run_tc := true;
160                         j := 1; k := 70;
161
162                         while run_tc loop
163                                 wait on p_rget, p_wtake, p_finished, finished;
164                                 icwait(sys_clk, 2);
165
166                                 if p_rget = '1' then
167                                         p_read <= hbyte( to_unsigned(character'pos(input(j)),8) );
168                                         p_rdone <= '1';
169                                         j := j + 1;
170                                 end if;
171                                 if p_rget = '0' then
172                                         p_rdone <= '0';
173                                 end if;
174
175                                 if p_wtake = '1' then
176                                         realresult(k) := character'val(to_integer(unsigned(p_write)));
177                                         p_wdone <= '1';
178                                         k := k - 1;
179                                 end if;
180                                 if p_wtake = '0' then
181                                         p_wdone <= '0';
182                                 end if;
183
184                                 if p_finished = '1' or finished = '1' then
185                                         run_tc := false;
186                                 end if;
187                         end loop;
188                         
189                         do_it <= '0';
190                         report "realresult                : " & realresult;
191                         if realresult /= expectedresult then
192                                 checkall := false;
193                         end if;
194                         report "==================";
195                 end loop f_loop;
196
197                 if checkall then
198                         report "alle testfaelle des Parser waren erfolgreich!";
199                 else
200                         report "nicht alle testfaelle des Parsers waren erfolgreich!";
201                 end if;
202                 stop <= true;
203                 wait;
204         end process;
205 end architecture sim;