diff options
author | Ben Hilburn <ben.hilburn@ettus.com> | 2014-02-14 12:05:07 -0800 |
---|---|---|
committer | Ben Hilburn <ben.hilburn@ettus.com> | 2014-02-14 12:05:07 -0800 |
commit | ff1546f8137f7f92bb250f685561b0c34cc0e053 (patch) | |
tree | 7fa6fd05c8828df256a1b20e2935bd3ba9899e2c /fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v | |
parent | 4f691d88123784c2b405816925f1a1aef69d18c1 (diff) | |
download | uhd-ff1546f8137f7f92bb250f685561b0c34cc0e053.tar.gz uhd-ff1546f8137f7f92bb250f685561b0c34cc0e053.tar.bz2 uhd-ff1546f8137f7f92bb250f685561b0c34cc0e053.zip |
Pushing the bulk of UHD-3.7.0 code.
Diffstat (limited to 'fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v')
-rw-r--r-- | fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v b/fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v new file mode 100644 index 000000000..002746186 --- /dev/null +++ b/fpga/usrp3/lib/xge/rtl/verilog/tx_checker.v @@ -0,0 +1,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 + + +
\ No newline at end of file |