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

Subversion Repositories ether_arp_1g

[/] [ether_arp_1g/] [trunk/] [testbench/] [tb-arp_responder.vhdl] - Blame information for rev 3

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

Line No. Rev Author Line
1 3 jrwagz
----------------------------------------------------------------------------------
2
-- Company: Carnegie Mellon University, Pittsburgh PA 
3
-- Engineer: Justin Wagner
4
-- 
5
-- Create Date:    7/Oct/2011
6
-- Design Name: 
7
-- Module Name:    tb_arp_package - testbench 
8
-- Project Name: 
9
-- Target Devices:  n/a
10
-- Tool versions: 
11
--
12
-- Dependencies: arp_package.vhdl (Definitions of various constants)
13
--
14
----------------------------------------------------------------------------------
15 2 jrwagz
library ieee;
16
use ieee.std_logic_1164.all;
17
use ieee.std_logic_arith.all;
18
use std.textio.all;
19
use work.arp_package.all;
20
 
21
entity tb_arp_responder is
22
  --empty
23
end tb_arp_responder;
24
 
25
 
26
architecture beh of tb_arp_responder is
27
 
28
    COMPONENT arp_responder
29
    PORT(
30
         ARESET          : IN   std_logic;
31
         MY_MAC          : IN   std_logic_vector(47 downto 0);
32
         MY_IPV4         : IN   std_logic_vector(31 downto 0);
33
         CLK_RX          : IN   std_logic;
34
         DATA_VALID_RX   : IN   std_logic;
35
         DATA_RX         : IN   std_logic_vector(7 downto 0);
36
         CLK_TX          : IN   std_logic;
37
         DATA_ACK_TX     : IN   std_logic;
38
         DATA_VALID_TX   : OUT  std_logic;
39
         DATA_TX         : OUT  std_logic_vector(7 downto 0)
40
        );
41
    END COMPONENT;
42
 
43
    constant severity_c  : severity_level := failure;
44
 
45
    --Inputs
46
    signal ARESET        : std_logic := '0';
47
    signal MY_MAC        : std_logic_vector(47 downto 0) := x"00_01_42_00_5F_FF";
48
    signal MY_IPV4       : std_logic_vector(31 downto 0) := x"C0_A8_01_02";
49
    signal CLK_RX        : std_logic := '0';
50
    signal DATA_VALID_RX : std_logic := '0';
51
    signal DATA_RX       : std_logic_vector(7 downto 0) := (others => '0');
52
    signal CLK_TX        : std_logic := '0';
53
    signal TB_CLK        : std_logic := '0';
54
    signal DATA_ACK_TX   : std_logic := '0';
55
 
56
      --Outputs
57
    signal DATA_VALID_TX : std_logic;
58
    signal DATA_TX       : std_logic_vector(7 downto 0);
59
 
60
    -- Clock period definitions
61
    constant CLK_period  : time := 8 ns;
62
    constant TB_CLK_SKEW : time := 1 ns;
63
 
64
BEGIN
65
 
66
    -- Instantiate the Unit Under Test (UUT)
67
    uut: arp_responder PORT MAP (
68
          ARESET        => ARESET,
69
          MY_MAC        => MY_MAC,
70
          MY_IPV4       => MY_IPV4,
71
          CLK_RX        => CLK_RX,
72
          DATA_VALID_RX => DATA_VALID_RX,
73
          DATA_RX       => DATA_RX,
74
          CLK_TX        => CLK_TX,
75
          DATA_ACK_TX   => DATA_ACK_TX,
76
          DATA_VALID_TX => DATA_VALID_TX,
77
          DATA_TX       => DATA_TX
78
        );
79
 
80
    ----Testbench Clock Generator:
81
    tb_clk_gen : process
82
    begin
83
        TB_CLK <= '0';
84
        wait for CLK_period/2;
85
        TB_CLK <= '1';
86
        wait for CLK_period/2;
87
    end process;
88
 
89
    CLK_RX <= transport TB_CLK after TB_CLK_SKEW;
90
    CLK_TX <= not(CLK_RX);
91
 
92
    -- Stimulus process
93
    stim_proc: process
94
 
95
    --
96
    -- wait for the rising edge of tb_ck
97
    --
98
    procedure wait_tb_clk(num_cyc : integer := 1) is
99
    begin
100
        for i in 1 to num_cyc loop
101
            wait until TB_CLK'event and TB_CLK = '1';
102
        end loop;
103
    end wait_tb_clk;
104
 
105
    --
106
    -- wait for the rising edge of rx clk
107
    --
108
    procedure wait_rx_clk(num_cyc : integer := 1) is
109
    begin
110
        for i in 1 to num_cyc loop
111
            wait until CLK_RX'event and CLK_RX = '1';
112
        end loop;
113
    end wait_rx_clk;
114
 
115
    --
116
    -- wait for the rising edge of tx clk
117
    --
118
    procedure wait_tx_clk(num_cyc : integer := 1) is
119
    begin
120
        for i in 1 to num_cyc loop
121
            wait until CLK_TX'event and CLK_TX = '1';
122
        end loop;
123
    end wait_tx_clk;
124
 
125
    -- 
126
    -- Generate a valid ARP request
127
    -- 
128
    procedure gen_valid_arp_req is
129
    begin
130
        -- Set the Data Valid flag
131
        DATA_VALID_RX <= '1';
132
 
133
        -- Generate BDCST DA
134
        for i in 0 to 5 loop
135
            DATA_RX       <= MAC_BDCST_ADDR(i);
136
            wait_tb_clk;
137
        end loop;
138
 
139
        -- Generate SA
140
        for i in 0 to 5 loop
141
            DATA_RX       <= CMP_A_MAC_ADDR(i);
142
            wait_tb_clk;
143
        end loop;
144
 
145
        -- Generate ARP E_TYPE
146
        for i in 0 to 1 loop
147
            DATA_RX       <= E_TYPE_ARP(i);
148
            wait_tb_clk;
149
        end loop;
150
 
151
        -- Generate Ethernet H_TYPE
152
        for i in 0 to 1 loop
153
            DATA_RX       <= H_TYPE_ETH(i);
154
            wait_tb_clk;
155
        end loop;
156
 
157
        -- Generate IPV4 P_TYPE
158
        for i in 0 to 1 loop
159
            DATA_RX       <= P_TYPE_IPV4(i);
160
            wait_tb_clk;
161
        end loop;
162
 
163
        -- Generate Ethernet H_LEN
164
        DATA_RX       <= H_TYPE_ETH_LEN;
165
        wait_tb_clk;
166
 
167
        -- Generate IPV4 P_LEN
168
        DATA_RX       <= P_TYPE_IPV4_LEN;
169
        wait_tb_clk;
170
 
171
        -- Generate OPER for ARP Request
172
        for i in 0 to 1 loop
173
            DATA_RX       <= ARP_OPER_REQ(i);
174
            wait_tb_clk;
175
        end loop;
176
 
177
        -- Generate SHA
178
        for i in 0 to 5 loop
179
            DATA_RX       <= CMP_A_MAC_ADDR(i);
180
            wait_tb_clk;
181
        end loop;
182
 
183
        -- Generate SPA
184
        for i in 0 to 3 loop
185
            DATA_RX       <= CMP_A_IPV4_ADDR(i);
186
            wait_tb_clk;
187
        end loop;
188
 
189
        -- Generate THA
190
        for i in 0 to 5 loop
191
            DATA_RX       <= MY_MAC((47-i*8) downto (40-i*8));
192
            wait_tb_clk;
193
        end loop;
194
 
195
        -- Generate TPA
196
        for i in 0 to 3 loop
197
            DATA_RX       <= MY_IPV4((31-i*8) downto (24-i*8));
198
            wait_tb_clk;
199
        end loop;
200
 
201
        -- Remove the Data Valid flag
202
        DATA_VALID_RX <= '0';
203
 
204
        -- End of Generated ARP Packet
205
    end gen_valid_arp_req;
206
 
207
    -- 
208
    -- Generate a valid ARP request
209
    -- 
210
    procedure gen_valid_eth_pkt(payload_size_bytes : integer := 46) is
211
    begin
212
        -- Set the Data Valid flag
213
        DATA_VALID_RX <= '1';
214
 
215
        -- Generate BDCST DA
216
        for i in 0 to 5 loop
217
            DATA_RX       <= MY_MAC((47-i*8) downto (40-i*8));
218
            wait_tb_clk;
219
        end loop;
220
 
221
        -- Generate SA
222
        for i in 0 to 5 loop
223
            DATA_RX       <= CMP_A_MAC_ADDR(i);
224
            wait_tb_clk;
225
        end loop;
226
 
227
        -- Generate E_TYPE for IPV4
228
        for i in 0 to 1 loop
229
            DATA_RX       <= P_TYPE_IPV4(i);
230
            wait_tb_clk;
231
        end loop;
232
 
233
        -- Generate Payload
234
        for i in 1 to payload_size_bytes loop
235
            -- Incrementing bytes for payload
236
            DATA_RX       <= conv_std_logic_vector((i-1),8);
237
            wait_tb_clk;
238
        end loop;
239
 
240
        -- Generate fake FCS
241
        for i in 1 to 4 loop
242
            -- Incrementing bytes for FCS (x"F0",x"F1",etc)
243
            DATA_RX       <= conv_std_logic_vector(240+(i-1),8);
244
            wait_tb_clk;
245
        end loop;
246
 
247
        -- Remove the Data Valid flag
248
        DATA_VALID_RX <= '0';
249
 
250
        -- End of Generated Ethernet Packet
251
    end gen_valid_eth_pkt;
252
 
253
    -- 
254
    -- Receive an ARP response
255
    -- 
256
    procedure rec_arp_resp(wait_data_ack_tx : integer := 10) is
257
    begin
258
        -- Handle the response
259
        wait until DATA_VALID_TX = '1';
260
        wait_tx_clk(wait_data_ack_tx);
261
        DATA_ACK_TX   <= '1';
262
        wait_tx_clk;
263
        DATA_ACK_TX   <= '0';
264
        wait until DATA_VALID_TX = '0';
265
    end rec_arp_resp;
266
 
267
    -- 
268
    -- Reset the Testbench
269
    -- 
270
    procedure reset_tb(time : integer := 10) is
271
    begin
272
        -- hold reset state
273
        wait_tb_clk;
274
        ARESET <= '1';
275
        wait_tb_clk(time);
276
        ARESET <= '0';
277
    end reset_tb;
278
 
279
    -------------------------------------------------------------
280
    ----- BEGIN PROCESS -----------------------------------------
281
    -------------------------------------------------------------
282
    begin
283
 
284
        reset_tb;
285
        gen_valid_arp_req;
286
        rec_arp_resp;
287
        wait_tb_clk(10);
288
        gen_valid_eth_pkt(46);
289
        wait_tb_clk(10);
290
        gen_valid_arp_req;
291
        rec_arp_resp;
292
        wait_tb_clk(10);
293
        gen_valid_arp_req;
294
        rec_arp_resp;
295
        wait_tb_clk(10);
296
        gen_valid_eth_pkt(46);
297
        wait_tb_clk(10);
298
        gen_valid_eth_pkt(76);
299
        wait_tb_clk(10);
300
 
301
        -- stop the simulation once you're done
302
        wait_tb_clk(50);
303
        assert false
304
        report "End of Simulation"
305
        severity severity_c;
306
 
307
    end process;
308
 
309
 
310
end beh;
311
 
312
 

powered by: WebSVN 2.1.0

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