uart_rx: rewrite inkl. testbench
[hwmod.git] / src / beh_uart_rx_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_uart_rx_tb is
7 end entity beh_uart_rx_tb;
8
9 architecture sim of beh_uart_rx_tb is
10         constant CLK_FREQ : integer := 33000000;
11         constant BAUDRATE : integer := 115200;
12         constant BAUD : integer := CLK_FREQ/BAUDRATE;
13
14         signal sys_clk, sys_res_n, rxd, rx_new : std_logic;
15         signal rx_data : std_logic_vector (7 downto 0);
16         signal stop : boolean := false;
17 begin
18         inst : entity work.uart_rx(beh)
19         generic map (
20                 CLK_FREQ => CLK_FREQ,
21                 BAUDRATE => BAUDRATE
22         )
23         port map (
24                 sys_clk => sys_clk,
25                 sys_res_n => sys_res_n,
26                 rxd => rxd,
27                 rx_data => rx_data,
28                 rx_new => rx_new
29         );
30
31         process
32         begin
33                 sys_clk <= '0';
34                 wait for 15 ns;
35                 sys_clk <= '1';
36                 wait for 15 ns;
37                 if stop = true then
38                         wait;
39                 end if;
40         end process;
41
42         process
43                 procedure exec_tc(testnr : integer;
44                         constant testvector : std_logic_vector(9 downto 0);
45                         constant expectedresult : std_logic_vector(7 downto 0)) is
46                 begin
47                         -- vorher auf high setzen um falling edge simulieren zu koennen
48                         rxd <= '1';
49                         icwait(sys_clk, 2);
50
51                         for i in 0 to 9 loop
52                                 rxd <= testvector(9-i);
53                                 if i /= 9 then
54                                         icwait(sys_clk, BAUD);
55                                 end if;
56                         end loop;
57                 
58                         wait until rx_new = '1';
59                         if expectedresult = rx_data then
60                                 report "testfall " & integer'image(testnr) & " war erfolgreich";
61                         else
62                                 report "testfall " & integer'image(testnr) & " schlug fehl";
63                         end if;
64                         icwait(sys_clk, 3);
65                 end;
66
67                 variable testvector : std_logic_vector(9 downto 0);
68                 variable expectedresult : std_logic_vector(7 downto 0);
69         begin
70                 sys_res_n <= '0';
71                 rxd <= '1';
72                 icwait(sys_clk, 10);
73                 sys_res_n <= '1';
74                 icwait(sys_clk, 2);
75
76                 -- 1. parameter: testfallnummer
77                 -- 2. parameter: STARTBIT (1 bit) - immer '0' | 8 DATENBITS | 1 STOPBIT - immer '1'
78                 -- 3. parameter: byte das rauskommen soll
79                 exec_tc(1, b"0000011111", b"00001111");
80                 exec_tc(2, b"0101010101", b"10101010");
81                 exec_tc(3, b"0110011001", b"11001100");
82                 exec_tc(4, b"0001100111", b"00110011");
83                 exec_tc(5, b"0010101011", b"01010101");
84                 exec_tc(6, b"0100110111", b"10011011");
85
86                 stop <= true;
87                 wait;
88         end process;
89 end sim;