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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [examples/] [bridge/] [env/] [gmii_driver.v] - Blame information for rev 8

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

Line No. Rev Author Line
1 8 ghutchis
// Send an ethernet packet over GMII
2
 
3
module gmii_driver
4
  (output reg [7:0] rxd,
5
   output reg       rx_dv,
6
   output reg       rx_clk);
7
 
8
  integer           startup_skew;
9
 
10
  reg [7:0]          rxbuf [0:2048];
11
  reg [31:0]         crc32_result;
12
 
13
  // begin start clock with random skew amount
14
  initial
15
    begin
16
      startup_skew = {$random} % 200;
17
      rx_clk = 0;
18
      rx_dv = 0;
19
      rxd   = 0;
20
      repeat (startup_skew) #0.1;
21
      forever rx_clk = #4 ~rx_clk;
22
    end
23
 
24
  // Copied from: http://www.mindspring.com/~tcoonan/gencrc.v
25
  // 
26
  // Generate a (DOCSIS) CRC32.
27
  //
28
  // Uses the GLOBAL variables:
29
  //
30
  //    Globals referenced:
31
  //       parameter    CRC32_POLY = 32'h04C11DB7;
32
  //       reg [ 7:0]   crc32_packet[0:255];
33
  //       integer      crc32_length;
34
  //
35
  //    Globals modified:
36
  //       reg [31:0]   crc32_result;
37
  //
38
  localparam    CRC32_POLY = 32'h04C11DB7;
39
  task gencrc32;
40
    input [31:09] crc32_length;
41
    integer     cbyte, cbit;
42
    reg         msb;
43
    reg [7:0]    current_cbyte;
44
    reg [31:0]   temp;
45
    begin
46
      crc32_result = 32'hffffffff;
47
      for (cbyte = 0; cbyte < crc32_length; cbyte = cbyte + 1) begin
48
        current_cbyte = rxbuf[cbyte];
49
         for (cbit = 0; cbit < 8; cbit = cbit + 1) begin
50
            msb = crc32_result[31];
51
            crc32_result = crc32_result << 1;
52
            if (msb != current_cbyte[cbit]) begin
53
               crc32_result = crc32_result ^ CRC32_POLY;
54
               crc32_result[0] = 1;
55
            end
56
         end
57
      end
58
 
59
      // Last step is to "mirror" every bit, swap the 4 bytes, and then complement each bit.
60
      //
61
      // Mirror:
62
      for (cbit = 0; cbit < 32; cbit = cbit + 1)
63
         temp[31-cbit] = crc32_result[cbit];
64
 
65
      // Swap and Complement:
66
      crc32_result = ~{temp[7:0], temp[15:8], temp[23:16], temp[31:24]};
67
   end
68
endtask
69
 
70
  task send_packet;
71
    input [47:0] da, sa;
72
    input [15:0] length;
73
    integer      p;
74
    begin
75
      { rxbuf[0],rxbuf[1],rxbuf[2],rxbuf[3],rxbuf[4],rxbuf[5] } = da;
76
      { rxbuf[6],rxbuf[7],rxbuf[8],rxbuf[9],rxbuf[10],rxbuf[11] } = sa;
77
      for (p=12; p<length; p=p+1)
78
        rxbuf[p] = $random;
79
 
80
      gencrc32 (length);
81
      { rxbuf[length-4], rxbuf[length-3],
82
        rxbuf[length-2], rxbuf[length-1] } = crc32_result;
83
 
84
      $display ("%m : Sending packet DA=%x SA=%x of length %0d", da, sa, length);
85
      repeat (7)
86
        begin
87
          @(posedge rx_clk);
88
          rx_dv <= #1 1;
89
          rxd   <= #1 `GMII_PRE;
90
        end
91
 
92
      @(posedge rx_clk);
93
      rxd <= #1 `GMII_SFD;
94
 
95
      p = 0;
96
      while (p < length)
97
        begin
98
          @(posedge rx_clk);
99
          rxd <= #1 rxbuf[p];
100
          p = p + 1;
101
        end
102
 
103
      // complete 12B inter frame gap
104
      repeat (12)
105
        begin
106
          @(posedge rx_clk);
107
          rx_dv <= #1 0;
108
          rxd   <= #1 0;
109
        end
110
    end
111
  endtask // send_packet
112
 
113
 
114
endmodule // gmii_driver

powered by: WebSVN 2.1.0

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