8c965966accc057cc95d07dbde0276ec267988e0
[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_i_s      : std_logic_vector(3 downto 0);
53   signal SW_i_s       : std_logic_vector(17 downto 0);
54   signal LEDR_o_s     : std_logic_vector(17 downto 0);
55   signal LEDG_o_s     : std_logic_vector(8 downto 0);
56   signal SD_DAT_i_s   : std_logic;
57   signal SD_DAT3_o_s  : std_logic;
58   signal SD_CMD_o_s   : std_logic;
59   signal SD_CLK_o_s   : std_logic;
60   
61   signal init_s  : std_logic;
62   signal ready_s : std_logic;
63   signal start_s : std_logic;
64   signal error_s : std_logic;
65   signal txd_s   : std_logic_byte_t;
66   signal rxd_s   : std_logic_byte_t;
67   signal spi_s   : spi_bus_t;
68   
69   signal addr_sw_s : std_logic_byte_t;
70   signal byte_sw_s : std_logic_byte_t;
71   signal byte_dw_s : std_logic_byte_t;
72 begin
73   dut : bos2k9 port map(clock_s,
74     KEY_i_s,
75     SW_i_s,
76     LEDR_o_s,
77     LEDG_o_s,
78     SD_DAT_i_s,
79     SD_DAT3_o_s,
80     SD_CMD_o_s,
81     SD_CLK_o_s);
82   SD_DAT_i_s <= spi_s.miso;
83   spi_s.mosi <= SD_CMD_o_s;
84   spi_s.sck  <= SD_CLK_o_s;
85   spi_s.cs   <= SD_DAT3_o_s;
86   
87   byte_dw_s           <= LEDR_o_s(7 downto 0);
88   SW_i_s(7 downto 0)  <= addr_sw_s;
89   SW_i_s(15 downto 8) <= byte_sw_s;
90   SW_i_s(16)          <= '0';
91   SW_i_s(17)          <= not reset_s;
92   KEY_i_s(0)          <= not init_s;
93   KEY_i_s(1)          <= not start_s;
94   KEY_i_s(3 downto 2) <= (others => '1');
95   
96   error_s <= LEDG_o_s(0);
97   ready_s <= LEDG_o_s(1);
98   
99   addr_sw_s <= (others => '0');
100   byte_sw_s <= (others => '0');
101   
102   stimulus : process
103   begin
104     init_s  <= '0';
105     start_s <= '0';
106     wait until falling_edge(reset_s);
107     
108     init_s <= '1';
109     wait until rising_edge(clock_s);
110     init_s <= '0';
111     
112     wait until rising_edge(ready_s);
113     start_s <= '1';
114     wait until rising_edge(clock_s);
115     start_s <= '0';
116     
117     wait;
118   end process;
119   
120   slave : process
121     procedure read_skip_header is
122       variable line_v  : line;
123     begin
124       readline(spi_file, line_v);
125     end read_skip_header;
126     procedure read_txd_and_rxd is
127       variable line_v  : line;
128       variable input_v : string(1 to 17);
129       variable byte_v  : std_logic_byte_t;
130     begin
131       readline(spi_file, line_v);
132       read(line_v, input_v);
133       txd_s <= to_std_logic_vector(input_v(1 to 8));
134       rxd_s <= to_std_logic_vector(input_v(10 to 17));
135       wait until rising_edge(clock_s);
136     end read_txd_and_rxd;
137     variable index_v : integer;
138     variable txd_v   : std_logic_byte_t;
139   begin
140     if reset_s = '1' then
141       read_skip_header;
142     end if;
143   
144     rxd_s <= (others => 'Z');
145     txd_v := (others => 'U');
146     test_s <= 0;
147     spi_s.miso <= 'Z';
148     wait until falling_edge(clock_s);
149     
150     while true loop
151       test_s <= test_s + 1;
152       index_v := 7;
153       read_txd_and_rxd;
154       while true loop
155         -- Latch on odd edges, shift on even
156         spi_s.miso <= rxd_s(index_v);
157         wait until rising_edge(spi_s.sck);
158         txd_v(0) := spi_s.mosi;
159         wait until falling_edge(spi_s.sck);
160         index_v  := index_v - 1;
161         if index_v = -1 then
162           exit;
163         end if;
164         txd_v    := txd_v(6 downto 0) & 'U';
165       end loop;
166       test_s <= test_s + 1;
167       assert txd_v = txd_s report "unexpected spi data. got: " & str(txd_v) & " expected: " & str(txd_s);
168     end loop;
169   end process;
170   
171   -- mark: process
172   -- begin
173     -- test_s <= -1;
174     -- wait until falling_edge(reset_s);
175     -- test_s <= test_s + 1;
176     -- while true loop
177       -- if (init_s or start_s) = '1' then
178         -- test_s <= test_s + 1;
179       -- end if;
180       -- wait until rising_edge(clock_s);
181     -- end loop;
182   -- end process;
183   
184   reset : process
185   begin
186     reset_s <= '1';
187     wait until rising_edge(clock_s);
188     wait until rising_edge(clock_s);
189     reset_s <= '0';
190     wait;
191   end process;
192   
193   clock : process
194   begin
195     clock_s <= '0';
196     wait for clock_interval / 2;
197     clock_s <= '1';
198     wait for clock_interval / 2;
199   end process;
200   
201 end test;