aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v
diff options
context:
space:
mode:
Diffstat (limited to 'fpga/usrp3/lib/packet_proc/cvita_packet_debug.v')
-rw-r--r--fpga/usrp3/lib/packet_proc/cvita_packet_debug.v108
1 files changed, 108 insertions, 0 deletions
diff --git a/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v b/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v
new file mode 100644
index 000000000..68e32efe4
--- /dev/null
+++ b/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v
@@ -0,0 +1,108 @@
+//
+// 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