OpenCores
URL https://opencores.org/ocsvn/spi_slave/spi_slave/trunk

Subversion Repositories spi_slave

[/] [spi_slave/] [trunk/] [bench/] [vhdl/] [shift_register_tb.vhd] - Blame information for rev 38

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 dkoethe
-------------------------------------------------------------------------------
2
-- Title      : Testbench for design "shift_register"
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : shift_register_tb.vhd
6
-- Author     : 
7
-- Company    : 
8
-- Created    : 2007-08-24
9
-- Last update: 2007-11-12
10
-- Platform   : 
11
-- Standard   : VHDL'87
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2007 
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2007-08-24  1.0      d.koethe        Created
20
-------------------------------------------------------------------------------
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
use IEEE.STD_LOGIC_ARITH.all;
25
use IEEE.STD_LOGIC_UNSIGNED.all;
26
 
27
library work;
28
use work.opb_spi_slave_pack.all;
29
 
30
-------------------------------------------------------------------------------
31
 
32
entity shift_register_tb is
33
 
34
end shift_register_tb;
35
 
36
-------------------------------------------------------------------------------
37
 
38
architecture behavior of shift_register_tb is
39
 
40
  component shift_register
41
    generic (
42
      C_SR_WIDTH  : integer;
43
      C_MSB_FIRST : boolean;
44
      C_CPOL      : integer range 0 to 1;
45
      C_PHA       : integer range 0 to 1);
46
    port (
47
      rst         : in  std_logic;
48
      opb_ctl_reg : in  std_logic_vector(C_OPB_CTL_REG_WIDTH-1 downto 0);
49
      sclk        : in  std_logic;
50
      ss_n        : in  std_logic;
51
      mosi        : in  std_logic;
52
      miso_o      : out std_logic;
53
      miso_i      : in  std_logic;
54
      miso_t      : out std_logic;
55
      sr_tx_clk   : out std_logic;
56
      sr_tx_en    : out std_logic;
57
      sr_tx_data  : in  std_logic_vector(C_SR_WIDTH-1 downto 0);
58
      sr_rx_clk   : out std_logic;
59
      sr_rx_en    : out std_logic;
60
      sr_rx_data  : out std_logic_vector(C_SR_WIDTH-1 downto 0));
61
  end component;
62
 
63
 
64
  component tx_fifo_emu
65
    generic (
66
      C_SR_WIDTH     : integer;
67
      C_TX_CMP_VALUE : integer);
68
    port (
69
      rst     : in  std_logic;
70
      tx_clk  : in  std_logic;
71
      tx_en   : in  std_logic;
72
      tx_data : out std_logic_vector(C_SR_WIDTH-1 downto 0));
73
  end component;
74
 
75
  component rx_fifo_emu
76
    generic (
77
      C_SR_WIDTH     : integer;
78
      C_RX_CMP_VALUE : integer);
79
    port (
80
      rst     : in std_logic;
81
      rx_clk  : in std_logic;
82
      rx_en   : in std_logic;
83
      rx_data : in std_logic_vector(C_SR_WIDTH-1 downto 0));
84
  end component;
85
 
86
 
87
  constant C_NUM_TESTS : integer := 3;
88
 
89
  -- component generics
90
  constant C_SR_WIDTH  : integer       := 8;
91
  type C_MSB_FIRST_t is array (0 to C_NUM_TESTS) of boolean;
92
  constant C_MSB_FIRST : C_MSB_FIRST_t := (true, false, true, false);
93
  type C_CPOL_t is array (0 to C_NUM_TESTS) of integer range 0 to 1;
94
  constant C_CPOL      : C_CPOL_t      := (0, 0, 1, 1);
95
  type C_PHA_t is array (0 to C_NUM_TESTS) of integer range 0 to 1;
96
  constant C_PHA       : C_PHA_t       := (0, 0, 0, 0);
97
 
98
  constant clk_period : time := 40 ns;
99
 
100
  type sig_std_logic_t is array (0 to C_NUM_TESTS) of std_logic;
101
  type sig_std_logic_vector_t is array (0 to C_NUM_TESTS) of std_logic_vector(C_SR_WIDTH-1 downto 0);
102
 
103
  type C_SCLK_INIT_t is array (0 to C_NUM_TESTS) of std_logic;
104
  constant C_SCLK_INIT : C_SCLK_INIT_t := ('0', '0', '1', '1');
105
 
106
  signal TEST_NUM : integer := 0;
107
 
108
  -- component ports
109
  signal rst     : sig_std_logic_t;
110
  signal sclk    : sig_std_logic_t;
111
  signal cs_n    : sig_std_logic_t;
112
  signal mosi    : sig_std_logic_t;
113
  signal miso_o  : sig_std_logic_t;
114
  signal miso_i  : sig_std_logic_t;
115
  signal miso_t  : sig_std_logic_t;
116
  signal tx_clk  : sig_std_logic_t;
117
  signal tx_en   : sig_std_logic_t;
118
  signal tx_data : sig_std_logic_vector_t;
119
  signal rx_clk  : sig_std_logic_t;
120
  signal rx_en   : sig_std_logic_t;
121
  signal rx_data : sig_std_logic_vector_t;
122
 
123
  -- component ports
124
  signal s_rst     : std_logic;
125
  signal s_sclk    : std_logic;
126
  signal s_cs_n    : std_logic;
127
  signal s_mosi    : std_logic;
128
  signal s_miso_o  : std_logic;
129
  signal s_miso_i  : std_logic;
130
  signal s_miso_t  : std_logic;
131
  signal s_tx_clk  : std_logic;
132
  signal s_tx_en   : std_logic;
133
  signal s_tx_data : std_logic_vector(C_SR_WIDTH-1 downto 0);
134
  signal s_rx_clk  : std_logic;
135
  signal s_rx_en   : std_logic;
136
  signal s_rx_data : std_logic_vector(C_SR_WIDTH-1 downto 0);
137
 
138
  -- testbench
139
  constant C_TX_CMP_VALUE : integer := 130;
140
  constant C_RX_CMP_VALUE : integer := 129;
141
 
142
  signal rx_master : std_logic_vector(7 downto 0);
143
 
144
  signal opb_ctl_reg: std_logic_vector(C_OPB_CTL_REG_WIDTH-1 downto 0);
145
 
146
begin  -- behavior
147
 
148
  opb_ctl_reg <= "0111";                -- enable all
149
 
150
  s_rst     <= rst(TEST_NUM);
151
  s_sclk    <= sclk(TEST_NUM);
152
  s_cs_n    <= cs_n(TEST_NUM);
153
  s_mosi    <= mosi(TEST_NUM);
154
  s_miso_o  <= miso_o(TEST_NUM);
155
  s_miso_i  <= miso_i(TEST_NUM);
156
  s_miso_t  <= miso_t(TEST_NUM);
157
  s_tx_clk  <= tx_clk(TEST_NUM);
158
  s_tx_en   <= tx_en(TEST_NUM);
159
  s_tx_data <= tx_data(TEST_NUM);
160
  s_rx_clk  <= rx_clk(TEST_NUM);
161
  s_rx_en   <= rx_en(TEST_NUM);
162
  s_rx_data <= rx_data(TEST_NUM);
163
 
164
 
165
  -- component instantiation
166
 
167
  i : for i in 0 to 3 generate
168
    DUT : shift_register
169
      generic map (
170
        C_SR_WIDTH  => C_SR_WIDTH,
171
        C_MSB_FIRST => C_MSB_FIRST(i),
172
        C_CPOL      => C_CPOL(i),
173
        C_PHA       => C_PHA(i))
174
      port map (
175
        rst     => rst(i),
176
        opb_ctl_reg => opb_ctl_reg,
177
        sclk    => sclk(i),
178
        ss_n    => cs_n(i),
179
        mosi    => mosi(i),
180
        miso_o  => miso_o(i),
181
        miso_i  => miso_i(i),
182
        miso_t  => miso_t(i),
183
        sr_tx_clk  => tx_clk(i),
184
        sr_tx_en   => tx_en(i),
185
        sr_tx_data => tx_data(i),
186
        sr_rx_clk  => rx_clk(i),
187
        sr_rx_en   => rx_en(i),
188
        sr_rx_data => rx_data(i));
189
 
190
 
191
 
192
    tx_fifo_emu_1 : tx_fifo_emu
193
      generic map (
194
        C_SR_WIDTH     => C_SR_WIDTH,
195
        C_TX_CMP_VALUE => C_TX_CMP_VALUE)
196
      port map (
197
        rst     => rst(i),
198
        tx_clk  => tx_clk(i),
199
        tx_en   => tx_en(i),
200
        tx_data => tx_data(i));
201
 
202
 
203
    rx_fifo_emu_1 : rx_fifo_emu
204
      generic map (
205
        C_SR_WIDTH     => C_SR_WIDTH,
206
        C_RX_CMP_VALUE => C_RX_CMP_VALUE)
207
      port map (
208
        rst     => rst(i),
209
        rx_clk  => rx_clk(i),
210
        rx_en   => rx_en(i),
211
        rx_data => rx_data(i));
212
  end generate i;
213
 
214
 
215
  -- waveform generation
216
  WaveGen_Proc : process
217
    variable rx_value : std_logic_vector(7 downto 0);
218
    variable tx_value : std_logic_vector(7 downto 0);
219
  begin
220
    for i in 0 to C_NUM_TESTS loop
221
      sclk(i)   <= C_SCLK_INIT(i);
222
      cs_n(i)   <= '1';
223
      mosi(i)   <= 'Z';
224
      miso_i(i) <= 'Z';
225
      -- rst_active
226
      rst(i)    <= '1';
227
    end loop;  -- i
228
-------------------------------------------------------------------------------
229
    -- Actual Tests
230
    TEST_NUM      <= 0;
231
    rx_value      := conv_std_logic_vector(C_RX_CMP_VALUE, 8);
232
    tx_value      := conv_std_logic_vector(C_TX_CMP_VALUE, 8);
233
    wait for 100 ns;
234
    rst(TEST_NUM) <= '0';
235
 
236
    -- CPHA=0 CPOL=0 C_MSB_FIRST=TRUE
237
    cs_n(TEST_NUM) <= '0';
238
    for i in 7 downto 0 loop
239
      mosi(TEST_NUM) <= rx_value(i);
240
      wait for clk_period/2;
241
      sclk(TEST_NUM) <= '1';
242
      rx_master(i)   <= miso_o(TEST_NUM);
243
      wait for clk_period/2;
244
      sclk(TEST_NUM) <= '0';
245
    end loop;  -- i
246
    mosi(TEST_NUM) <= 'Z';
247
    wait for clk_period/2;
248
    cs_n(TEST_NUM) <= '1';
249
    wait for 100 ns;
250
    assert (rx_master = tx_value) report "Master Receive Failure" severity warning;
251
 
252
 
253
    -- write 2 byte
254
    cs_n(TEST_NUM) <= '0';
255
    for n in 1 to 2 loop
256
      rx_value := rx_value +1;
257
      tx_value := tx_value +1;
258
      for i in 7 downto 0 loop
259
        mosi(TEST_NUM) <= rx_value(i);
260
        wait for clk_period/2;
261
        sclk(TEST_NUM) <= '1';
262
        rx_master(i)   <= miso_o(TEST_NUM);
263
        wait for clk_period/2;
264
        sclk(TEST_NUM) <= '0';
265
      end loop;  -- i
266
      assert (rx_master = tx_value) report "Master Receive Failure" severity warning;
267
    end loop;  -- n
268
    mosi(TEST_NUM) <= 'Z';
269
    wait for clk_period/2;
270
    cs_n(TEST_NUM) <= '1';
271
---------------------------------------------------------------------------
272
    -- Actual Tests
273
    TEST_NUM       <= 1;
274
    rx_value       := conv_std_logic_vector(C_RX_CMP_VALUE, 8);
275
    tx_value       := conv_std_logic_vector(C_TX_CMP_VALUE, 8);
276
    wait for 100 ns;
277
    rst(TEST_NUM)  <= '0';
278
 
279
    -- CPHA=0 CPOL=0 C_MSB_FIRST=FALSE
280
    cs_n(TEST_NUM) <= '0';
281
    for i in 0 to 7 loop
282
      mosi(TEST_NUM) <= rx_value(i);
283
      wait for clk_period/2;
284
      sclk(TEST_NUM) <= '1';
285
      rx_master(i)   <= miso_o(TEST_NUM);
286
      wait for clk_period/2;
287
      sclk(TEST_NUM) <= '0';
288
    end loop;  -- i
289
    mosi(TEST_NUM) <= 'Z';
290
    wait for clk_period/2;
291
    cs_n(TEST_NUM) <= '1';
292
    wait for 100 ns;
293
    assert (rx_master = tx_value) report "Master Receive Failure" severity warning;
294
 
295
 
296
    -- write 2 byte
297
    cs_n(TEST_NUM) <= '0';
298
    for n in 1 to 2 loop
299
      rx_value := rx_value +1;
300
      tx_value := tx_value +1;
301
      for i in 0 to 7 loop
302
        mosi(TEST_NUM) <= rx_value(i);
303
        wait for clk_period/2;
304
        sclk(TEST_NUM) <= '1';
305
        rx_master(i)   <= miso_o(TEST_NUM);
306
        wait for clk_period/2;
307
        sclk(TEST_NUM) <= '0';
308
      end loop;  -- i
309
      assert (rx_master = tx_value) report "Master Receive Failure" severity warning;
310
    end loop;  -- n
311
    mosi(TEST_NUM) <= 'Z';
312
    wait for clk_period/2;
313
    cs_n(TEST_NUM) <= '1';
314
 
315
-------------------------------------------------------------------------------
316
    TEST_NUM      <= 2;
317
    rx_value      := conv_std_logic_vector(C_RX_CMP_VALUE, 8);
318
    tx_value      := conv_std_logic_vector(C_TX_CMP_VALUE, 8);
319
    wait for 100 ns;
320
    rst(TEST_NUM) <= '0';
321
 
322
    -- CPHA=0 CPOL=1 C_MSB_FIRST=TRUE
323
    cs_n(TEST_NUM) <= '0';
324
    for i in 7 downto 0 loop
325
      mosi(TEST_NUM) <= rx_value(i);
326
      wait for clk_period/2;
327
      sclk(TEST_NUM) <= '0';
328
      wait for clk_period/2;
329
      sclk(TEST_NUM) <= '1';
330
    end loop;  -- i
331
    mosi(TEST_NUM) <= 'Z';
332
    wait for clk_period/2;
333
    cs_n(TEST_NUM) <= '1';
334
    wait for 100 ns;
335
 
336
    -- write 2 byte
337
    cs_n(TEST_NUM) <= '0';
338
    for n in 1 to 2 loop
339
      rx_value := rx_value +1;
340
      for i in 7 downto 0 loop
341
        mosi(TEST_NUM) <= rx_value(i);
342
        wait for clk_period/2;
343
        sclk(TEST_NUM) <= '0';
344
        wait for clk_period/2;
345
        sclk(TEST_NUM) <= '1';
346
      end loop;  -- i
347
    end loop;  -- n
348
    mosi(TEST_NUM) <= 'Z';
349
    wait for clk_period/2;
350
    cs_n(TEST_NUM) <= '1';
351
 
352
-------------------------------------------------------------------------------
353
    TEST_NUM      <= 3;
354
    rx_value      := conv_std_logic_vector(C_RX_CMP_VALUE, 8);
355
    tx_value      := conv_std_logic_vector(C_TX_CMP_VALUE, 8);
356
    wait for 100 ns;
357
    rst(TEST_NUM) <= '0';
358
 
359
    -- CPHA=0 CPOL=1 C_MSB_FIRST=FALSE
360
    cs_n(TEST_NUM) <= '0';
361
    for i in 0 to 7 loop
362
      mosi(TEST_NUM) <= rx_value(i);
363
      wait for clk_period/2;
364
      sclk(TEST_NUM) <= '0';
365
      wait for clk_period/2;
366
      sclk(TEST_NUM) <= '1';
367
    end loop;  -- i
368
    mosi(TEST_NUM) <= 'Z';
369
    wait for clk_period/2;
370
    cs_n(TEST_NUM) <= '1';
371
    wait for 100 ns;
372
 
373
    -- write 2 byte
374
    cs_n(TEST_NUM) <= '0';
375
    for n in 1 to 2 loop
376
      rx_value := rx_value +1;
377
      for i in 0 to 7 loop
378
        mosi(TEST_NUM) <= rx_value(i);
379
        wait for clk_period/2;
380
        sclk(TEST_NUM) <= '0';
381
        wait for clk_period/2;
382
        sclk(TEST_NUM) <= '1';
383
      end loop;  -- i
384
    end loop;  -- n
385
    mosi(TEST_NUM) <= 'Z';
386
    wait for clk_period/2;
387
    cs_n(TEST_NUM) <= '1';
388
 
389
-------------------------------------------------------------------------------    
390
 
391
 
392
    wait for 1 us;
393
 
394
    assert false report "Simulation sucessful" severity failure;
395
 
396
 
397
 
398
  end process WaveGen_Proc;
399
 
400
 
401
 
402
end behavior;
403
 
404
-------------------------------------------------------------------------------
405
 
406
configuration shift_register_tb_behavior_cfg of shift_register_tb is
407
  for behavior
408
  end for;
409
end shift_register_tb_behavior_cfg;
410
 
411
-------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.