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 4

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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