- Fixed 10GigE firmware communication issues and sequence errors for TX - Multiple changes to help ease timing closure - Cleaned up build scripts - Switched to Xilinx ISE 14.7 as the default build tool for X300 Original-commit: 64d71dcbc5fa6790385b288de25224d386b047b0
109 lines
2.7 KiB
Verilog
109 lines
2.7 KiB
Verilog
//
|
|
// Copyright 2014 Ettus Research LLC
|
|
//
|
|
|
|
module cvita_packet_debug (
|
|
input clk,
|
|
input reset,
|
|
input clear,
|
|
|
|
//Packet In
|
|
input [63:0] tdata,
|
|
input tlast,
|
|
input tvalid,
|
|
input tready,
|
|
|
|
//Per packet info
|
|
output reg pkt_strobe,
|
|
output reg [63:0] header,
|
|
output reg [63:0] timestamp,
|
|
output reg [15:0] actual_length,
|
|
output reg [63:0] checksum,
|
|
|
|
//Statistics
|
|
output reg [31:0] pkt_count,
|
|
output reg [31:0] ctrl_pkt_count
|
|
);
|
|
|
|
localparam ST_HEADER = 2'd0;
|
|
localparam ST_TIME = 2'd1;
|
|
localparam ST_DATA = 2'd2;
|
|
|
|
//Packet state logic
|
|
reg [1:0] pkt_state;
|
|
always @(posedge clk) begin
|
|
if (reset) begin
|
|
pkt_state <= ST_HEADER;
|
|
end else if (tvalid & tready) begin
|
|
case(pkt_state)
|
|
ST_HEADER: begin
|
|
if (!tlast)
|
|
pkt_state <= (tdata[61]) ? ST_TIME : ST_DATA;
|
|
end
|
|
ST_TIME: begin
|
|
pkt_state <= (tlast) ? ST_HEADER : ST_DATA;
|
|
end
|
|
ST_DATA: begin
|
|
pkt_state <= (tlast) ? ST_HEADER : ST_DATA;
|
|
end
|
|
default: pkt_state <= ST_HEADER;
|
|
endcase
|
|
end
|
|
end
|
|
|
|
//Trigger logic
|
|
always @(posedge clk)
|
|
if (reset)
|
|
pkt_strobe <= 1'b0;
|
|
else
|
|
pkt_strobe <= tvalid & tready & tlast;
|
|
|
|
//Header capture
|
|
always @(posedge clk)
|
|
if (reset)
|
|
header <= 64'd0;
|
|
else if (pkt_state == ST_HEADER)
|
|
if (tvalid & tready)
|
|
header <= tdata;
|
|
|
|
//Timestamp capture
|
|
always @(posedge clk)
|
|
if (reset)
|
|
timestamp <= 64'd0;
|
|
else if (pkt_state == ST_TIME)
|
|
if (tvalid & tready)
|
|
timestamp <= tdata;
|
|
|
|
//Length capture
|
|
always @(posedge clk)
|
|
if (reset || pkt_state == ST_HEADER)
|
|
actual_length <= (tvalid & tready & tlast) ? 16'd8 : 16'd0;
|
|
else
|
|
if (tvalid & tready)
|
|
actual_length <= actual_length + 16'd8;
|
|
|
|
//Checksum capture
|
|
always @(posedge clk)
|
|
if (reset || pkt_state == ST_HEADER)
|
|
checksum <= 64'd0;
|
|
else if (pkt_state == ST_DATA)
|
|
if (tvalid & tready)
|
|
checksum <= checksum ^ tdata;
|
|
|
|
//Counts
|
|
always @(posedge clk)
|
|
if (reset | clear) begin
|
|
pkt_count <= 32'd0;
|
|
ctrl_pkt_count <= 32'd0;
|
|
end else begin
|
|
if (tvalid & tready & tlast) begin
|
|
pkt_count <= pkt_count + 32'd1;
|
|
if (pkt_state == ST_HEADER && tdata[63])
|
|
ctrl_pkt_count <= ctrl_pkt_count + 32'd1;
|
|
else if (header[63])
|
|
ctrl_pkt_count <= ctrl_pkt_count + 32'd1;
|
|
end
|
|
end
|
|
|
|
endmodule // cvita_packet_debug
|