eaa4fe30ddbcab474b24f13359ea7ad6320bc02c
[hwmod.git] / src / beh_history_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 use work.textmode_vga_component_pkg.all;
6 use work.textmode_vga_pkg.all;
7 use work.textmode_vga_platform_dependent_pkg.all;
8
9 entity beh_history_tb is
10 end entity beh_history_tb;
11
12 architecture sim of beh_history_tb is
13         -- system
14         signal sys_clk, sys_res_n : std_logic;
15         -- history/display
16         signal d_new_eingabe, d_new_result, d_new_bs : std_logic;
17         signal d_zeile : hzeile;
18         signal d_spalte : hspalte;
19         signal d_get, d_done : std_logic;
20         signal d_char : hbyte;
21         -- history/scanner
22         signal s_char : hbyte;
23         signal s_take, s_done, s_backspace : std_logic;
24         -- ps/2
25         signal new_data : std_logic;
26         signal data : std_logic_vector(7 downto 0);
27         -- vga/display
28         signal free : std_logic;
29         signal command : std_logic_vector(COMMAND_SIZE - 1 downto 0);
30         signal command_data : std_logic_vector(3 * COLOR_SIZE + CHAR_SIZE -1 downto 0);
31         -- history/parser
32         signal p_rget : std_logic;
33         signal p_rdone : std_logic;
34         signal p_read : hbyte;
35         signal p_wtake : std_logic;
36         signal p_wdone : std_logic;
37         signal p_write : hbyte;
38         signal p_finished : std_logic;
39         -- parser/scanner
40         signal do_it, finished : std_logic;
41         --uart_tx
42         signal tx_data : std_logic_vector(7 downto 0);
43         signal tx_new, tx_done, txd : std_logic;
44         --pc_communication
45         signal pc_zeile : hzeile;
46         signal pc_spalte : hspalte;
47         signal pc_get, pc_done : std_logic;
48         signal pc_char : hbyte;
49         signal pc_busy : std_logic;
50         --dummy button
51         signal btn_a_int : std_logic;
52
53
54         signal stop : boolean := false;
55 begin
56         -- history
57         inst : entity work.history(beh)
58         port map (
59                 sys_clk => sys_clk,
60                 sys_res_n => sys_res_n,
61                 -- scanner
62                 s_char => s_char,
63                 s_take => s_take,
64                 s_done => s_done,
65                 s_backspace => s_backspace,
66                 -- display
67                 d_new_eingabe => d_new_eingabe,
68                 d_new_result => d_new_result,
69                 d_new_bs => d_new_bs,
70                 d_zeile => d_zeile,
71                 d_spalte => d_spalte,
72                 d_get => d_get,
73                 d_done => d_done,
74                 d_char => d_char,
75                 -- parser
76                 p_rget => p_rget,
77                 p_rdone => p_rdone,
78                 p_read => p_read,
79                 p_wtake => p_wtake,
80                 p_wdone => p_wdone,
81                 p_write => p_write,
82                 p_finished => p_finished,
83                 -- PC-komm
84                 pc_get    => pc_get,
85                 pc_spalte => pc_spalte,
86                 pc_zeile  => pc_zeile,
87                 pc_char   => pc_char,
88                 pc_busy   => pc_busy,
89                 pc_done   => pc_done
90         );
91
92         -- display
93         inst_disp : entity work.display(beh)
94         port map (
95                 sys_clk => sys_clk,
96                 sys_res_n => sys_res_n,
97                 -- history
98                 d_new_eingabe => d_new_eingabe,
99                 d_new_result => d_new_result,
100                 d_new_bs => d_new_bs,
101                 d_zeile => d_zeile,
102                 d_spalte => d_spalte,
103                 d_get => d_get,
104                 d_done => d_done,
105                 d_char => d_char,
106                 -- vga
107                 command => command,
108                 command_data => command_data,
109                 free => free
110         );
111
112         -- parser
113         inst_parser : entity work.parser(beh)
114         port map (
115                 sys_clk => sys_clk,
116                 sys_res_n => sys_res_n,
117                 -- history
118                 p_rget => p_rget,
119                 p_rdone => p_rdone,
120                 p_read => p_read,
121                 p_wtake => p_wtake,
122                 p_wdone => p_wdone,
123                 p_write => p_write,
124                 p_finished => p_finished,
125                 -- scanner
126                 do_it => do_it,
127                 finished => finished
128         );
129
130         -- scanner
131         inst_scan : entity work.scanner(beh)
132         port map (
133                 sys_clk => sys_clk,
134                 sys_res_n => sys_res_n,
135                 -- ps/2
136                 new_data => new_data,
137                 data => data,
138                 -- history
139                 s_char => s_char,
140                 s_take => s_take,
141                 s_done => s_done,
142                 s_backspace => s_backspace,
143                 -- Parser
144                 do_it => do_it,
145                 finished => finished
146         );
147         --uart_tx
148         inst_uart : entity work.uart_tx(beh)
149         port map (
150                 sys_clk => sys_clk,
151                 sys_res_n => sys_res_n,
152                 txd => txd,
153                 tx_data =>tx_data,
154                 tx_new => tx_new,
155                 tx_done => tx_done
156         );
157
158         --pc_communication
159         inst_pc_com : entity work.pc_communication(beh)
160         port map(
161                 sys_clk => sys_clk,
162                 sys_res_n => sys_res_n,
163                 --button
164                 btn_a => btn_a_int,
165                 --uart_tx
166                 tx_data => tx_data,
167                 tx_new => tx_new,
168                 tx_done => tx_done,
169                 --uart_rx
170                 rx_data => (others => '0'),
171                 rx_new => '0',
172                 -- History
173                 pc_zeile  => pc_zeile,
174                 pc_spalte => pc_spalte,
175                 pc_get    => pc_get,
176                 pc_done   => pc_done,
177                 pc_char   => pc_char,
178                 pc_busy   => pc_busy
179         );
180
181         process
182         begin
183                 sys_clk <= '0';
184                 wait for 15 ns;
185                 sys_clk <= '1';
186                 wait for 15 ns;
187                 if stop = true then
188                         wait;
189                 end if;
190         end process;
191
192         process
193         begin
194                 free <= '0';
195                 wait for 15 ns;
196                 free <= '1';
197                 wait for 30 ns;
198                 if stop = true then
199                         wait;
200                 end if;
201         end process;
202
203         process
204                 -- textio stuff
205                 use std.textio.all;
206                 file f : text open read_mode is "../../src/history.test";
207                 variable l : line;
208
209                 variable input : string(1 to 100);
210
211                 variable run_tc, run_inner : boolean := true;
212                 variable i, j, y : natural;
213         begin
214                 -- init & reset
215                 sys_res_n <= '0';
216                 new_data <= '0';
217                 data <= (others => '0');
218
219                 icwait(sys_clk, 20);
220                 sys_res_n <= '1';
221
222                 i := 1;
223                 f_loop : while not endfile(f) loop
224                         data <= (others => '0');
225
226                         f1_loop : while not endfile(f) loop
227                                 readline (f, l);
228                                 input := (others => nul);
229                                 if (l'length <= 100) then
230                                         input(1 to l'length) := l.all;
231                                         if (input(1) = '#') then
232                                                 next f1_loop;
233                                         else
234                                                 exit f1_loop;
235                                         end if;
236                                 else
237                                         report "fehler in history.test: eingabe zu lange in testfall " & natural'image(i);
238                                         next f_loop;
239                                 end if;
240                         end loop f1_loop;
241
242                         report "testcase(" & natural'image(i) & ").input: " & input;
243                         i := i + 1;
244
245                         icwait(sys_clk, 5);
246                         run_tc := true;
247                         j := 0;
248
249                         mainl : while run_tc loop
250                                 icwait(sys_clk, 10);
251                                 j := j + 1;
252
253                                 if j = 101 then
254                                         run_tc := false;
255                                         assert(false) report "wtf @ schleife";
256                                         next mainl;
257                                 end if;
258
259                                 new_data <= '1';
260
261                                 case input(j) is
262                                         when nul => data <= ascii2sc(x"1c"); -- $ (enter)
263                                         when '!' => data <= ascii2sc(x"0e"); -- ! (backspace)
264                                         when '/' =>
265                                                 data <= x"e0";
266                                                 icwait(sys_clk, 1);
267                                                 new_data <= '0';
268                                                 icwait(sys_clk, 1);
269                                                 new_data <= '1';
270                                                 data <= SC_KP_DIV;
271                                         when others => data <= ascii2sc(std_logic_vector(to_unsigned(character'pos(input(j)),8)));
272                                 end case;
273
274                                 -- ack'en skippen, falls es ein "spezielles" zeichen ist (steht
275                                 -- in abhaengigkeit zum vorherigen zeichen)
276                                 if(not valid_char(data)) then
277                                         next mainl;
278                                 end if;
279
280                                 -- wuenschswert waere das hier:
281                                 -- > wait on s_backspace, s_take, do_it;
282                                 -- geht aber leider nicht, weil sich die signale vllt schon
283                                 -- geaendert haben
284                                 run_inner := true;
285                                 main_inner : while run_inner loop
286                                         icwait(sys_clk, 1);
287
288                                         run_inner := false;
289                                         if s_backspace = '1' or s_take = '1' then
290                                                 icwait(sys_clk, 1);
291                                                 wait on s_take; -- = '0'
292                                                 icwait(sys_clk, 1);
293                                         elsif do_it = '1' then
294                                                 -- dauert normalweiser noch laenger (parser braucht
295                                                 -- relativ lange)
296                                                 icwait(sys_clk, 7);
297                                                 wait on do_it; -- = '0'
298                                                 icwait(sys_clk, 850);
299
300                                                 run_tc := false;
301                                         else
302                                                 -- assert(false) report "history_tb: kann passieren. wenn tb haengt, dann hier auskommentieren";
303                                                 run_inner := true;
304                                         end if;
305                                 end loop;
306                         end loop;
307                         report "==================";
308                 end loop f_loop;
309
310                 icwait(sys_clk, 850);
311                 stop <= true;
312                 wait;
313         end process;
314
315         btn_pressed : process is
316         begin
317                 btn_a_int <= '1';
318                 wait until sys_res_n = '1';
319                 wait for 50000 * 15 ns;
320                 wait until rising_edge(sys_clk);
321                 btn_a_int <= '0';
322                 wait for 30 ns;
323                 btn_a_int <= '1';
324                 wait;
325         end process btn_pressed;
326 end architecture sim;