OpenCores
URL https://opencores.org/ocsvn/1g_ethernet_dpi/1g_ethernet_dpi/trunk

Subversion Repositories 1g_ethernet_dpi

[/] [1g_ethernet_dpi/] [trunk/] [hw/] [src/] [tb/] [bfm_host/] [eth_host_bfm.sv] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 kuzmi4
//////////////////////////////////////////////////////////////////////////////////
2
// Company:
3
// Engineer:        IK
4
//
5
// Create Date:     11:35:01 03/21/2013
6
// Design Name:
7
// Module Name:     eth_host_bfm
8
// Project Name:
9
// Target Devices:
10
// Tool versions:
11
// Description:
12
//
13
//                  DPC-C import:
14
//                      -> 'test_bfm' / {net-adapt}
15
//
16
//                  DPI-C export:
17
//
18
//                      -> host_initial
19
//                      -> host_delay
20
//                      -> host_final
21
//
22
//                      -> eth_frm_read_len
23
//                      -> eth_frm_read
24
//
25
//                      -> eth_frm_write_len
26
//                      -> eth_frm_write
27
//
28
// Revision:
29
// Revision 0.01 - File Created,
30
//
31
//////////////////////////////////////////////////////////////////////////////////
32
`timescale 1ns / 1ps
33
 
34
module eth_host_bfm #(parameter p_ETH_MTU = 1536)
35
(
36
    // RSTi
37
    input   i_arst,
38
    // RGMII-RX
39
    input           i_rgmii_rx_clk,
40
    input           i_rgmii_rx_ctrl,
41
    input   [ 3:0]  iv_rgmii_rxd,
42
    // RGMII-TX
43
    output  logic           o_rgmii_tx_clk,
44
    output  logic           o_rgmii_tx_ctrl,
45
    output  logic   [ 3:0]  ov_rgmii_txd
46
);
47
//////////////////////////////////////////////////////////////////////////////////
48
localparam lp_BQNTY = 8;
49
//////////////////////////////////////////////////////////////////////////////////
50
// eth-pkt record
51
typedef struct {
52
    bit [7:0] data[];
53
    int len;
54
} packet_t;
55
// mbox for eth-pkt
56
typedef mailbox#(packet_t) pkt_mbox_t;
57
//////////////////////////////////////////////////////////////////////////////////
58
    // PKT-mboxes / TX+RX parts
59
    pkt_mbox_t tx_pkt_mailbox = new(/*lp_BQNTY*/);
60
    pkt_mbox_t rx_pkt_mailbox = new(lp_BQNTY);
61
    // 4dbg-tx
62
    packet_t    tx_pkt;
63
    int         tx_pkt_idx;
64
    // 4dbg-rx
65
    packet_t    rx_pkt;
66
    int         rx_pkt_idx;
67
 
68
    bit [7:0] data0 [256];
69
    int len0;
70
 
71
    // low-tx
72
    packet_t        tx_pkt_low;
73
    bit     [ 7:0]  sv_rgmii_txd;
74
    int             si_eth_tx_frm_cnt;
75
    // low-rx
76
    packet_t        rx_pkt_low;
77
    bit     [ 7:0]  sv_rgmii_rxd;
78
    bit             s_rgmii_rx_frm_end;
79
    int             si_eth_rx_frm_cnt;
80
 
81
//////////////////////////////////////////////////////////////////////////////////
82
//
83
// RGMII RX-TX Init
84
//
85
initial
86
begin   :   INIT
87
    // tx-ctrl
88
    o_rgmii_tx_clk = 0;
89
    o_rgmii_tx_ctrl = 0;
90
    ov_rgmii_txd = 0;
91
    // pkt
92
    tx_pkt_low.data = new [p_ETH_MTU];
93
    tx_pkt_low.len = -1;
94
 
95
    rx_pkt_low.data = new [p_ETH_MTU];
96
    rx_pkt_low.len = -1;
97
 
98
    rx_pkt.data = new [p_ETH_MTU];
99
    rx_pkt.len = -1;
100
    rx_pkt_idx = 0;
101
 
102
    tx_pkt_idx = 0;
103
    tx_pkt.data = new [p_ETH_MTU];
104
    tx_pkt.len = -1;
105
 
106
            // init-data
107
            tx_pkt.data[0] = 8'h55;
108
            tx_pkt.data[1] = 8'h55;
109
            tx_pkt.data[2] = 8'h55;
110
            tx_pkt.data[3] = 8'h55;
111
            tx_pkt.data[4] = 8'h55;
112
            tx_pkt.data[5] = 8'h55;
113
            tx_pkt.data[6] = 8'h55;
114
            tx_pkt.data[7] = 8'hD5;
115
 
116
    // Final
117
end
118
//////////////////////////////////////////////////////////////////////////////////
119
//
120
// RGMII RX-TX Clocking
121
//
122
clocking cb_rx @(posedge i_rgmii_rx_clk);
123
endclocking : cb_rx;
124
 
125
clocking cb_tx @(posedge o_rgmii_tx_clk);
126
endclocking : cb_tx;
127
 
128
always
129
begin   :   TX_CLK
130
    #(4ns) o_rgmii_tx_clk <= !o_rgmii_tx_clk;
131
end
132
 
133
//////////////////////////////////////////////////////////////////////////////////
134
//
135
// HDL RGMII
136
//
137
task run_tx;
138
    //
139
   forever
140
        eth_tx_frm();
141
    // Final
142
endtask : run_tx
143
 
144
task run_rx;
145
    //
146
   forever
147
        eth_rx_frm();
148
    // Final
149
endtask : run_rx
150
//////////////////////////////////////////////////////////////////////////////////
151
//
152
// RGMII-TX
153
//
154
task eth_tx_frm;
155
    //
156
    //
157
    @cb_tx;
158
    if (tx_pkt_mailbox.num())
159
        begin   :   ETH_TX
160
            // init
161
            sv_rgmii_txd = 0;
162
            si_eth_tx_frm_cnt = 0;
163
            // get
164
            tx_pkt_mailbox.get(tx_pkt_low);
165
            // chk
166
            /*if ((tx_pkt_low.len + 8) < (64 + 8))
167
                tx_pkt_low.len = 64;*/
168
            // out
169
            do begin : OUT
170
                sv_rgmii_txd = tx_pkt_low.data[si_eth_tx_frm_cnt++];
171
                write_byte(sv_rgmii_txd, (si_eth_tx_frm_cnt == (tx_pkt_low.len + 8)));
172
            end while (si_eth_tx_frm_cnt != (tx_pkt_low.len + 8));
173
        end
174
    // Final
175
endtask : eth_tx_frm
176
 
177
task write_byte(input bit [7:0] iv_data, input bit i_final);
178
    //
179
    @(negedge o_rgmii_tx_clk); #2ns;
180
    o_rgmii_tx_ctrl <= 1;
181
    ov_rgmii_txd <= iv_data[3:0];
182
    @(posedge o_rgmii_tx_clk); #2ns;
183
    ov_rgmii_txd <= iv_data[7:4];
184
    if (i_final)
185
        begin   :   END
186
            @(negedge o_rgmii_tx_clk); #2ns;
187
            o_rgmii_tx_ctrl <= 0;
188
            ov_rgmii_txd <= 0;
189
        end
190
    // Final
191
endtask : write_byte
192
//////////////////////////////////////////////////////////////////////////////////
193
//
194
// RGMII-RX
195
//
196
task eth_rx_frm;
197
    //
198
    // wait for RXC rise
199
    do @(posedge i_rgmii_rx_clk or negedge i_rgmii_rx_clk);
200
    while(i_rgmii_rx_ctrl == 0);
201
    // init
202
    sv_rgmii_rxd = 0;
203
    s_rgmii_rx_frm_end = 0;
204
    si_eth_rx_frm_cnt = 0;
205
    // rx-proc
206
    do begin : RX
207
        read_byte((si_eth_rx_frm_cnt == 0), sv_rgmii_rxd, s_rgmii_rx_frm_end);
208
        if (!s_rgmii_rx_frm_end)
209
            begin   :   WRK
210
                if (si_eth_rx_frm_cnt > 7) // !=> cut {55, .., D5} here
211
                    begin   :   WR_RX_PKT
212
                        rx_pkt_low.data[(si_eth_rx_frm_cnt - 8)] = sv_rgmii_rxd;
213
                    end
214
                si_eth_rx_frm_cnt++;
215
            end
216
    end while (s_rgmii_rx_frm_end == 0);
217
    s_rgmii_rx_frm_end = 0;
218
    rx_pkt_low.len = (si_eth_rx_frm_cnt - 8); $display("[%t]: %m: len=%x", $time, rx_pkt_low.len);
219
    rx_pkt_mailbox.put(rx_pkt_low);
220
    // final-dly
221
    @cb_rx;
222
    // Final
223
endtask : eth_rx_frm
224
 
225
task read_byte(input bit i_init, output bit [7:0] ov_data, output bit o_end);
226
    // init
227
    ov_data = -1;
228
    o_end = 0;
229
    // rx-dly
230
    if (i_init == 0) // 2nd, 3rd, .. starts
231
        @(posedge i_rgmii_rx_clk or negedge i_rgmii_rx_clk); // initial start - NO-DLY (eth_rx_frm -> 'wait for RXC rise')
232
    // lsb / prev detected RXC == 1 {RXEN-marker}
233
    ov_data[3:0] = iv_rgmii_rxd;
234
    // msb
235
    @(posedge i_rgmii_rx_clk or negedge i_rgmii_rx_clk);
236
    ov_data[7:4] = iv_rgmii_rxd;
237
    // frm-end chk
238
    if (i_rgmii_rx_ctrl == 0)
239
        o_end = 1;
240
    // Final
241
endtask : read_byte
242
//////////////////////////////////////////////////////////////////////////////////
243
//
244
// DPC-C routines
245
//  => GLBL
246
//
247
 
248
// DPI-C export / cpp-hdl
249
export "DPI-C" task host_initial;
250
export "DPI-C" task host_delay;
251
export "DPI-C" task host_final;
252
 
253
task host_initial;
254
    //
255
    do @cb_tx; // use our stable TX-CLK
256
    while (i_arst == 1);
257
    repeat(100) @cb_tx;
258
    $display("[%t]: %m: START", $time);
259
    // Final
260
endtask : host_initial
261
 
262
task host_delay(input int ii_value);
263
    //
264
    repeat(ii_value)
265
        @cb_tx;
266
    // Final
267
endtask : host_delay
268
 
269
task host_final;
270
    //
271
    repeat(10) @cb_tx;
272
    $finish;//$stop;
273
    // Final
274
endtask : host_final
275
 
276
 
277
// DPC-C import / MAIN
278
import "DPI-C" context task test_bfm();
279
 
280
initial
281
begin   :   MAIN_NET_ADAPT
282
    test_bfm();
283
end
284
 
285
//////////////////////////////////////////////////////////////////////////////////
286
//
287
// DPC-C routines
288
//  => RGMII-RX
289
//
290
 
291
export "DPI-C" task eth_frm_read_len;
292
export "DPI-C" task eth_frm_read;
293
 
294
task eth_frm_read_len(output int ov_len);
295
    //
296
    @cb_rx; // !!!
297
    if (rx_pkt_mailbox.num())
298
        begin   :   HAVE_RXD
299
            rx_pkt_mailbox.get(rx_pkt);
300
            ov_len = rx_pkt.len;
301
            rx_pkt_idx++; $display("[%t]: %m: len=%x", $time, rx_pkt.len);
302
        end
303
    else
304
        ov_len = -1;
305
    // Final
306
endtask : eth_frm_read_len
307
 
308
task eth_frm_read(output int ov_data, input int iv_position);
309
    //
310
    ov_data = rx_pkt.data[iv_position];
311
    // Final
312
endtask : eth_frm_read
313
//////////////////////////////////////////////////////////////////////////////////
314
//
315
// DPC-C routines
316
//  => RGMII-TX
317
//
318
 
319
export "DPI-C" task eth_frm_write_len; // !=> init pkt-PUT
320
export "DPI-C" task eth_frm_write;
321
 
322
task eth_frm_write_len(input int iv_len);
323
 
324
    len0 = iv_len;
325
    for (int i = 0; i < iv_len; i++) begin data0[i] = tx_pkt.data[i]; end
326
 
327
    // put
328
    tx_pkt.len = iv_len;
329
    tx_pkt_mailbox.put(tx_pkt);
330
    // nxt-idx
331
    tx_pkt_idx++;
332
    // Final
333
endtask : eth_frm_write_len;
334
 
335
task eth_frm_write(input int iv_data, input int iv_position);
336
    // wr
337
    @cb_tx; // !!!
338
    tx_pkt.data[iv_position+8] = iv_data;
339
    // Final
340
endtask : eth_frm_write
341
 
342
 
343
//////////////////////////////////////////////////////////////////////////////////
344
endmodule

powered by: WebSVN 2.1.0

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