Files
b210-k7-fpga/lib/xge/rtl/verilog/tx_checker.v
T
Ben Hilburn fbbc991a7d Pushing the bulk of UHD-3.7.0 code.
Original-commit: ff1546f8137f7f92bb250f685561b0c34cc0e053
2014-02-14 12:05:07 -08:00

143 lines
3.6 KiB
Verilog

//
// 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