aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v
blob: 0027461865a6cc6fd4bc65ca0150459e4cf6ae8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
// Synthesizable Tx checker for 10G Ethernet MAC.
// Generates deterministic packets that can be looped back and
// checked for correctness
//
`define IDLE 0
`define MAC1 1
`define MAC2 2
`define PAYLOAD1 3
`define WAIT 4
`define DONE 5


module tx_checker
  (
   input clk156,
   input rst,
   input enable,
   output reg done,
   //
   output reg pkt_tx_val,
   output reg pkt_tx_sop,
   output reg pkt_tx_eop,
   output reg [2:0] pkt_tx_mod,
   output reg [63:0] pkt_tx_data
   );
   
   reg [10:0] 	 payload;
   reg [10:0] 	 count;
   reg [7:0] 	 state;
   reg [9:0] 	 delay;
   
   
   


always @(posedge clk156)
  if (rst)
    begin
       state <= `IDLE;
       count <= 0;
       payload <= 45; // 1 less than ethernet minimum payload size.\
       done <= 0;
       delay <= 0;
       pkt_tx_val <= 0;
       pkt_tx_sop <= 0;
       pkt_tx_eop <= 0;
       pkt_tx_data <= 0;
       pkt_tx_mod <= 0;
    end
  else 
    begin
       state <= state;
       pkt_tx_val <= 0;
       pkt_tx_sop <= 0;
       pkt_tx_eop <= 0;
       pkt_tx_data <= 0;
       pkt_tx_mod <= 0;
       payload <= payload;
       count <= count;
       done <= 0;
       delay <= delay;
       
       
  
       case(state)
	 // Wait in IDLE state until enabled.
	 // As we leave the idle state increment the payload count
	 // so that we have a test pattern that changes each iteration.
	 `IDLE: begin
	    if (enable)
	      begin
		 if (payload == 1500)
		   state <= `DONE;
		 else
		   begin
		      payload <= payload + 1; // Might need to tweak this later..
		      state <= `MAC1;
		   end
	      end
	 end
	 // Assert SOP (Start of Packet) for 1 cycle.
	 // Assert VAL (Tx Valid) for duration of packet.
	 // Put first 8 octets out, including
	 // DST MAC addr and first 2 bytes of SRC MAC.
	 `MAC1: begin
	    pkt_tx_val <= 1;
	    pkt_tx_sop <= 1;
	    pkt_tx_data[63:16] <= 48'h0001020304; // DST MAC
	    pkt_tx_data[15:0] <= 16'h0000; // SRC MAC msb's
	    pkt_tx_mod <= 3'h0; // All octects valid
	    state <= `MAC2;
	 end
	 // SOP now deasserted for rest of packet.
	 // VAL remains asserted.
	 // Tx rest of SRC MAC and ether type then first two data octets.
	 `MAC2: begin
	    pkt_tx_val <= 1;
	    pkt_tx_data[63:32] <= 32'h05060708; // SRC MAC lsb's
	    pkt_tx_data[31:16] <= 16'h88b5;     // Ethertype
	    pkt_tx_data[15:0] <= 16'hBEEF;      // First 2 bytes of payload.
	    pkt_tx_mod <= 3'h0; // All octects valid
	    count <= payload - 2; // Preload counter for this packet
	    state <= `PAYLOAD1;
	 end
	 // Iterate in this state until end of packet.
	 // The first clock cycle in this state, SRC MAC and ETHERTYPE are being Tx'ed due to pipelining
	 `PAYLOAD1: begin
	    pkt_tx_val <= 1;
	    pkt_tx_data <= {8{count[10:3]}}; // Data pattern is 64bit word count value.
	    count <= count - 8;
	    if ((count[10:3] == 0) || (count[10:0] == 8)) // down to 8 or less octects to Tx.
	      begin
		 pkt_tx_mod <= count[2:0];
		 pkt_tx_eop <= 1;
		 state <= `WAIT;
		 delay <= 20; // 20 cycle delay in END state before Tx next packet
	      end
	 end // case: `PAYLOAD1
	 // Because of pipelining EOP is actually asserted in this state
	 // but we are already commited to the end of packet so no decisions need to be made.
	 // Make signals idle ready for next state after.
	 // Delay start of next packet to rate control test.
	 `WAIT:begin
	    delay <= delay - 1;
	    if (delay == 0)
	      state <= `IDLE;	    
	 end
	 // Have now transmitted one packet of every legal size (no jumbo frames)
	 // Stay in this state asserting done flag until reset.
	 `DONE:begin 	   
	    state <= `DONE;
	    done <= 1;
	 end
	 
       endcase // case(state)
      
    end	    
	    
endmodule // tx_checker