The testbench is getting better.
[bos2k9.git] / bos2k9_t.vhd
1 -----------------------------------------------------------------------
2 -- Copyright (c) 2009 Malte S. Stretz <http://msquadrat.de> 
3 --
4 -- Testing the top level entity.
5 -----------------------------------------------------------------------
6
7 use work.bos2k9_globals.all;
8
9 library fhw_tools;
10 use fhw_tools.types.all;
11
12 library ieee;
13 use ieee.std_logic_1164.all;
14 use ieee.numeric_std.all;
15
16 use std.textio.all;
17 use work.txt_util.all;
18
19 -----------------------------------------------------------------------
20
21 entity bos2k9_t is
22   generic(
23     clock_interval : time   := clock_interval_c;
24     spi_filename   : string := "bos2k9_t.dat");
25 end bos2k9_t;
26
27 -----------------------------------------------------------------------
28
29 architecture test of bos2k9_t is
30
31   component bos2k9 is
32     port(
33       CLOCK_50 : in std_logic;
34     
35       KEY  : in  std_logic_vector(3 downto 0);
36       SW   : in  std_logic_vector(17 downto 0);
37       LEDR : out std_logic_vector(17 downto 0);
38       LEDG : out std_logic_vector(8 downto 0);
39     
40       SD_DAT  : in  std_logic;
41       SD_DAT3 : out std_logic;
42       SD_CMD  : out std_logic;
43       SD_CLK  : out std_logic);
44   end component;
45
46   file   spi_file : text open read_mode is spi_filename;
47   signal test_s   : integer;
48   
49   signal clock_s  : std_logic;
50   signal reset_s  : std_logic;
51   
52   signal KEY_s      : std_logic_vector(3 downto 0);
53   signal SW_s       : std_logic_vector(17 downto 0);
54   signal LEDR_s     : std_logic_vector(17 downto 0);
55   signal LEDG_s     : std_logic_vector(8 downto 0);
56   signal SD_DAT_s   : std_logic;
57   signal SD_DAT3_s  : std_logic;
58   signal SD_CMD_s   : std_logic;
59   signal SD_CLK_s   : std_logic;
60   
61   signal start_n : std_logic;
62   signal txd_s   : std_logic_byte_t;
63   signal rxd_s   : std_logic_byte_t;
64   signal spi_s   : spi_bus_t;
65   
66   signal addr_sw_s : std_logic_byte_t;
67   signal byte_sw_s : std_logic_byte_t;
68   signal byte_dw_s : std_logic_byte_t;
69 begin
70   dut : bos2k9 port map(clock_s,
71     KEY_s,
72     SW_s,
73     LEDR_s,
74     LEDG_s,
75     SD_DAT_s,
76     SD_DAT3_s,
77     SD_CMD_s,
78     SD_CLK_s);
79   SD_DAT_s   <= spi_s.miso;
80   spi_s.mosi <= SD_CMD_s;
81   spi_s.sck  <= SD_CLK_s;
82   spi_s.cs   <= SD_DAT3_s;
83   
84   byte_dw_s         <= LEDR_s(7 downto 0);
85   SW_s(7 downto 0)  <= addr_sw_s;
86   SW_s(15 downto 8) <= byte_sw_s;
87   
88   addr_sw_s <= (others => '0');
89   byte_sw_s <= (others => '0');
90   
91   stimulus : process
92   begin
93     
94   
95     
96     wait;
97   end process;
98   
99   slave : process
100     procedure read_txd_and_rxd is
101       variable line_v  : line;
102       variable input_v : string(1 to 17);
103       variable byte_v  : std_logic_byte_t;
104     begin
105       readline(spi_file, line_v);
106       read(line_v, input_v);
107       txd_s <= to_std_logic_vector(input_v(1 to 8));
108       rxd_s <= to_std_logic_vector(input_v(10 to 17));
109     end read_txd_and_rxd;
110     variable count_v : integer;
111     variable index_v : integer;
112     variable txd_v   : std_logic_byte_t;
113   begin
114     rxd_s <= (others => 'Z');
115     txd_v := (others => 'U');
116     wait until falling_edge(spi_s.cs);
117     index_v := 7;
118     count_v := 0;
119     read_txd_and_rxd;
120     spi_s.miso <= rxd_s(index_v);
121     while spi_s.cs = '0' loop
122       wait until spi_s.sck'event or spi_s.cs'event;
123       if not (index_v = -1) then
124         count_v := count_v + 1;
125         -- Latch on odd edges, shift on even
126         if (count_v mod 2) = 1 then
127           txd_v(0)   := spi_s.mosi;
128           index_v    := index_v - 1;
129         else
130           txd_v      := txd_v(6 downto 0) & 'U';
131           spi_s.miso <= rxd_s(index_v);
132         end if;
133       end if;
134     end loop;
135     assert txd_v = txd_s report "unexpected spi data. got: " & str(txd_v) & " expected: " & str(txd_s);
136     wait until falling_edge(clock_s);
137   end process;
138   
139   reset : process
140   begin
141     reset_s <= '1';
142     wait until rising_edge(clock_s);
143     wait until rising_edge(clock_s);
144     reset_s <= '0';
145     wait;
146   end process;
147   
148   clock : process
149   begin
150     clock_s <= '0';
151     wait for clock_interval / 2;
152     clock_s <= '1';
153     wait for clock_interval / 2;
154   end process;
155   
156 end test;