diff options
author | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2014-10-07 11:25:20 +0200 |
commit | fd3e84941de463fa1a7ebab0a69515b4bf2614cd (patch) | |
tree | 3fa721a13d41d2c0451d663a59a220a38fd5e614 /fpga/usrp3/lib/packet_proc | |
parent | 3b66804e41891e358c790b453a7a59ec7462dba4 (diff) | |
download | uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.gz uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.tar.bz2 uhd-fd3e84941de463fa1a7ebab0a69515b4bf2614cd.zip |
Removed copy of FPGA source files.
Diffstat (limited to 'fpga/usrp3/lib/packet_proc')
24 files changed, 0 insertions, 3034 deletions
diff --git a/fpga/usrp3/lib/packet_proc/.gitignore b/fpga/usrp3/lib/packet_proc/.gitignore deleted file mode 100644 index ca543057c..000000000 --- a/fpga/usrp3/lib/packet_proc/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vita.txt -xo.txt -zpu.txt diff --git a/fpga/usrp3/lib/packet_proc/Makefile.srcs b/fpga/usrp3/lib/packet_proc/Makefile.srcs deleted file mode 100644 index c4bf877a0..000000000 --- a/fpga/usrp3/lib/packet_proc/Makefile.srcs +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright 2013 Ettus Research LLC -# - -################################################## -# Packet Processing Sources -################################################## -PACKET_PROC_SRCS = $(abspath $(addprefix $(BASE_DIR)/../lib/packet_proc/, \ -eth_dispatch.v \ -ip_hdr_checksum.v \ -vrlp_eth_framer.v \ -chdr_eth_framer.v \ -eth_interface.v \ -vrlp_to_compressed_vita.v \ -compressed_vita_to_vrlp.v \ -source_flow_control.v \ -cvita_insert_tlast.v \ -cvita_dest_lookup.v \ -cvita_chunker.v \ -cvita_dechunker.v \ -axis_packet_debug.v \ -cvita_packet_debug.v \ -)) diff --git a/fpga/usrp3/lib/packet_proc/axis_packet_debug.v b/fpga/usrp3/lib/packet_proc/axis_packet_debug.v deleted file mode 100644 index 7d968e7b1..000000000 --- a/fpga/usrp3/lib/packet_proc/axis_packet_debug.v +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright 2014 Ettus Research LLC -// - -module axis_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 [15:0] length, - output reg [63:0] checksum, - - //Statistics - output reg [31:0] pkt_count -); - - localparam ST_HEADER = 1'b0; - localparam ST_DATA = 1'b1; - - //Packet state logic - reg pkt_state; - always @(posedge clk) begin - if (reset) begin - pkt_state <= ST_HEADER; - end else if (tvalid & tready) begin - pkt_state <= tlast ? ST_HEADER : ST_DATA; - end - end - - //Trigger logic - always @(posedge clk) - if (reset) - pkt_strobe <= 1'b0; - else - pkt_strobe <= tvalid & tready & tlast; - - //Length capture - always @(posedge clk) - if (reset || pkt_state == ST_HEADER) - length <= tlast ? 16'd8 : 16'd0; - else - if (tvalid & tready) - length <= length + 16'd8; - - //Checksum capture - always @(posedge clk) - if (reset || pkt_state == ST_HEADER) - checksum <= 64'd0; - else - if (tvalid & tready) - checksum <= checksum ^ tdata; - - //Counts - always @(posedge clk) - if (reset | clear) begin - pkt_count <= 32'd0; - end else begin - if (tvalid & tready & tlast) begin - pkt_count <= pkt_count + 32'd1; - end - end - -endmodule // cvita_packet_debug diff --git a/fpga/usrp3/lib/packet_proc/chdr_eth_framer.v b/fpga/usrp3/lib/packet_proc/chdr_eth_framer.v deleted file mode 100644 index ac56a7a32..000000000 --- a/fpga/usrp3/lib/packet_proc/chdr_eth_framer.v +++ /dev/null @@ -1,136 +0,0 @@ - -// chdr_eth_framer -// Takes a CHDR stream in and adds udp, ip, and ethernet framing -// Uses 8 setting reg addresses. First 4 are simple registers: -// BASE+0 : Upper 16 bits of ethernet src mac -// BASE+1 : Lower 32 bits of ethernet src mac -// BASE+2 : IP src address -// BASE+3 : UDP src port -// -// Next 4 control write ports on a RAM indexed by destination field of stream ID -// BASE+4 : Dest SID for next 3 regs -// BASE+5 : Dest IP -// BASE+6 : Dest UDP port, upper 16 bits of dest mac -// BASE+7 : Lower 32 bits of dest mac -// - -module chdr_eth_framer - #(parameter BASE=0) - (input clk, input reset, input clear, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - input [63:0] in_tdata, input in_tlast, input in_tvalid, output in_tready, - output [63:0] out_tdata, output [3:0] out_tuser, output out_tlast, output out_tvalid, input out_tready, - output [31:0] debug ); - - localparam SR_AWIDTH = 8; - - reg [7:0] sid; - reg [15:0] chdr_len; - - reg [2:0] vef_state; - localparam VEF_IDLE = 3'd0; - localparam VEF_PAYLOAD = 3'd7; - - reg [63:0] tdata; - - always @(posedge clk) - if(reset | clear) - begin - vef_state <= VEF_IDLE; - sid <= 8'd0; - chdr_len <= 16'd0; - end - else - case(vef_state) - VEF_IDLE : - if(in_tvalid) - begin - vef_state <= 1; - sid <= in_tdata[7:0]; - chdr_len <= in_tdata[47:32]; - end - VEF_PAYLOAD : - if(in_tvalid & out_tready) - if(in_tlast) - vef_state <= VEF_IDLE; - default : - if(out_tready) - vef_state <= vef_state + 3'd1; - endcase // case (vef_state) - - assign in_tready = (vef_state == VEF_PAYLOAD) ? out_tready : 1'b0; - assign out_tvalid = (vef_state == VEF_PAYLOAD) ? in_tvalid : (vef_state == VEF_IDLE) ? 1'b0 : 1'b1; - assign out_tlast = (vef_state == VEF_PAYLOAD) ? in_tlast : 1'b0; - assign out_tuser = ((vef_state == VEF_PAYLOAD) & in_tlast) ? {1'b0,chdr_len[2:0]} : 4'b0000; - assign out_tdata = tdata; - - wire [47:0] pad = 48'h0; - wire [47:0] mac_src, mac_dst; - wire [15:0] eth_type = 16'h0800; - wire [15:0] misc_ip = { 4'd4 /* IPv4 */, 4'd5 /* IP HDR Len */, 8'h00 /* DSCP and ECN */}; - wire [15:0] ip_len = (16'd28 + chdr_len); // 20 for IP, 8 for UDP - wire [15:0] ident = 16'h0; - wire [15:0] flag_frag = { 3'b010 /* don't fragment */, 13'h0 }; - wire [15:0] ttl_prot = { 8'h10 /* TTL */, 8'h11 /* UDP */ }; - wire [15:0] iphdr_checksum; - wire [31:0] ip_src, ip_dst; - wire [15:0] udp_src, udp_dst; - wire [15:0] udp_len = (16'd8 + chdr_len); - wire [15:0] udp_checksum = 16'h0; - - setting_reg #(.my_addr(BASE), .awidth(SR_AWIDTH), .width(16)) set_mac_upper - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[47:32]), .changed()); - - setting_reg #(.my_addr(BASE+1), .awidth(SR_AWIDTH), .width(32)) set_mac_lower - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[31:0]), .changed()); - - setting_reg #(.my_addr(BASE+2), .awidth(SR_AWIDTH), .width(32)) set_ip - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ip_src), .changed()); - - setting_reg #(.my_addr(BASE+3), .awidth(SR_AWIDTH), .width(16)) set_udp - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(udp_src), .changed()); - - // Tables of MAC/IP/UDP addresses - wire [7:0] ram_addr; // FIXME we could skip this part if we had wider SR addresses - - setting_reg #(.my_addr(BASE+4), .awidth(SR_AWIDTH), .width(8)) set_ram_addr - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ram_addr), .changed()); - - ram_2port #(.DWIDTH(32), .AWIDTH(8)) ram_ip - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+5)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[7:0]), .dib(32'hFFFF_FFFF), .dob(ip_dst)); - - ram_2port #(.DWIDTH(32), .AWIDTH(8)) ram_udpmac - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+6)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[7:0]), .dib(32'hFFFF_FFFF), .dob({udp_dst,mac_dst[47:32]})); - - ram_2port #(.DWIDTH(32), .AWIDTH(8)) ram_maclower - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+7)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[7:0]), .dib(32'hFFFF_FFFF), .dob(mac_dst[31:0])); - - ip_hdr_checksum ip_hdr_checksum - (.clk(clk), .in({misc_ip,ip_len,ident,flag_frag,ttl_prot,16'd0,ip_src,ip_dst}), - .out(iphdr_checksum)); - - always @* - case(vef_state) - 1 : tdata <= { pad[47:0], mac_dst[47:32]}; - 2 : tdata <= { mac_dst[31:0], mac_src[47:16]}; - 3 : tdata <= { mac_src[15:0], eth_type[15:0], misc_ip[15:0], ip_len[15:0] }; - 4 : tdata <= { ident[15:0], flag_frag[15:0], ttl_prot[15:0], iphdr_checksum[15:0]}; - 5 : tdata <= { ip_src, ip_dst}; - 6 : tdata <= { udp_src, udp_dst, udp_len, udp_checksum}; - default : tdata <= in_tdata; - endcase // case (vef_state) - -endmodule // chdr_eth_framer diff --git a/fpga/usrp3/lib/packet_proc/compressed_vita_to_vrlp.v b/fpga/usrp3/lib/packet_proc/compressed_vita_to_vrlp.v deleted file mode 100644 index 11595f200..000000000 --- a/fpga/usrp3/lib/packet_proc/compressed_vita_to_vrlp.v +++ /dev/null @@ -1,78 +0,0 @@ - -module compressed_vita_to_vrlp - (input clk, input reset, input clear, - input [63:0] i_tdata, input i_tlast, input i_tvalid, output i_tready, - output [63:0] o_tdata, output [15:0] o_tuser, output o_tlast, output o_tvalid, input o_tready - ); - - wire [19:0] vrlp_size = 20'd3 + {4'b0000,i_tdata[47:32]}; - reg odd_len; - reg [2:0] cv2v_state; - - reg [63:0] o_tdata_int; - wire o_tlast_int, o_tvalid_int, o_tready_int; - - localparam CV2V_VRLP = 3'd0; // VRLP header - localparam CV2V_VRT_ECH = 3'd1; // Extension context header - localparam CV2V_VRT_IFH = 3'd2; // IF Data header - localparam CV2V_BODY = 3'd3; - localparam CV2V_VEND_ODD = 3'd4; - localparam CV2V_VEND_EVEN = 3'd4; - - always @(posedge clk) - if(reset | clear) - begin - cv2v_state <= CV2V_VRLP; - odd_len <= 1'b0; - end - else - case(cv2v_state) - CV2V_VRLP : - if(i_tvalid & o_tready_int) - begin - odd_len <= i_tdata[32]; - if(i_tdata[63]) - cv2v_state <= CV2V_VRT_ECH; - else - cv2v_state <= CV2V_VRT_IFH; - end - - CV2V_VRT_ECH, CV2V_VRT_IFH : - if(i_tvalid & o_tready_int) - cv2v_state <= CV2V_BODY; - - CV2V_BODY : - if(i_tlast & i_tvalid & o_tready_int) - if(odd_len) - cv2v_state <= CV2V_VRLP; - else - cv2v_state <= CV2V_VEND_EVEN; - - CV2V_VEND_EVEN : - if(o_tready_int) - cv2v_state <= CV2V_VRLP; - endcase // case (cv2v_state) - - assign i_tready = o_tready_int & (cv2v_state != CV2V_VRLP) & (cv2v_state != CV2V_VEND_EVEN); - assign o_tvalid_int = i_tvalid | (cv2v_state == CV2V_VEND_EVEN); - - always @* - case(cv2v_state) - CV2V_VRLP : o_tdata_int <= { 32'h5652_4c50 /*VRLP*/, i_tdata[59:48] /*seqnum*/, vrlp_size[19:0] }; - CV2V_VRT_ECH : o_tdata_int <= { 4'h5 /*type*/, 4'h0, 3'b00, i_tdata[61] /*time*/, i_tdata[51:48] /*seqnum*/, i_tdata[47:32] /*len*/, i_tdata[31:0] /*sid*/ }; - CV2V_VRT_IFH : o_tdata_int <= { 4'h1 /*type*/, 1'b0, i_tdata[62] /*TRL*/, 1'b0, i_tdata[60] /*eob*/, 3'b00, i_tdata[61] /*time*/, i_tdata[51:48] /*seqnum*/, i_tdata[47:32] /*len*/, i_tdata[31:0] /*sid*/ }; - CV2V_BODY : o_tdata_int <= (i_tlast & odd_len) ? { i_tdata[63:32], 32'h5645_4E44 /*VEND*/ } : i_tdata; - CV2V_VEND_EVEN : o_tdata_int <= { 32'h5645_4E44 /*VEND*/, 32'h0}; - default : o_tdata_int <= i_tdata; - endcase // case (cv2v_state) - - assign o_tlast_int = (cv2v_state == CV2V_VEND_EVEN) | ((cv2v_state == CV2V_BODY) & i_tlast & odd_len); - - // Short FIFO before output - axi_fifo_short #(.WIDTH(81)) axi_fifo_short - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({o_tlast_int, i_tdata[15:0], o_tdata_int}), .i_tvalid(o_tvalid_int), .i_tready(o_tready_int), - .o_tdata({o_tlast, o_tuser, o_tdata}), .o_tvalid(o_tvalid), .o_tready(o_tready), - .space(), .occupied()); - -endmodule // compressed_vita_to_vrlp diff --git a/fpga/usrp3/lib/packet_proc/cvita_chunker.v b/fpga/usrp3/lib/packet_proc/cvita_chunker.v deleted file mode 100644 index cbc34d00a..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_chunker.v +++ /dev/null @@ -1,91 +0,0 @@ -// -// Copyright 2013 Ettus Research LLC -// - -// Quantize cvita packets to a configurable quantum value. o_tlast and -// i_tready will be held off until the entire quantized packet is xferred. -// If quantum is changed, it is the responsibility of the client to clear -// this module. error is asserted if a packet is larger than the quantum -// error can be reset by asserting reset or clear. - -module cvita_chunker # ( - parameter PAD_VALUE = 64'hFFFFFFFF_FFFFFFFF -) ( - input clk, - input reset, - input clear, - input [15:0] frame_size, - - input [63:0] i_tdata, - input i_tlast, - input i_tvalid, - output i_tready, - - output [63:0] o_tdata, - output o_tlast, - output o_tvalid, - input o_tready, - - output error -); - - localparam ST_HEADER = 2'd0; - localparam ST_DATA = 2'd1; - localparam ST_PADDING = 2'd2; - localparam ST_ERROR = 2'd3; - - reg [1:0] state; - reg [15:0] frame_rem; - - wire [15:0] cvita_len_ceil = i_tdata[47:32] + 7; - wire [15:0] axi_len = {3'b000, cvita_len_ceil[15:3]}; - - always @(posedge clk) begin - if (reset | clear) begin - state <= ST_HEADER; - frame_rem <= 16'd0; - end else if (o_tvalid & o_tready) begin - case (state) - ST_HEADER: begin - if (axi_len > frame_size) - state <= ST_ERROR; - else if (i_tlast) - state <= ST_PADDING; - else - state <= ST_DATA; - - frame_rem <= frame_size - 16'd1; - end - - ST_DATA: begin - if (i_tlast) begin - state <= o_tlast ? ST_HEADER : ST_PADDING; - frame_rem <= o_tlast ? 16'd0 : (frame_rem - 16'd1); - end else begin - state <= ST_DATA; - frame_rem <= frame_rem - 16'd1; - end - end - - ST_PADDING: begin - if (o_tlast) begin - state <= ST_HEADER; - frame_rem <= 16'd0; - end else begin - state <= ST_PADDING; - frame_rem <= frame_rem - 16'd1; - end - end - endcase - end - end - - assign i_tready = o_tready & (state != ST_PADDING); - - assign o_tvalid = i_tvalid | (state == ST_PADDING); - assign o_tlast = (frame_rem != 0) ? (frame_rem == 16'd1) : (axi_len == 16'd1); - assign o_tdata = (state == ST_PADDING) ? PAD_VALUE : i_tdata; - - assign error = (state == ST_ERROR); - -endmodule // cvita_chunker diff --git a/fpga/usrp3/lib/packet_proc/cvita_chunker_tb.v b/fpga/usrp3/lib/packet_proc/cvita_chunker_tb.v deleted file mode 100644 index 08f46d72a..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_chunker_tb.v +++ /dev/null @@ -1,187 +0,0 @@ -// -// Copyright 2013 Ettus Research LLC -// - - -`timescale 500ps/1ps - -module cvita_chunker_tb(); - - // TB stimulus - reg clk = 0; - reg reset = 1; - reg clear = 0; - reg [15:0] quantum; - - // Check vars - reg [31:0] o_xfer_count = 0, i_xfer_count = 0; - reg [63:0] o_last_tdata = 0; - - - always #10 clk = ~clk; - - initial $dumpfile("cvita_chunker_tb.vcd"); - initial $dumpvars(0,cvita_chunker_tb); - - function check_result; - input [31:0] o_xfer_count_arg; - input [31:0] i_xfer_count_arg; - input [63:0] o_last_tdata_arg; - input error_arg; - begin - //Check vars - check_result = 1; - check_result = check_result & ((o_xfer_count_arg == o_xfer_count) !== 0); - check_result = check_result & ((i_xfer_count_arg == i_xfer_count) !== 0); - check_result = check_result & ((o_last_tdata_arg == o_last_tdata) !== 0); - check_result = check_result & ((error_arg == error) != 0); - - if (check_result) begin - $display ("... Passed"); - end else begin - $display ("... FAILED!!!"); - $display ("o_xfer_count = %d (Expected %d)",o_xfer_count,o_xfer_count_arg); - $display ("i_xfer_count = %d (Expected %d)",i_xfer_count,i_xfer_count_arg); - $display ("o_last_tdata = %h (Expected %h)",o_last_tdata,o_last_tdata_arg); - $display ("error = %d (Expected %d)",error,error_arg); - end - - //Reset vars - o_xfer_count = 0; - i_xfer_count = 0; - o_last_tdata = 64'h0; - end - endfunction - - task send_packet; - input [63:0] data_start; - input [31:0] len; - - begin - if(len < 9) begin - {i_tlast, i_tdata} <= { 1'b1, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - i_tvalid <= 0; - end else begin - {i_tlast, i_tdata} <= { 1'b0, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - repeat(((len-1)/8)-1) begin - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - @(posedge clk); - end - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - i_tlast <= 1; - @(posedge clk); - i_tvalid <= 0; - end // else: !if(len < 3) - end - endtask // send_packet - - task reset_quantum_atomic; - input [15:0] quant; - begin - quantum <= quant; - clear <= 1; - @(posedge clk); - clear <= 0; - @(posedge clk); - end - endtask // reset_quantum_atomic - - - initial begin - #100 reset = 0; - #200000; - $finish; - end - - reg [63:0] i_tdata; - reg i_tlast; - reg i_tvalid; - wire i_tready; - - wire [63:0] o_tdata; - wire o_tlast, o_tvalid, o_tready; - wire error; - - initial begin - quantum <= 256; - i_tvalid <= 0; - while(reset) @(posedge clk); - - $write ("Running test case: First packet after reset"); - send_packet(64'h00000001_00000000, 128); - while(o_tvalid) @(posedge clk); - check_result(256,16,64'hFFFFFFFF_FFFFFFFF,0); - - reset_quantum_atomic(8); - - $write ("Running test case: sizeof(packet) < quantum"); - send_packet(64'h00000001_00000000, 40); - while(o_tvalid) @(posedge clk); - check_result(8,5,64'hFFFFFFFF_FFFFFFFF,0); - - reset_quantum_atomic(5); - - $write ("Running test case: sizeof(packet) == quantum"); - send_packet(64'h00000001_00000000, 40); - while(o_tvalid) @(posedge clk); - check_result(5,5,64'h00000030_00000008,0); - - $write ("Running test case: sizeof(packet) == quantum - 64bits"); - send_packet(64'h00000001_00000000, 32); - while(o_tvalid) @(posedge clk); - check_result(5,4,64'hFFFFFFFF_FFFFFFFF,0); - - $write ("Running test case: sizeof(packet) == quantum + 64bits"); - send_packet(64'h00000001_00000000, 48); - while(o_tvalid) @(posedge clk); - check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,1); - - $write ("Running test case: Error reset"); - reset_quantum_atomic(8); - check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,0); - - $write ("Running test case: sizeof(packet) > quantum"); - send_packet(64'h00000001_00000000, 80); - while(o_tvalid) @(posedge clk); - check_result(32'hxxxxxxxx,32'hxxxxxxxx,64'hxxxxxxxx_xxxxxxxx,1); - - reset_quantum_atomic(8); - - $write ("Running test case: sizeof(packet) == 2"); - send_packet(64'h00000001_00000000, 8); - while(o_tvalid) @(posedge clk); - check_result(8,1,64'hFFFFFFFF_FFFFFFFF,0); - - $write ("Running test case: Multiple packets back-to-back"); - send_packet(64'h00000001_00000000, 40); - while(o_tvalid) @(posedge clk); - send_packet(64'h00000001_00000000, 16); - while(o_tvalid) @(posedge clk); - send_packet(64'h00000001_00000000, 64); - while(o_tvalid) @(posedge clk); - check_result(24,15,64'h0000004e0000000e,0); - - end // initial begin - - - cvita_chunker dut ( - .clk(clk), .reset(reset), .clear(clear), .frame_size(quantum), - .i_tdata(i_tdata), .i_tlast(i_tlast), .i_tvalid(i_tvalid), .i_tready(i_tready), - .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready), - .error(error)); - - assign o_tready = 1; - - always @(posedge clk) begin - if (o_tvalid & o_tready) begin - o_xfer_count <= o_xfer_count + 1; - o_last_tdata <= o_tdata; - end - if (i_tvalid & i_tready) i_xfer_count <= i_xfer_count + 1; - end - -endmodule // cvita_chunker_tb diff --git a/fpga/usrp3/lib/packet_proc/cvita_dechunker.v b/fpga/usrp3/lib/packet_proc/cvita_dechunker.v deleted file mode 100644 index 2ad873305..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_dechunker.v +++ /dev/null @@ -1,90 +0,0 @@ -// -// Copyright 2013 Ettus Research LLC -// - - -module cvita_dechunker # ( - parameter PAD_VALUE = 64'hFFFFFFFF_FFFFFFFF -) ( - input clk, - input reset, - input clear, - input [15:0] frame_size, - - input [63:0] i_tdata, - input i_tvalid, - output i_tready, - - output [63:0] o_tdata, - output o_tlast, - output o_tvalid, - input o_tready, - - output error -); - - localparam ST_HEADER = 2'd0; - localparam ST_DATA = 2'd1; - localparam ST_PADDING = 2'd2; - localparam ST_ERROR = 2'd3; - - reg [1:0] state; - reg [15:0] frame_rem, pkt_rem; - wire i_tlast; - - wire [15:0] cvita_len_ceil = i_tdata[47:32] + 7; - wire [15:0] axi_len = {3'b000, cvita_len_ceil[15:3]}; - - always @(posedge clk) begin - if (reset | clear) begin - state <= ST_HEADER; - frame_rem <= 16'd0; - pkt_rem <= 16'd0; - end else if (i_tvalid & i_tready) begin - case (state) - ST_HEADER: begin - if (axi_len > frame_size) - state <= ST_ERROR; - else if (~o_tlast) - state <= ST_DATA; - else - state <= ST_PADDING; - - frame_rem <= frame_size - 16'd1; - pkt_rem <= axi_len - 16'd1; - end - - ST_DATA: begin - if (o_tlast) begin - state <= i_tlast ? ST_HEADER : ST_PADDING; - pkt_rem <= 16'd0; - end else begin - state <= ST_DATA; - pkt_rem <= pkt_rem - 16'd1; - end - frame_rem <= frame_rem - 16'd1; - end - - ST_PADDING: begin - if (i_tlast) begin - state <= ST_HEADER; - frame_rem <= 16'd0; - end else begin - state <= ST_PADDING; - frame_rem <= frame_rem - 16'd1; - end - end - endcase - end - end - - assign i_tready = o_tready | (state == ST_PADDING); - assign i_tlast = (frame_rem == 16'd1); //Temp signal - - assign o_tvalid = i_tvalid & (state != ST_PADDING); - assign o_tlast = (pkt_rem != 0) ? (pkt_rem == 16'd1) : (axi_len == 16'd1); - assign o_tdata = i_tdata; - - assign error = (state == ST_ERROR); - -endmodule // cvita_dechunker diff --git a/fpga/usrp3/lib/packet_proc/cvita_dechunker_tb.v b/fpga/usrp3/lib/packet_proc/cvita_dechunker_tb.v deleted file mode 100644 index 198eb4c40..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_dechunker_tb.v +++ /dev/null @@ -1,183 +0,0 @@ -// -// Copyright 2013 Ettus Research LLC -// - - -`timescale 500ps/1ps - -module cvita_dechunker_tb(); - - // TB stimulus - reg clk = 0; - reg reset = 1; - reg clear = 0; - reg [15:0] quantum; - wire error; - - // Check vars - reg [31:0] o_xfer_count = 0, i_xfer_count = 0; - reg [63:0] o_last_tdata = 0; - - - always #10 clk = ~clk; - - initial $dumpfile("cvita_dechunker_tb.vcd"); - initial $dumpvars(0,cvita_dechunker_tb); - - function check_result; - input [31:0] o_xfer_count_arg; - input [31:0] i_xfer_count_arg; - input [63:0] o_last_tdata_arg; - input error_arg; - begin - //Check vars - check_result = 1; - check_result = check_result & ((o_xfer_count_arg == o_xfer_count) !== 0); - check_result = check_result & ((i_xfer_count_arg == i_xfer_count) !== 0); - check_result = check_result & ((o_last_tdata_arg == o_last_tdata) !== 0); - check_result = check_result & ((error_arg == error) != 0); - - if (check_result) begin - $display ("... Passed"); - end else begin - $display ("... FAILED!!!"); - $display ("o_xfer_count = %d (Expected %d)",o_xfer_count,o_xfer_count_arg); - $display ("i_xfer_count = %d (Expected %d)",i_xfer_count,i_xfer_count_arg); - $display ("o_last_tdata = %h (Expected %h)",o_last_tdata,o_last_tdata_arg); - $display ("error = %d (Expected %d)",error,error_arg); - end - - //Reset vars - o_xfer_count = 0; - i_xfer_count = 0; - o_last_tdata = 64'h0; - end - endfunction - - task send_packet; - input [63:0] data_start; - input [31:0] len; - input [31:0] quant; - - begin - if(quant < 2) begin - {i_tlast, i_tdata} <= { 1'b1, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - i_tvalid <= 0; - end else begin - {i_tlast, i_tdata} <= { 1'b0, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - repeat(quant - 2) begin - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - @(posedge clk); - end - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - i_tlast <= 1; - @(posedge clk); - i_tvalid <= 1'b0; - end // else: !if(len < 3) - end - endtask // send_packet - - task reset_quantum_atomic; - input [15:0] quant; - begin - quantum <= quant; - clear <= 1; - @(posedge clk); - clear <= 0; - @(posedge clk); - end - endtask // reset_quantum_atomic - - - initial begin - #100 reset = 0; - #200000; - $finish; - end - - reg [63:0] i_tdata; - reg i_tlast; - reg i_tvalid; - wire i_tready; - - wire [63:0] o_tdata; - wire o_tlast, o_tvalid, o_tready; - - initial begin - quantum <= 8; - i_tvalid <= 0; - while(reset) @(posedge clk); - - $write ("Running test case: First packet after reset"); - send_packet(64'h00000001_00000000, 32, 8); - @(posedge clk); - check_result(4,8,64'hxxxxxxxx_xxxxxx06, 0); - - reset_quantum_atomic(10); - - $write ("Running test case: sizeof(packet) < quantum"); - send_packet(64'h00000001_00000000, 64, 10); - @(posedge clk); - check_result(8,10,64'hxxxxxxxx_xxxxxx0e, 0); - - $write ("Running test case: sizeof(packet) == quantum"); - send_packet(64'h00000001_00000000, 80, 10); - @(posedge clk); - check_result(10,10,64'hxxxxxxxx_xxxxxx12, 0); - - $write ("Running test case: sizeof(packet) == quantum - 64bits"); - send_packet(64'h00000001_00000000, 72, 10); - @(posedge clk); - check_result(9,10,64'hxxxxxxxx_xxxxxx10, 0); - - $write ("Running test case: sizeof(packet) == quantum + 64bits"); - send_packet(64'h00000001_00000000, 88, 10); - @(posedge clk); - check_result(32'hxxxxxxxx,10,64'hxxxxxxxx_xxxxxxxx, 1); - - reset_quantum_atomic(10); - - $write ("Running test case: sizeof(packet) > quantum"); - send_packet(64'h00000001_00000000, 88, 10); - @(posedge clk); - check_result(32'hxxxxxxxx,10,64'hxxxxxxxx_xxxxxxxx, 1); - - reset_quantum_atomic(8); - - $write ("Running test case: sizeof(packet) == 2"); - send_packet(64'h00000001_00000000, 8, 8); - @(posedge clk); - check_result(1,8,64'hxxxxxxxx_xxxxxx00, 0); - - $write ("Running test case: Multiple packets"); - send_packet(64'h00000001_00000000, 8, 8); - send_packet(64'h00000001_00000000, 16, 8); - send_packet(64'h00000001_00000000, 24, 8); - send_packet(64'h00000001_00000000, 32, 8); - @(posedge clk); - check_result(10,32,64'hxxxxxxxx_xxxxxx06, 0); - - end // initial begin - - - cvita_dechunker dut ( - .clk(clk), .reset(reset), .clear(clear), .frame_size(quantum), - .i_tdata(i_tdata), .i_tvalid(i_tvalid), .i_tready(i_tready), - .o_tdata(o_tdata), .o_tlast(o_tlast), .o_tvalid(o_tvalid), .o_tready(o_tready), - .error(error)); - - assign o_tready = 1; - - always @(posedge clk) begin - if (o_tvalid & o_tready) begin - o_xfer_count <= o_xfer_count + 1; - o_last_tdata <= o_tdata; - end - if (i_tvalid & i_tready) i_xfer_count <= i_xfer_count + 1; - end - -endmodule // cvita_dechunker_tb diff --git a/fpga/usrp3/lib/packet_proc/cvita_dest_lookup.v b/fpga/usrp3/lib/packet_proc/cvita_dest_lookup.v deleted file mode 100644 index 5951b127a..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_dest_lookup.v +++ /dev/null @@ -1,48 +0,0 @@ - -// Map the endpoint dest part of the SID in the CVITA header to a destination -// This destination (o_tdest) signal will be valid with o_tdata -// This only works with VALID CVITA frames - -module cvita_dest_lookup -#( - parameter DEST_WIDTH = 4 -) -( - input clk, input rst, - input set_stb, input [7:0] set_addr, input [DEST_WIDTH-1:0] set_data, - input [63:0] i_tdata, input i_tlast, input i_tvalid, output i_tready, - output [63:0] o_tdata, output o_tlast, output o_tvalid, input o_tready, - output [DEST_WIDTH-1:0] o_tdest -); - - reg [7:0] endpoint; - ram_2port #(.DWIDTH(DEST_WIDTH), .AWIDTH(8)) dest_lut - ( - .clka(clk), .ena(1'b1), .wea(set_stb), .addra(set_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(endpoint), .dib(8'hff), .dob(o_tdest) - ); - - reg forward; - reg [1:0] count; - always @(posedge clk) begin - if (rst) begin - forward <= 1'b0; - count <= 2'b0; - end - else if (forward == 1'b0 && i_tvalid) begin - if (count == 2'b11) forward <= 1'b1; - endpoint <= i_tdata[23:16]; - count <= count + 1'b1; - end - else if (forward == 1'b1 && i_tvalid && i_tready && i_tlast) begin - forward <= 1'b0; - count <= 2'b0; - end - end - - assign o_tdata = i_tdata; - assign o_tlast = i_tlast; - assign o_tvalid = i_tvalid && forward; - assign i_tready = o_tready && forward; - -endmodule // cvita_dest_lookup diff --git a/fpga/usrp3/lib/packet_proc/cvita_insert_tlast.v b/fpga/usrp3/lib/packet_proc/cvita_insert_tlast.v deleted file mode 100644 index 8d5c4f981..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_insert_tlast.v +++ /dev/null @@ -1,33 +0,0 @@ - -// Insert tlast bit for fifos that don't support it. This only works with VALID CVITA frames -// A single partial or invalid frame will make this wrong FOREVER - -module cvita_insert_tlast - (input clk, input reset, input clear, - input [63:0] i_tdata, input i_tvalid, output i_tready, - output [63:0] o_tdata, output o_tlast, output o_tvalid, input o_tready); - - assign o_tdata = i_tdata; - assign o_tvalid = i_tvalid; - assign i_tready = o_tready; - - wire [15:0] cvita_len_ceil = i_tdata[47:32] + 7; - wire [15:0] axi_len = {3'b000, cvita_len_ceil[15:3]}; - - reg [15:0] count; - - assign o_tlast = (count != 0) ? (count == 16'd1) : (axi_len == 16'd1); - - always @(posedge clk) - if(reset | clear) - begin - count <= 16'd0; - end - else - if(i_tready & i_tvalid) - if(count != 16'd0) - count <= count - 16'd1; - else - count <= axi_len - 16'd1; - -endmodule // cvita_insert_tlast diff --git a/fpga/usrp3/lib/packet_proc/cvita_insert_tlast_tb.v b/fpga/usrp3/lib/packet_proc/cvita_insert_tlast_tb.v deleted file mode 100644 index 6398c40a4..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_insert_tlast_tb.v +++ /dev/null @@ -1,92 +0,0 @@ -`timescale 1ns/1ps - -module cvita_insert_tlast_tb(); - - reg clk = 0; - reg reset = 1; - - always #10 clk = ~clk; - - initial $dumpfile("cvita_insert_tlast_tb.vcd"); - initial $dumpvars(0,cvita_insert_tlast_tb); - - task send_packet; - input [63:0] data_start; - input [31:0] len; - - begin - if(len < 9) - begin - {i_tlast, i_tdata} <= { 1'b1, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - i_tvalid <= 0; - end - else - begin - {i_tlast, i_tdata} <= { 1'b0, data_start[63:48],len[15:0], data_start[31:0] }; - i_tvalid <= 1; - @(posedge clk); - repeat(((len-2)/2)-1+len[0]) - begin - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - @(posedge clk); - end - i_tdata <= i_tdata + 64'h0000_0002_0000_0002; - i_tlast <= 1; - @(posedge clk); - i_tvalid <= 1'b0; - end // else: !if(len < 3) - end - endtask // send_packet - - initial - begin - #1000 reset = 0; - #200000; - $finish; - end - - reg [63:0] i_tdata; - reg i_tlast; - reg i_tvalid; - wire i_tready; - - wire [63:0] o_tdata; - wire o_tlast, o_tvalid, o_tready, o_tlast_regen; - - initial - begin - i_tvalid <= 0; - - while(reset) - @(posedge clk); - @(posedge clk); - - send_packet(64'hA0000000_A0000001, 24); - send_packet(64'hA0000000_A0000001, 20); - send_packet(64'hA0000000_A0000001, 16); - send_packet(64'hA0000000_A0000001, 12); - send_packet(64'hA0000000_A0000001, 8); - send_packet(64'hA0000000_A0000001, 4); - send_packet(64'hA0000000_A0000001, 4); - send_packet(64'hA0000000_A0000001, 8); - send_packet(64'hA0000000_A0000001, 12); - end // initial begin - - cvita_insert_tlast dut - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata(i_tdata), .i_tvalid(i_tvalid), .i_tready(i_tready), - .o_tdata(o_tdata), .o_tlast(o_tlast_regen), .o_tvalid(o_tvalid), .o_tready(o_tready)); - - assign o_tready = 1; - - - always @(posedge clk) - if(o_tvalid & o_tready) - begin - $display ("TLAST %x\t TLAST_REGEN %x",i_tlast, o_tlast_regen); - if(i_tlast != o_tlast_regen) - $display("ERROR!!!!!!"); - end -endmodule // cvita_insert_tlast_tb diff --git a/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v b/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v deleted file mode 100644 index 68e32efe4..000000000 --- a/fpga/usrp3/lib/packet_proc/cvita_packet_debug.v +++ /dev/null @@ -1,108 +0,0 @@ -// -// 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 diff --git a/fpga/usrp3/lib/packet_proc/eth_dispatch.v b/fpga/usrp3/lib/packet_proc/eth_dispatch.v deleted file mode 100644 index c21c0b8cb..000000000 --- a/fpga/usrp3/lib/packet_proc/eth_dispatch.v +++ /dev/null @@ -1,516 +0,0 @@ - -// Ethernet dispatcher -// Incoming ethernet packets are examined and sent to the correct destination -// There are 3 destinations, ZPU, other ethernet port (out), and vita router -// Packets going to the vita router will have the ethernet/ip/udp headers stripped off. -// -// To make things simpler, we start out by sending all packets to zpu and out port. -// By the end of the eth/ip/udp headers, we can determine where the correct destination is. -// If the correct destination is vita, we send an error indication on the zpu and out ports, -// which will cause the axi_packet_gate to drop those packets, and send the vita frame to -// the vita port. -// -// If at the end of the headers we determine the packet should go to zpu, then we send an -// error indication on the out port, the rest of the packet to zpu and nothing on vita. -// If it should go to out, we send the error indication to zpu, the rest of the packet to out, -// and nothing on vita. -// -// Downstream we should have adequate fifo space, otherwise we could get backed up here. -// -// No tuser bits sent to vita, as vita assumes there are no errors and that occupancy is -// indicated by the length field of the vita header. - -// -// Rules for forwarding: -// -// Ethernet Broadcast (Dst MAC = ff:ff:ff:ff:ff:ff). Forward to both ZPU and XO MAC. -// ? Ethernet Multicast (Dst MAC = USRP_NEXT_HOP). Forward only to ZPU. -// ? Ethernet Multicast (Dst MAC = Unknown). Forward only to XO. -// Ethernet Unicast (Dst MAC = Unknown). Forward only to XO. -// Ethernet Unicast (Dst MAC = local). Look deeper...... -// IP Broadcast. Forward to both ZPU and XO MAC. (Should be coverd by Eth broadcast) -// IP Multicast. ? Unknow Action. -// IP Unicast (Dst IP = local). Look deeper.... -// UDP (Port = Listed) and its a VRLP packet. Forward only to VITA Radio Core. -// UDP (Port = Unknown). Forward only to ZPU. -// -// - -module eth_dispatch - #(parameter BASE=0) - ( - // Clocking and reset interface - input clk, - input reset, - input clear, - // Setting register interface - input set_stb, - input [15:0] set_addr, - input [31:0] set_data, - // Input 68bit AXI-Stream interface (from MAC) - input [63:0] in_tdata, - input [3:0] in_tuser, - input in_tlast, - input in_tvalid, - output in_tready, - // Output AXI-STream interface to VITA Radio Core - output [63:0] vita_tdata, - output [3:0] vita_tuser, - output vita_tlast, - output vita_tvalid, - input vita_tready, - // Output AXI-Stream interface to ZPU - output [63:0] zpu_tdata, - output [3:0] zpu_tuser, - output zpu_tlast, - output zpu_tvalid, - input zpu_tready, - // Output AXI-Stream interface to cross-over MAC - output [63:0] xo_tdata, - output [3:0] xo_tuser, - output xo_tlast, - output xo_tvalid, - input xo_tready, - // Debug - output [2:0] debug_flags, - output [31:0] debug - ); - - //--------------------------------------------------------- - // State machine declarations - //--------------------------------------------------------- - reg [2:0] state; - - localparam WAIT_PACKET = 0; - localparam READ_HEADER = 1; - localparam FORWARD_ZPU = 2; - localparam FORWARD_ZPU_AND_XO = 3; - localparam FORWARD_XO = 4; - localparam FORWARD_RADIO_CORE = 5; - localparam DROP_PACKET = 6; - localparam CLASSIFY_PACKET = 7; - - // Small RAM stores packet header during parsing. - // IJB consider changing HEADER_RAM_SIZE to 7 - localparam HEADER_RAM_SIZE = 9; - (*ram_style="distributed"*) reg [68:0] header_ram [HEADER_RAM_SIZE-1:0]; - - reg [3:0] header_ram_addr; - wire header_done = (header_ram_addr == HEADER_RAM_SIZE-1); - reg fwd_input; - - reg [63:0] in_tdata_reg; - - wire out_tvalid; - wire out_tready; - wire out_tlast; - wire [3:0] out_tuser; - wire [63:0] out_tdata; - - // Output AXI-Stream interface to VITA Radio Core - wire [63:0] vita_pre_tdata; - wire [3:0] vita_pre_tuser; - wire vita_pre_tlast; - wire vita_pre_tvalid; - wire vita_pre_tready; - // Output AXI-Stream interface to ZPU - wire [63:0] zpu_pre_tdata; - wire [3:0] zpu_pre_tuser; - wire zpu_pre_tlast; - wire zpu_pre_tvalid; - wire zpu_pre_tready; - // Output AXI-Stream interface to cross-over MAC - wire [63:0] xo_pre_tdata; - wire [3:0] xo_pre_tuser; - wire xo_pre_tlast; - wire xo_pre_tvalid; - wire xo_pre_tready; - - // Packet Parse Flags - reg is_eth_dst_addr; - reg is_eth_broadcast; - reg is_eth_type_ipv4; - reg is_ipv4_dst_addr; - reg is_ipv4_proto_udp; - reg is_ipv4_proto_icmp; - reg [1:0] is_udp_dst_ports; - reg is_icmp_no_fwd; - reg is_chdr; - - //--------------------------------------------------------- - // Settings regs - //--------------------------------------------------------- - - // MAC address for the dispatcher module. - // This value is used to determine if the packet is meant - // for this device should be consumed - wire [47:0] my_mac; - setting_reg #(.my_addr(BASE), .awidth(16), .width(32)) sr_my_mac_lsb - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(my_mac[31:0]),.changed()); - setting_reg #(.my_addr(BASE+1), .awidth(16), .width(16)) sr_my_mac_msb - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(my_mac[47:32]),.changed()); - - // IP address for the dispatcher module. - // This value is used to determine if the packet is addressed - // to this device - wire [31:0] my_ip; - setting_reg #(.my_addr(BASE+2), .awidth(16), .width(32)) sr_my_ip - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out(my_ip[31:0]),.changed()); - - // This module supports two destination ports - wire [15:0] my_port0, my_port1; - setting_reg #(.my_addr(BASE+3), .awidth(16), .width(32)) sr_udp_port - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out({my_port1[15:0],my_port0[15:0]}),.changed()); - - // forward_ndest: Forward to crossover path if MAC Addr in packet - // does not match "my_mac" - // forward_bcast: Forward broadcasts to crossover path - wire forward_ndest, forward_bcast; - setting_reg #(.my_addr(BASE+4), .awidth(16), .width(2)) sr_forward_ctrl - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out({forward_ndest, forward_bcast}),.changed()); - - //ICMP Type and Code to forward packet to ZPU - wire [7:0] my_icmp_type, my_icmp_code; - setting_reg #(.my_addr(BASE+5), .awidth(16), .width(16)) sr_icmp_ctrl - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr), - .in(set_data),.out({my_icmp_type, my_icmp_code}),.changed()); - - //--------------------------------------------------------- - // Packet Forwarding State machine. - //--------------------------------------------------------- - // Read input packet and store the header into a RAM for - // classification. A header is defined as HEADER_RAM_SIZE - // number of 64-bit words. - // Based on clasification results, output the packet to the - // VITA port, crossover(XO) port or the ZPU. Note that the - // XO and ZPU ports require fully framed Eth packets so data - // from the RAM has to be replayed on the output. The state - // machine will hold off input packets until the header is - // replayed. The state machine also supports dropping pkts. - - always @(posedge clk) - if (reset || clear) begin - state <= WAIT_PACKET; - header_ram_addr <= 0; - fwd_input <= 0; - end else begin - // Defaults. - case(state) - // - // Wait for start of a packet - // IJB: Add protection for a premature EOF here - // - WAIT_PACKET: begin - if (in_tvalid && in_tready) begin - header_ram[header_ram_addr] <= {in_tlast,in_tuser,in_tdata}; - header_ram_addr <= header_ram_addr + 1; - state <= READ_HEADER; - end - fwd_input <= 0; - end - // - // Continue to read full packet header into RAM. - // - READ_HEADER: begin - if (in_tvalid && in_tready) begin - header_ram[header_ram_addr] <= {in_tlast,in_tuser,in_tdata}; - // Have we reached end of fields we parse in header or got a short packet? - if (header_done || in_tlast) begin - // Make decision about where this packet is forwarded to. - state <= CLASSIFY_PACKET; - end // if (header_done || in_tlast) - else begin - header_ram_addr <= header_ram_addr + 1; - state <= READ_HEADER; - end // else: !if(header_done || in_tlast) - end // if (in_tvalid && in_tready) - end // case: READ_HEADER - - // - // Classify Packet - // - CLASSIFY_PACKET: begin - // Make decision about where this packet is forwarded to. - if (is_eth_type_ipv4 && is_ipv4_proto_icmp && is_icmp_no_fwd) begin - header_ram_addr <= 0; - state <= FORWARD_ZPU; - end else if (is_eth_broadcast) begin - header_ram_addr <= 0; - state <= forward_bcast? FORWARD_ZPU_AND_XO : FORWARD_ZPU; - end else if (!is_eth_dst_addr && forward_ndest) begin - header_ram_addr <= 0; - state <= FORWARD_XO; - end else if (!is_eth_dst_addr && !forward_ndest) begin - header_ram_addr <= HEADER_RAM_SIZE - 1; - state <= DROP_PACKET; - end else if ((is_udp_dst_ports != 0) && is_chdr) begin - header_ram_addr <= 6; // Jump to CHDR - state <= FORWARD_RADIO_CORE; - end else begin - header_ram_addr <= 0; - state <= FORWARD_ZPU; - end - end // case: CLASSIFY_PACKET - - // - // Forward this packet only to local ZPU - // - FORWARD_ZPU: begin - if (out_tvalid && out_tready) begin - if (out_tlast) begin - state <= WAIT_PACKET; - end - if (header_done) fwd_input <= 1; - header_ram_addr <= out_tlast? 4'b0 : header_ram_addr + 1; - end - end - // - // Forward this packet to both local ZPU and XO - // - FORWARD_ZPU_AND_XO: begin - if (out_tvalid && out_tready) begin - if (out_tlast) begin - state <= WAIT_PACKET; - end - if (header_done) fwd_input <= 1; - header_ram_addr <= out_tlast? 4'b0 : header_ram_addr + 1; - end - end - // - // Forward this packet to XO only - // - FORWARD_XO: begin - if (out_tvalid && out_tready) begin - if (out_tlast) begin - state <= WAIT_PACKET; - end - if (header_done) fwd_input <= 1; - header_ram_addr <= out_tlast? 4'b0 : header_ram_addr + 1; - end - end - // - // Forward this packet to the Radio Core only - // - FORWARD_RADIO_CORE: begin - if (out_tvalid && out_tready) begin - if (out_tlast) begin - state <= WAIT_PACKET; - end - if (header_done) fwd_input <= 1; - header_ram_addr <= out_tlast? 4'b0 : header_ram_addr + 1; - end - end - // - // Drop this packet on the ground - // - DROP_PACKET: begin - if (out_tvalid && out_tready) begin - if (out_tlast) begin - state <= WAIT_PACKET; - end - if (header_done) fwd_input <= 1; - header_ram_addr <= out_tlast? 4'b0 : header_ram_addr + 1; - end - end - endcase // case (state) - end // else: !if(reset || clear) - - //--------------------------------------------------------- - // Classifier State machine. - // Deep packet inspection during header ingress. - //--------------------------------------------------------- - // As the packet header is pushed into the RAM, set classification - // bits so that by the time the input state machine reaches the - // CLASSIFY_PACKET state, the packet has been fully identified. - - always @(posedge clk) - if (reset || clear) begin - is_eth_dst_addr <= 1'b0; - is_eth_broadcast <= 1'b0; - is_eth_type_ipv4 <= 1'b0; - is_ipv4_dst_addr <= 1'b0; - is_ipv4_proto_udp <= 1'b0; - is_ipv4_proto_icmp <= 1'b0; - is_udp_dst_ports <= 0; - is_icmp_no_fwd <= 0; - is_chdr <= 1'b0; - end else if (in_tvalid && in_tready) begin // if (reset || clear) - in_tdata_reg <= in_tdata; - - case (header_ram_addr) - // Pipelined, so nothing to look at first cycle. - // Reset all the flags here. - 0: begin - is_eth_dst_addr <= 1'b0; - is_eth_broadcast <= 1'b0; - is_eth_type_ipv4 <= 1'b0; - is_ipv4_dst_addr <= 1'b0; - is_ipv4_proto_udp <= 1'b0; - is_ipv4_proto_icmp <= 1'b0; - is_udp_dst_ports <= 0; - is_icmp_no_fwd <= 0; - is_chdr <= 1'b0; - end - 1: begin - // Look at upper 16bits of MAC Dst Addr. - if (in_tdata_reg[15:0] == 16'hFFFF) - is_eth_broadcast <= 1'b1; - if (in_tdata_reg[15:0] == my_mac[47:32]) - is_eth_dst_addr <= 1'b1; - end - 2: begin - // Look at lower 32bits of MAC Dst Addr. - if (is_eth_broadcast && (in_tdata_reg[63:32] == 32'hFFFFFFFF)) - is_eth_broadcast <= 1'b1; - else - is_eth_broadcast <= 1'b0; - if (is_eth_dst_addr && (in_tdata_reg[63:32] == my_mac[31:0])) - is_eth_dst_addr <= 1'b1; - else - is_eth_dst_addr <= 1'b0; - end // case: 2 - 3: begin - // Look at Ethertype - if (in_tdata_reg[47:32] == 16'h0800) - is_eth_type_ipv4 <= 1'b1; - // Extract Packet Length - // ADD THIS HERE. - end - 4: begin - // Look at protocol enapsulated by IPv4 - if ((in_tdata_reg[23:16] == 8'h11) && is_eth_type_ipv4) - is_ipv4_proto_udp <= 1'b1; - if ((in_tdata_reg[23:16] == 8'h01) && is_eth_type_ipv4) - is_ipv4_proto_icmp <= 1'b1; - end - 5: begin - // Look at IP DST Address. - if ((in_tdata_reg[31:0] == my_ip[31:0]) && is_eth_type_ipv4) - is_ipv4_dst_addr <= 1'b1; - end - 6: begin - // Look at UDP dest port - if ((in_tdata_reg[47:32] == my_port0[15:0]) && is_ipv4_proto_udp) - is_udp_dst_ports[0] <= 1'b1; - if ((in_tdata_reg[47:32] == my_port1[15:0]) && is_ipv4_proto_udp) - is_udp_dst_ports[1] <= 1'b1; - // Look at ICMP type and code - if (in_tdata_reg[63:48] == {my_icmp_type, my_icmp_code} && is_ipv4_proto_icmp) - is_icmp_no_fwd <= 1'b1; - end - 7: begin - // Look for a possible CHDR header string - // IJB. NOTE this is not a good test for a CHDR packet, we perhaps don;t need this state anyhow. - if (in_tdata_reg[63:32] != 32'h0) - is_chdr <= 1'b1; - end - 8: begin - // Check VRT Stream ID - // ADD THIS HERE. - // IJB. Perhaps delete this state. - end - endcase // case (header_ram_addr) - end // if (in_tvalid && in_tready) - - - //--------------------------------------------------------- - // Output (Egress) Interface muxing - //--------------------------------------------------------- - assign out_tready = - (state == DROP_PACKET) || - ((state == FORWARD_RADIO_CORE) && vita_pre_tready) || - ((state == FORWARD_XO) && xo_pre_tready) || - ((state == FORWARD_ZPU) && zpu_pre_tready) || - ((state == FORWARD_ZPU_AND_XO) && zpu_pre_tready && xo_pre_tready); - - assign out_tvalid = ((state == FORWARD_RADIO_CORE) || - (state == FORWARD_XO) || - (state == FORWARD_ZPU) || - (state == FORWARD_ZPU_AND_XO) || - (state == DROP_PACKET)) && (!fwd_input || in_tvalid); - - assign {out_tlast,out_tuser,out_tdata} = fwd_input ? {in_tlast,in_tuser,in_tdata} : header_ram[header_ram_addr]; - - assign in_tready = (state == WAIT_PACKET) || - (state == READ_HEADER) || - (out_tready && fwd_input); - - // - // Because we can forward to both the ZPU and XO FIFO's concurrently - // we have to make sure both can accept data in the same cycle. - // This makes it possible for either destination to block the other. - // Make sure (both) destination(s) can accept data before passing it. - // - assign xo_pre_tvalid = out_tvalid && - ((state == FORWARD_XO) || - ((state == FORWARD_ZPU_AND_XO) && zpu_pre_tready)); - assign zpu_pre_tvalid = out_tvalid && - ((state == FORWARD_ZPU) || - ((state == FORWARD_ZPU_AND_XO) && xo_pre_tready)); - assign vita_pre_tvalid = out_tvalid && - (state == FORWARD_RADIO_CORE); - - assign {zpu_pre_tlast, zpu_pre_tuser, zpu_pre_tdata} = {out_tlast, out_tuser, out_tdata}; - assign {xo_pre_tlast, xo_pre_tuser, xo_pre_tdata} = {out_tlast, out_tuser, out_tdata}; - assign {vita_pre_tlast, vita_pre_tuser, vita_pre_tdata} = {out_tlast, out_tuser, out_tdata}; - - //--------------------------------------------------------- - // Egress FIFO's - //--------------------------------------------------------- - // These FIFO's have to be fairly large to prevent any egress - // port from backpressuring the input state machine. - // The ZPU and XO ports are inherently slow consumers so they - // get a large buffer. The VITA port is fast but high throughput - // so even that needs a large FIFO. - - axi_fifo #(.WIDTH(69),.SIZE(10)) - axi_fifo_zpu ( - .clk(clk), - .reset(reset), - .clear(clear), - .i_tdata({zpu_pre_tlast,zpu_pre_tuser,zpu_pre_tdata}), - .i_tvalid(zpu_pre_tvalid), - .i_tready(zpu_pre_tready), - .o_tdata({zpu_tlast,zpu_tuser,zpu_tdata}), - .o_tvalid(zpu_tvalid), - .o_tready(zpu_tready), - .space(), - .occupied() - ); - - axi_fifo #(.WIDTH(69),.SIZE(10)) - axi_fifo_xo ( - .clk(clk), - .reset(reset), - .clear(clear), - .i_tdata({xo_pre_tlast,xo_pre_tuser,xo_pre_tdata}), - .i_tvalid(xo_pre_tvalid), - .i_tready(xo_pre_tready), - .o_tdata({xo_tlast,xo_tuser,xo_tdata}), - .o_tvalid(xo_tvalid), - .o_tready(xo_tready), - .space(), - .occupied() - ); - - axi_fifo #(.WIDTH(69),.SIZE(10)) - axi_fifo_vita ( - .clk(clk), - .reset(reset), - .clear(clear), - .i_tdata({vita_pre_tlast,vita_pre_tuser,vita_pre_tdata}), - .i_tvalid(vita_pre_tvalid), - .i_tready(vita_pre_tready), - .o_tdata({vita_tlast,vita_tuser,vita_tdata}), - .o_tvalid(vita_tvalid), - .o_tready(vita_tready), - .space(), - .occupied() - ); - -endmodule // eth_dispatch diff --git a/fpga/usrp3/lib/packet_proc/eth_dispatch_tb.v b/fpga/usrp3/lib/packet_proc/eth_dispatch_tb.v deleted file mode 100644 index ecc7d1025..000000000 --- a/fpga/usrp3/lib/packet_proc/eth_dispatch_tb.v +++ /dev/null @@ -1,311 +0,0 @@ -// -// Copyright 2012 Ettus Research LLC -// - -`timescale 1 ps / 1 ps - -module eth_dispatch_tb(); - - - // Clocking and reset interface - reg clk; - reg reset; - reg clear; - // Setting register interface - reg set_stb; - reg [15:0] set_addr; - reg [31:0] set_data; - // Input 68bit AXI-Stream interface (from MAC) - wire [63:0] in_tdata; - wire [3:0] in_tuser; - wire in_tlast; - wire in_tvalid; - wire in_tready; - // Output AXI-Stream interface to VITA Radio Core - wire [63:0] vita_tdata; - wire [3:0] vita_tuser; - wire vita_tlast; - wire vita_tvalid; - wire vita_tready; - // Output AXI-Stream interface to ZPU - wire [63:0] zpu_tdata; - wire [3:0] zpu_tuser; - wire zpu_tlast; - wire zpu_tvalid; - wire zpu_tready; - // Output AXI-Stream interface to cross-over MAC - wire [63:0] xo_tdata; - wire [3:0] xo_tuser; - wire xo_tlast; - wire xo_tvalid; - wire xo_tready; - - reg [63:0] data_in; - reg [3:0] user_in; - reg valid_in; - wire ready_in; - reg last_in; - - eth_dispatch - #(.BASE(0)) - eth_dispatch_i - ( - // Clocking and reset interface - .clk(clk), - .reset(reset), - .clear(clear), - // Setting register interface - .set_stb(set_stb), - .set_addr(set_addr), - .set_data(set_data), - // Input 68bit AXI-Stream interface (from MAC) - .in_tdata(in_tdata), - .in_tuser(in_tuser), - .in_tlast(in_tlast), - .in_tvalid(in_tvalid), - .in_tready(in_tready), - // Output AXI-STream interface to VITA Radio Core - .vita_tdata(vita_tdata), - .vita_tuser(vita_tuser), - .vita_tlast(vita_tlast), - .vita_tvalid(vita_tvalid), - .vita_tready(vita_tready), - // Output AXI-Stream interface to ZPU - .zpu_tdata(zpu_tdata), - .zpu_tuser(zpu_tuser), - .zpu_tlast(zpu_tlast), - .zpu_tvalid(zpu_tvalid), - .zpu_tready(zpu_tready), - // Output AXI-Stream interface to cross-over MAC - .xo_tdata(xo_tdata), - .xo_tuser(xo_tuser), - .xo_tlast(xo_tlast), - .xo_tvalid(xo_tvalid), - .xo_tready(xo_tready) - ); - - // - // Define Clocks - // - initial begin - clk = 1'b1; - end - - // 125MHz clock - always #4000 clk = ~clk; - - // - // Good starting state - // - initial begin - reset <= 0; - clear <= 0; - set_stb <= 0; - set_addr <= 0; - set_data <= 0; - data_in <= 0; - user_in <= 0; - valid_in <= 0; - last_in <= 0; - - end - - - - // - // Task Libaray - // - task write_setting_bus; - input [15:0] address; - input [31:0] data; - - begin - - @(negedge clk); - set_stb = 1'b0; - set_addr = 16'h0; - set_data = 32'h0; - @(negedge clk); - set_stb = 1'b1; - set_addr = address; - set_data = data; - @(negedge clk); - set_stb = 1'b0; - set_addr = 16'h0; - set_data = 32'h0; - - end - endtask // write_setting_bus - - - task enqueue_line; - input last; - input [2:0] keep; - input [63:0] data; - begin - data_in <= {keep, data}; - last_in <= last; - valid_in <= 1; - while (~ready_in) begin - @(negedge clk); - end - @(negedge clk); - data_in <= 0; - last_in <= 0; - valid_in <= 0; - end - endtask // enqueue_line - - task enqueue_arp_req; - input [47:0] src_mac; - input [31:0] src_ip; - input [47:0] dst_mac; - input [31:0] dst_ip; - - begin - @(negedge clk); - // Line 0 - enqueue_line( 0, 3'b0, {48'h0,16'hffff}); - // Line 1 - Eth - enqueue_line( 0, 3'b0, {32'hffffffff,src_mac[47:16]}); - // Line 2 - Eth+ARP (HTYPE = 1, PTYPE = 0x0800) - enqueue_line( 0, 3'b0, {src_mac[15:0],16'h0806,16'h0001,16'h0800}); - // Line 3 - HLEN=6, PLEN=4 OPER=1 - enqueue_line( 0, 3'b0, {8'h06,8'h04,16'h0001,src_mac[47:16]}); - // Line 4 - ARP - enqueue_line( 0, 3'b0, {src_mac[15:0],src_ip[31:0],dst_mac[47:32]}); - // Line 5 - ARP - enqueue_line( 1, 3'b0, {dst_mac[31:0],dst_ip[31:0]}); - end - endtask // enqueue_arp_req - - - - reg [11:0] frame_count =12'h0; - - task enqueue_vita_pkt; - // We assume that we always have SID and TSF fields. - input [47:0] mac; - input [31:0] ip; - input [15:0] udp; - input [15:0] vita_size; - input [63:0] vita_tsf; - input [31:0] vita_sid; - - - integer i; - reg [15:0] j; - reg [19:0] vrl_size; - reg [15:0] udp_size; - reg [15:0] ip_size; - - - begin - vrl_size = vita_size + 3; - udp_size = vrl_size*4 + 8; - ip_size = udp_size + 20; - @(negedge clk); - // Line 0 - enqueue_line( 0, 3'b0, {48'h0,mac[47:32]}); - // Line 1 - Eth - enqueue_line( 0, 3'b0, {mac[31:0],32'h11223344}); - // Line 2 - Eth+IP - enqueue_line( 0, 3'b0, {16'h5566,16'h0800,16'h0000,ip_size}); - // Line 3 - IP - enqueue_line( 0, 3'b0, 'h11<<16); - // Line 4 - IP - enqueue_line( 0, 3'b0, {32'h09080706, ip}); - // Line 5 - UDP - enqueue_line( 0, 3'b0, {16'h1234, udp, udp_size, 16'h0}); - // Line 6 - VRL - enqueue_line( 0, 3'b0, {"VRLP",frame_count,vrl_size}); - // Line 7 - VRT - enqueue_line( 0, 3'b0, {16'b0001000000010000, vita_size,vita_sid}); //vita hdr + SID - enqueue_line( 0, 3'b0, vita_tsf); - j = 0; - - for (i = 6; i < vita_size; i = i + 2) begin - enqueue_line( 0 , 3'b0, {j,j+16'h1,j+16'h2,j+16'h3}); - j = j + 4; - end - - if (i-vita_size==0) // 2x32words to finish VITA packet. - enqueue_line( 1, 3'b0, {j,j+16'h1,j+16'h2,j+16'h3}); - else // 1x32bit word to finish VITA packet - enqueue_line( 1, 3'h4, {j,j+16'h1,j+16'h2,j+16'h3}); - end - - endtask // enqueue_packet - - - // - // Simulation specific testbench is included here - // -`include "simulation_script.v" - - - // - // Input FIFO - // - axi_fifo_short - #(.WIDTH(69)) axi_fifo_short_in - ( - .clk(clk), - .reset(reset), - .clear(clear), - .o_tdata({in_tlast,in_tuser,in_tdata}), - .o_tvalid(in_tvalid), - .o_tready(in_tready), - .i_tdata({last_in,user_in,data_in}), - .i_tvalid(valid_in), - .i_tready(ready_in), - .space(), - .occupied() - ); - - // - // Output Sinks - // - axi_probe_tb - #(.FILENAME("zpu.txt"),.VITA_PORT0(60000),.VITA_PORT1(60001)) axi_probe_tb_zpu - ( - .clk(clk), - .reset(reset), - .clear(clear), - .tdata(zpu_tdata), - .tvalid(zpu_tvalid), - .tready(zpu_tready), - .tlast(zpu_tlast) - ); - - assign zpu_tready = 1'b1; - - axi_probe_tb - #(.FILENAME("xo.txt"),.VITA_PORT0(60000),.VITA_PORT1(60001)) axi_probe_tb_xo - ( - .clk(clk), - .reset(reset), - .clear(clear), - .tdata(xo_tdata), - .tvalid(xo_tvalid), - .tready(xo_tready), - .tlast(xo_tlast) - ); - - assign xo_tready = 1'b1; - - axi_probe_tb - #(.FILENAME("vita.txt"),.VITA_PORT0(60000),.VITA_PORT1(60001),.START_AT_VRL(1)) axi_probe_tb_vita - ( - .clk(clk), - .reset(reset), - .clear(clear), - .tdata(vita_tdata), - .tvalid(vita_tvalid), - .tready(vita_tready), - .tlast(vita_tlast) - ); - - assign vita_tready = 1'b1; - -endmodule // eth_dispatch_tb diff --git a/fpga/usrp3/lib/packet_proc/eth_interface.v b/fpga/usrp3/lib/packet_proc/eth_interface.v deleted file mode 100644 index 1885a4825..000000000 --- a/fpga/usrp3/lib/packet_proc/eth_interface.v +++ /dev/null @@ -1,140 +0,0 @@ - -// Adapts from internal VITA to ethernet packets. Also handles ZPU and ethernet crossover interfaces. - -module eth_interface - #(parameter BASE=0, - parameter XO_FIFOSIZE=10, - parameter ZPU_FIFOSIZE=10, - parameter VITA_FIFOSIZE=10, - parameter ETHOUT_FIFOSIZE=10) - (input clk, input reset, input clear, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - // Eth ports - output [63:0] eth_tx_tdata, output [3:0] eth_tx_tuser, output eth_tx_tlast, output eth_tx_tvalid, input eth_tx_tready, - input [63:0] eth_rx_tdata, input [3:0] eth_rx_tuser, input eth_rx_tlast, input eth_rx_tvalid, output eth_rx_tready, - // Vita router interface - output [63:0] e2v_tdata, output e2v_tlast, output e2v_tvalid, input e2v_tready, - input [63:0] v2e_tdata, input v2e_tlast, input v2e_tvalid, output v2e_tready, - // Ethernet crossover - output [63:0] xo_tdata, output [3:0] xo_tuser, output xo_tlast, output xo_tvalid, input xo_tready, - input [63:0] xi_tdata, input [3:0] xi_tuser, input xi_tlast, input xi_tvalid, output xi_tready, - // ZPU - output [63:0] e2z_tdata, output [3:0] e2z_tuser, output e2z_tlast, output e2z_tvalid, input e2z_tready, - input [63:0] z2e_tdata, input [3:0] z2e_tuser, input z2e_tlast, input z2e_tvalid, output z2e_tready, - // Debug - output [31:0] debug_flags, - output [31:0] debug - ); - - wire [63:0] v2ef_tdata; - wire [3:0] v2ef_tuser; - wire v2ef_tlast, v2ef_tvalid, v2ef_tready; - - // ////////////////////////////////////////////////////////////// - // Incoming Ethernet path - // Includes FIFO on the output going to ZPU - - wire [63:0] epg_tdata_int; - wire [3:0] epg_tuser_int; - wire epg_tlast_int, epg_tvalid_int, epg_tready_int; - - // - // Packet gate ensures on entire ingressing packet is buffered before feeding it downstream so that it bursts - // efficiently internally without holding resources allocted for longer than optimal. This also means that an upstream - // error discovered in the packet can allow the packet to be destroyed here, before it gets deeper into the USRP. - // - // This gate must be able to hold at least 9900 bytes which is the maximum length between the SOF and EOF - // as asserted by the 1G and 10G MACs. This is required in case one of the max size packets has an error - // and needs to be dropped. With SIZE=11, this gate will hold 2 8k packets. - axi_packet_gate #(.WIDTH(68), .SIZE(11)) packet_gater - (.clk(clk), .reset(reset), .clear(clear), - - .i_tdata({eth_rx_tuser, eth_rx_tdata}), .i_tlast(eth_rx_tlast), - .i_terror(eth_rx_tuser[3]), //top bit of user bus is error - .i_tvalid(eth_rx_tvalid), .i_tready(eth_rx_tready), - - .o_tdata({epg_tuser_int, epg_tdata_int}), .o_tlast(epg_tlast_int), - .o_tvalid(epg_tvalid_int), .o_tready(epg_tready_int)); - - // - // Based on programmed rules, parse network headers and decide which internal destination(s) this packet will be forwarded to. - // - wire [63:0] e2v_tdata_int; - wire e2v_tlast_int, e2v_tvalid_int, e2v_tready_int; - - wire [63:0] e2z_tdata_int; - wire [3:0] e2z_tuser_int; - wire e2z_tlast_int, e2z_tvalid_int, e2z_tready_int; - wire [2:0] dispatch_debug_flags; - - eth_dispatch #(.BASE(BASE+8)) eth_dispatch - (.clk(clk), .reset(reset), .clear(clear), - .set_stb(set_stb), .set_addr(set_addr) , .set_data(set_data), - .in_tdata(epg_tdata_int), .in_tuser(epg_tuser_int), .in_tlast(epg_tlast_int), .in_tvalid(epg_tvalid_int), .in_tready(epg_tready_int), - .vita_tdata(e2v_tdata_int), .vita_tlast(e2v_tlast_int), .vita_tvalid(e2v_tvalid_int), .vita_tready(e2v_tready_int), - .zpu_tdata(e2z_tdata_int), .zpu_tuser(e2z_tuser_int), .zpu_tlast(e2z_tlast_int), .zpu_tvalid(e2z_tvalid_int), .zpu_tready(e2z_tready_int), - .xo_tdata(xo_tdata), .xo_tuser(xo_tuser), .xo_tlast(xo_tlast), .xo_tvalid(xo_tvalid), .xo_tready(xo_tready), // to other eth port - .debug_flags(dispatch_debug_flags),.debug(debug)); - - axi_fifo_short #(.WIDTH(65)) e2v_pipeline_srl - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({e2v_tlast_int,e2v_tdata_int}), .i_tvalid(e2v_tvalid_int), .i_tready(e2v_tready_int), - .o_tdata({e2v_tlast,e2v_tdata}), .o_tvalid(e2v_tvalid), .o_tready(e2v_tready), - .space(), .occupied() - ); - - // - // ZPU can be slow to respond (relative to packet wirespeed) so extra buffer for packets destined there so it doesn't back up. - // - axi_fifo #(.WIDTH(69),.SIZE(ZPU_FIFOSIZE)) zpu_fifo - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({e2z_tlast_int,e2z_tuser_int,e2z_tdata_int}), .i_tvalid(e2z_tvalid_int), .i_tready(e2z_tready_int), - .o_tdata({e2z_tlast,e2z_tuser,e2z_tdata}), .o_tvalid(e2z_tvalid), .o_tready(e2z_tready)); - - // ////////////////////////////////////////////////////////////// - // Outgoing Ethernet path - // Includes FIFOs on path from VITA router, from ethernet crossover, and on the overall output - - wire [63:0] eth_tx_tdata_int; - wire [3:0] eth_tx_tuser_int; - wire eth_tx_tlast_int, eth_tx_tvalid_int, eth_tx_tready_int; - - wire [63:0] xi_tdata_int; - wire [3:0] xi_tuser_int; - wire xi_tlast_int, xi_tvalid_int, xi_tready_int; - - wire [63:0] v2e_tdata_int; - wire v2e_tlast_int, v2e_tvalid_int, v2e_tready_int; - - axi_fifo #(.WIDTH(65),.SIZE(VITA_FIFOSIZE)) vitaout_fifo - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({v2e_tlast,v2e_tdata}), .i_tvalid(v2e_tvalid), .i_tready(v2e_tready), - .o_tdata({v2e_tlast_int,v2e_tdata_int}), .o_tvalid(v2e_tvalid_int), .o_tready(v2e_tready_int)); - - chdr_eth_framer #(.BASE(BASE)) my_eth_framer - (.clk(clk), .reset(reset), .clear(clear), - .set_stb(set_stb), .set_addr(set_addr) , .set_data(set_data), - .in_tdata(v2e_tdata_int), .in_tlast(v2e_tlast_int), .in_tvalid(v2e_tvalid_int), .in_tready(v2e_tready_int), - .out_tdata(v2ef_tdata), .out_tuser(v2ef_tuser), .out_tlast(v2ef_tlast), .out_tvalid(v2ef_tvalid), .out_tready(v2ef_tready), - .debug()); - - axi_fifo #(.WIDTH(69),.SIZE(XO_FIFOSIZE)) xo_fifo - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({xi_tlast,xi_tuser,xi_tdata}), .i_tvalid(xi_tvalid), .i_tready(xi_tready), - .o_tdata({xi_tlast_int,xi_tuser_int,xi_tdata_int}), .o_tvalid(xi_tvalid_int), .o_tready(xi_tready_int)); - - axi_mux4 #(.PRIO(0), .WIDTH(68)) eth_mux - (.clk(clk), .reset(reset), .clear(clear), - .i0_tdata({z2e_tuser,z2e_tdata}), .i0_tlast(z2e_tlast), .i0_tvalid(z2e_tvalid), .i0_tready(z2e_tready), - .i1_tdata({v2ef_tuser,v2ef_tdata}), .i1_tlast(v2ef_tlast), .i1_tvalid(v2ef_tvalid), .i1_tready(v2ef_tready), - .i2_tdata({xi_tuser_int,xi_tdata_int}), .i2_tlast(xi_tlast_int), .i2_tvalid(xi_tvalid_int), .i2_tready(xi_tready_int), - .i3_tdata(), .i3_tlast(), .i3_tvalid(1'b0), .i3_tready(), - .o_tdata({eth_tx_tuser_int,eth_tx_tdata_int}), .o_tlast(eth_tx_tlast_int), .o_tvalid(eth_tx_tvalid_int), .o_tready(eth_tx_tready_int)); - - axi_fifo #(.WIDTH(69),.SIZE(ETHOUT_FIFOSIZE)) ethout_fifo - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({eth_tx_tlast_int,eth_tx_tuser_int,eth_tx_tdata_int}), .i_tvalid(eth_tx_tvalid_int), .i_tready(eth_tx_tready_int), - .o_tdata({eth_tx_tlast,eth_tx_tuser,eth_tx_tdata}), .o_tvalid(eth_tx_tvalid), .o_tready(eth_tx_tready)); - - -endmodule // eth_interface diff --git a/fpga/usrp3/lib/packet_proc/ip_hdr_checksum.v b/fpga/usrp3/lib/packet_proc/ip_hdr_checksum.v deleted file mode 100644 index 869378aba..000000000 --- a/fpga/usrp3/lib/packet_proc/ip_hdr_checksum.v +++ /dev/null @@ -1,24 +0,0 @@ - -// Compute IP header checksum. 2 cycles of latency. -module ip_hdr_checksum - (input clk, input [159:0] in, output reg [15:0] out); - - wire [18:0] padded [0:9]; - reg [18:0] sum_a, sum_b; - - genvar i; - generate - for(i=0 ; i<10 ; i=i+1) - assign padded[i] = {3'b000,in[i*16+15:i*16]}; - endgenerate - - always @(posedge clk) sum_a = padded[0] + padded[1] + padded[2] + padded[3] + padded[4]; - always @(posedge clk) sum_b = padded[5] + padded[6] + padded[7] + padded[8] + padded[9]; - - wire [18:0] sum = sum_a + sum_b; - - always @(posedge clk) - out <= ~(sum[15:0] + {13'd0,sum[18:16]}); - - -endmodule // ip_hdr_checksum diff --git a/fpga/usrp3/lib/packet_proc/ip_hdr_checksum_tb.v b/fpga/usrp3/lib/packet_proc/ip_hdr_checksum_tb.v deleted file mode 100644 index 8d9ccf948..000000000 --- a/fpga/usrp3/lib/packet_proc/ip_hdr_checksum_tb.v +++ /dev/null @@ -1,38 +0,0 @@ - -module ip_hdr_checksum_tb(); - - initial $dumpfile("ip_hdr_checksum_tb.vcd"); - initial $dumpvars(0,ip_hdr_checksum_tb); - - reg clk; - - wire [159:0] in = { - 16'h4500, - 16'h0030, - 16'h4422, - 16'h4000, - 16'h8006, - 16'h0000, - 16'h8c7c, - 16'h19ac, - 16'hae24, - 16'h1e2b - }; - - wire [15:0] out; - ip_hdr_checksum ip_hdr_checksum - (.clk(clk), - .in(in), - .out(out)); - - initial - begin - clk <= 0; - #100 clk <= 1; - #100 clk <= 0; - #100 clk <= 1; - #100 $display("Computed 0x%x, should be 0x442e", out); - #100 $finish; - end - -endmodule // ip_hdr_checksum_tb diff --git a/fpga/usrp3/lib/packet_proc/source_flow_control.v b/fpga/usrp3/lib/packet_proc/source_flow_control.v deleted file mode 100644 index d26b848c9..000000000 --- a/fpga/usrp3/lib/packet_proc/source_flow_control.v +++ /dev/null @@ -1,127 +0,0 @@ - -// source_flow_control.v -// -// This block passes the in_* AXI port to the out_* AXI port only when it has -// enough flow control credits. Data is held when there are not enough credits. -// Credits are replenished with extension context packets which update the -// last_consumed packet register. Max credits are controlled by settings regs. -// The 2nd line of the packet contains the sequence number in the low 12 bits. -// These packets should not have a time value, but if they do it will be ignored. - -module source_flow_control - #(parameter BASE=0) - (input clk, input reset, input clear, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - input [63:0] fc_tdata, input fc_tlast, input fc_tvalid, output fc_tready, - input [63:0] in_tdata, input in_tlast, input in_tvalid, output in_tready, - output [63:0] out_tdata, output out_tlast, output out_tvalid, input out_tready); - - reg [31:0] last_seqnum_consumed; - wire [31:0] window_size; - wire [31:0] go_until_seqnum = last_seqnum_consumed + window_size + 1; - reg [31:0] current_seqnum; - wire window_reset; - wire window_enable; - wire setting_changed; - - setting_reg #(.my_addr(BASE)) sr_window_size - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(window_size),.changed(setting_changed)); - - setting_reg #(.my_addr(BASE+1), .width(1)) sr_window_enable - (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),.in(set_data), - .out(window_enable),.changed(window_reset)); - - reg go; - reg [1:0] sfc_state; - - - localparam SFC_HEAD = 2'd0; - localparam SFC_TIME = 2'd1; - localparam SFC_BODY = 2'd2; - localparam SFC_DUMP = 2'd3; - - always @(posedge clk) - if(reset | clear | window_reset) - begin - last_seqnum_consumed <= 32'hFFFFFFFF; - sfc_state <= SFC_HEAD; - end - else - if(fc_tvalid & fc_tready) - case(sfc_state) - SFC_HEAD : - if(fc_tlast) - sfc_state <= SFC_HEAD; // Error. CHDR packet with only a header is an error. - else if(~fc_tdata[63]) // Is this NOT an extension context packet? - sfc_state <= SFC_DUMP; // Error. Only extension context packets should come in on this interface. - else if(fc_tdata[61]) // Does this packet have time? - sfc_state <= SFC_TIME; - else - sfc_state <= SFC_BODY; - - SFC_TIME : - if(fc_tlast) - sfc_state <= SFC_HEAD; // Error, CHDR packet with only header and time is an error. - else - sfc_state <= SFC_BODY; - - SFC_BODY : - begin - last_seqnum_consumed <= fc_tdata[31:0]; // Sequence number is in lower 32bits. - if(fc_tlast) - sfc_state <= SFC_HEAD; - else - sfc_state <= SFC_DUMP; // Error. Not expecting any more data in a CHDR packet. - end - - SFC_DUMP : // shouldn't ever need to be here, this is an error condition - if(fc_tlast) - sfc_state <= SFC_HEAD; - endcase // case (sfc_state) - - assign fc_tready = 1'b1; // Always consume FC -- FIXME Even if we are getting reset? - assign out_tdata = in_tdata; // CHDR data flows through combinatorially. - assign out_tlast = in_tlast; - assign in_tready = go ? out_tready : 1'b0; - assign out_tvalid = go ? in_tvalid : 1'b0; - - // - // Each time we recieve the end of an IF data packet increment the current_seqnum. - // We bravely assume that no packets go missing...or at least that they will be detected elsewhere - // and then handled appropriately. - // The SEQNUM needs to be initialized every time we start a new stream. In new_rx_framer this is done - // as a side effect of writing a new SID value to the setting reg. - // - // By incrementing current_seqnum on the last signal we get the nice effect that packet flow is - // always suspended between packets rather than within a packet. - // - always @(posedge clk) - if(reset | clear | window_reset) - current_seqnum <= 0; - else if (in_tvalid && in_tready && in_tlast) - current_seqnum <= current_seqnum + 1; - - always @(posedge clk) - if(reset | clear) - go <= 1'b0; - else - if(~window_enable) - go <= 1'b1; - else - case(go) - 1'b0 : - // This test assumes the host is well behaved in sending good numbers for packets consumed - // and that current_seqnum increments always by 1 only. - // This way wraps are dealt with without a large logic penalty. - if (in_tvalid & (go_until_seqnum - current_seqnum != 0)) - // if(in_tvalid & (go_until_seqnum > current_seqnum)) // FIXME will need to handle wrap of 32-bit seqnum - go <= 1'b1; - - 1'b1 : - if(in_tvalid & in_tready & in_tlast) - go <= 1'b0; - endcase // case (go) - - -endmodule // source_flow_control diff --git a/fpga/usrp3/lib/packet_proc/source_flow_control_tb.v b/fpga/usrp3/lib/packet_proc/source_flow_control_tb.v deleted file mode 100644 index f51d17f97..000000000 --- a/fpga/usrp3/lib/packet_proc/source_flow_control_tb.v +++ /dev/null @@ -1,249 +0,0 @@ -`timescale 1ns/1ps - -module source_flow_control_tb(); - - reg clk = 0; - reg reset = 1; - - always #10 clk = ~clk; - - initial $dumpfile("source_flow_control_tb.vcd"); - initial $dumpvars(0,source_flow_control_tb); - - initial - begin - #1000 reset = 0; - #20000; - $finish; - end - - reg [63:0] tdata; - wire [63:0] tdata_int; - reg tlast; - wire tlast_int; - reg tvalid = 1'b0; - wire tvalid_int; - wire tready, tready_int; - - reg [63:0] fc_tdata; - reg fc_tlast, fc_tvalid; - wire fc_tready; - - wire [63:0] out_tdata; - wire out_tlast, out_tready, out_tvalid; - - wire [15:0] occ_in, occ_out; - reg set_stb = 0; - reg [7:0] set_addr; - reg [31:0] set_data; - - - task send_fc_packet; - input [31:0] seqnum; - input [31:0] sid; - input always_go; - - begin - @(posedge clk); - fc_tlast <= 1'b0; - fc_tdata <= { 1'b1, 1'b0, 1'b0, 1'b0, 12'hABC, 16'd4, sid }; - fc_tvalid <= 1; - @(posedge clk); - fc_tlast <= 1'b1; - //fc_tdata <= { 52'h0,seqnum }; - fc_tdata <= { 31'h0,always_go, seqnum }; - @(posedge clk); - fc_tvalid <= 0; - @(posedge clk); - end - endtask // send_packet - - task send_packet; - input ec; - input timed; - input [11:0] seqnum; - input [31:0] sid; - input [63:0] vtime; - input [15:0] addr; - input [31:0] data; - - begin - // Send a packet - @(posedge clk); - tlast <= 1'b0; - tdata <= { ec, 1'b0, timed, 1'b0, seqnum, timed ? 16'd6 : 16'd4, sid }; - tvalid <= 1; - @(posedge clk); - if(timed) - begin - tdata <= vtime; - @(posedge clk); - end - tlast <= 1'b1; - tdata <= { 16'h0, addr, data }; - @(posedge clk); - tlast <= 1'b0; - tvalid <= 0; - @(posedge clk); - end - endtask // send_packet - - initial - begin - tvalid <= 1'b0; - while(reset) - @(posedge clk); - @(posedge clk); - // Set flow control window to be 2 - set_stb <= 1; - set_addr <= 0; - set_data <= 2; - @(posedge clk); - set_stb <= 0; - // ExtContext. Time. Seq=0, SID=DEAD_6789, Time=10 - send_packet(1'b1,1'b1,12'h0,32'hDEAD_6789,64'h10,16'hB,32'hF00D_1234); - send_packet(1'b1,1'b1,12'h1,32'hDEAD_6789,64'h20,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h2,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h3,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h4,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h5,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h6,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h7,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h8,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - #500; - // Consumed 2 packets - send_fc_packet(32'd1,32'h3,1'b0); - #300; - // Consumed 1 packet - send_fc_packet(32'd2,32'h3,1'b0); - #500; - // Consumed 2 packets - send_fc_packet(32'd4,32'h3,1'b0); - #400; - // Send same SEQ ID again to test it causes no changes. - send_fc_packet(32'd4,32'h3,1'b0); - #300; - // Consumed 1 packet - send_fc_packet(32'd5,32'h3,1'b0); - #500; - // Consumed 2 packets - send_fc_packet(32'd7,32'h3,1'b0); - #500; - send_packet(1'b1,1'b1,12'h9,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'hA,32'hDEAD_6789,64'h30,16'hC,32'hABCD_4321); - #300; - // Consumed 1 packet - send_fc_packet(32'd8,32'h3,1'b0); - // - // Now force internal sequence count to close to wrap value to test corner case - // - #100; - source_flow_control.current_seqnum <= 32'hFFFF_FFFC; - #100; - send_fc_packet(32'hFFFF_FFFA,32'h3,1'b0); - #100; - send_packet(1'b1,1'b1,12'hFFC,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - send_packet(1'b1,1'b1,12'hFFD,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'hFFE,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'hFFF,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h000,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h001,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h002,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - // Consumed 2 packets - send_fc_packet(32'hFFFF_FFFC,32'h3,1'b0); - #200; - // Consumed 2 packets - send_fc_packet(32'hFFFF_FFFE,32'h3,1'b0); - send_packet(1'b1,1'b1,12'h003,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h004,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - // Consumed 2 packets - send_fc_packet(32'h0,32'h3,1'b0); - #200; - // Consumed 2 packets - send_fc_packet(32'h2,32'h3,1'b0); - #500; - // - // Again force internal sequence count to close to wrap value to test new corner case - // - #100; - source_flow_control.current_seqnum <= 32'hFFFF_FFFC; - #100; - send_fc_packet(32'hFFFF_FFFA,32'h3,1'b0); - #100; - send_packet(1'b1,1'b1,12'hFFC,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - send_packet(1'b1,1'b1,12'hFFD,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'hFFE,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'hFFF,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h000,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h001,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h002,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - // Consumed 1 packets - send_fc_packet(32'hFFFF_FFFB,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'hFFFF_FFFC,32'h3,1'b0); - send_packet(1'b1,1'b1,12'h003,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - send_packet(1'b1,1'b1,12'h004,32'hDEAD_6789,64'h40,16'hC,32'hABCD_4321); - #200; - // Consumed 1 packets - send_fc_packet(32'hFFFF_FFFD,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'hFFFF_FFFE,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'hFFFF_FFFF,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'h0,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'h1,32'h3,1'b0); - #200; - // Consumed 1 packets - send_fc_packet(32'h2,32'h3,1'b0); - #500; - - - - - end - - axi_fifo #(.WIDTH(65), .SIZE(10)) fifo_in - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata({tlast,tdata}), .i_tvalid(tvalid), .i_tready(tready), - .o_tdata({tlast_int,tdata_int}), .o_tvalid(tvalid_int), .o_tready(tready_int), - .occupied(occ_in)); - - source_flow_control source_flow_control - (.clk(clk), .reset(reset), .clear(1'b0), - .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data), - .fc_tdata(fc_tdata), .fc_tlast(fc_tlast), .fc_tvalid(fc_tvalid), .fc_tready(fc_tready), - .in_tdata(tdata_int), .in_tlast(tlast_int), .in_tvalid(tvalid_int), .in_tready(tready_int), - .out_tdata(out_tdata), .out_tlast(out_tlast), .out_tvalid(out_tvalid), .out_tready(out_tready) - ); - - wire [63:0] dump_tdata; - wire dump_tlast, dump_tvalid, dump_tready; - - axi_fifo #(.WIDTH(65), .SIZE(10)) fifo_out - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata({out_tlast,out_tdata}), .i_tvalid(out_tvalid), .i_tready(out_tready), - .o_tdata({dump_tlast,dump_tdata}), .o_tvalid(dump_tvalid), .o_tready(dump_tready), - .occupied(occ_out)); - - assign dump_tready = 0; - - always @(posedge clk) - if(out_tvalid & out_tready) - begin - $display("%x",out_tdata); - if(out_tlast) - $display("TLAST"); - end -endmodule // source_flow_control_tb diff --git a/fpga/usrp3/lib/packet_proc/vita_eth_framer.v b/fpga/usrp3/lib/packet_proc/vita_eth_framer.v deleted file mode 100644 index a5e02e899..000000000 --- a/fpga/usrp3/lib/packet_proc/vita_eth_framer.v +++ /dev/null @@ -1,137 +0,0 @@ - -// vita_eth_framer -// Takes a vita stream in and adds udp, ip, and ethernet framing -// Uses 8 setting reg addresses. First 4 are simple registers: -// BASE+0 : Upper 16 bits of ethernet src mac -// BASE+1 : Lower 32 bits of ethernet src mac -// BASE+2 : IP src address -// BASE+3 : UDP src port -// -// Next 4 control write ports on a RAM indexed by destination field of stream ID -// BASE+4 : Dest SID for next 3 regs -// BASE+5 : Dest IP -// BASE+6 : Dest UDP port, upper 16 bits of dest mac -// BASE+7 : Lower 32 bits of dest mac - -module vita_eth_framer - #(parameter BASE=0) - (input clk, input reset, input clear, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - input [63:0] in_tdata, input in_tlast, input in_tvalid, output in_tready, - output [63:0] out_tdata, output [3:0] out_tuser, output out_tlast, output out_tvalid, input out_tready, - output [31:0] debug ); - - localparam SR_AWIDTH = 8; - - reg [31:0] sid; - reg [15:0] vita_len; - - reg [2:0] vef_state; - localparam VEF_IDLE = 3'd0; - localparam VEF_PAYLOAD = 3'd7; - - reg [63:0] tdata; - - always @(posedge clk) - if(reset | clear) - begin - vef_state <= VEF_IDLE; - sid <= 32'd0; - vita_len <= 16'd0; - end - else - case(vef_state) - VEF_IDLE : - if(in_tvalid) - begin - vef_state <= 1; - sid <= in_tdata[31:0]; - vita_len <= in_tdata[47:32]; - end - VEF_PAYLOAD : - if(in_tvalid & out_tready) - if(in_tlast) - vef_state <= VEF_IDLE; - default : - if(out_tready) - vef_state <= vef_state + 3'd1; - endcase // case (vef_state) - - assign in_tready = (vef_state == VEF_PAYLOAD) ? out_tready : 1'b0; - assign out_tvalid = (vef_state == VEF_PAYLOAD) ? in_tvalid : (vef_state == VEF_IDLE) ? 1'b0 : 1'b1; - assign out_tlast = (vef_state == VEF_PAYLOAD) ? in_tlast : 1'b0; - assign out_tuser = ((vef_state == VEF_PAYLOAD) & in_tlast) ? {1'b0,vita_len[0],2'b00} : 4'b0000; - assign out_tdata = tdata; - - wire [15:0] vita_len_in_bytes = {vita_len[13:0],2'b00}; // Vita length is in 32-bit words - - wire [47:0] pad = 48'h0; - wire [47:0] mac_src, mac_dst; - wire [15:0] eth_type = 16'h0800; - wire [15:0] misc_ip = { 4'd4 /* IPv4 */, 4'd5 /* IP HDR Len */, 8'h00 /* DSCP and ECN */}; - wire [15:0] ip_len = (16'd28 + vita_len_in_bytes); // 20 for IP, 8 for UDP - wire [15:0] ident = 16'h0; - wire [15:0] flag_frag = { 3'b010 /* don't fragment */, 13'h0 }; - wire [15:0] ttl_prot = { 8'h10 /* TTL */, 8'h11 /* UDP */ }; - wire [15:0] iphdr_checksum; - wire [31:0] ip_src, ip_dst; - wire [15:0] udp_src, udp_dst; - wire [15:0] udp_len = (16'd8 + vita_len_in_bytes); - wire [15:0] udp_checksum = 16'h0; - - setting_reg #(.my_addr(BASE), .awidth(SR_AWIDTH), .width(16)) set_mac_upper - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[47:32]), .changed()); - - setting_reg #(.my_addr(BASE+1), .awidth(SR_AWIDTH), .width(32)) set_mac_lower - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[31:0]), .changed()); - - setting_reg #(.my_addr(BASE+2), .awidth(SR_AWIDTH), .width(32)) set_ip - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ip_src), .changed()); - - setting_reg #(.my_addr(BASE+3), .awidth(SR_AWIDTH), .width(16)) set_udp - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(udp_src), .changed()); - - // Tables of MAC/IP/UDP addresses - wire [8:0] ram_addr; // FIXME we could skip this part if we had wider SR addresses - - setting_reg #(.my_addr(BASE+4), .awidth(SR_AWIDTH), .width(9)) set_ram_addr - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ram_addr), .changed()); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_ip - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+5)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob(ip_dst)); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_udpmac - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+6)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob({udp_dst,mac_dst[47:32]})); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_maclower - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+7)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob(mac_dst[31:0])); - - ip_hdr_checksum ip_hdr_checksum - (.clk(clk), .in({misc_ip,ip_len,ident,flag_frag,ttl_prot,16'd0,ip_src,ip_dst}), - .out(iphdr_checksum)); - - always @* - case(vef_state) - 1 : tdata <= { pad[47:0], mac_dst[47:32]}; - 2 : tdata <= { mac_dst[31:0], mac_src[47:16]}; - 3 : tdata <= { mac_src[15:0], eth_type[15:0], misc_ip[15:0], ip_len[15:0] }; - 4 : tdata <= { ident[15:0], flag_frag[15:0], ttl_prot[15:0], iphdr_checksum[15:0]}; - 5 : tdata <= { ip_src, ip_dst}; - 6 : tdata <= { udp_src, udp_dst, udp_len, udp_checksum}; - default : tdata <= in_tdata; - endcase // case (vef_state) - -endmodule // vita_eth_framer diff --git a/fpga/usrp3/lib/packet_proc/vrlp_eth_framer.v b/fpga/usrp3/lib/packet_proc/vrlp_eth_framer.v deleted file mode 100644 index 5962b9ba1..000000000 --- a/fpga/usrp3/lib/packet_proc/vrlp_eth_framer.v +++ /dev/null @@ -1,139 +0,0 @@ - -// vrlp_eth_framer -// Takes a vrlp stream in and adds udp, ip, and ethernet framing -// Uses 8 setting reg addresses. First 4 are simple registers: -// BASE+0 : Upper 16 bits of ethernet src mac -// BASE+1 : Lower 32 bits of ethernet src mac -// BASE+2 : IP src address -// BASE+3 : UDP src port -// -// Next 4 control write ports on a RAM indexed by destination field of stream ID -// BASE+4 : Dest SID for next 3 regs -// BASE+5 : Dest IP -// BASE+6 : Dest UDP port, upper 16 bits of dest mac -// BASE+7 : Lower 32 bits of dest mac -// -// in_tuser holds streamid - -module vrlp_eth_framer - #(parameter BASE=0) - (input clk, input reset, input clear, - input set_stb, input [7:0] set_addr, input [31:0] set_data, - input [63:0] in_tdata, input [15:0] in_tuser, input in_tlast, input in_tvalid, output in_tready, - output [63:0] out_tdata, output [3:0] out_tuser, output out_tlast, output out_tvalid, input out_tready, - output [31:0] debug ); - - localparam SR_AWIDTH = 8; - - reg [15:0] sid; - reg [15:0] vrlp_len; - - reg [2:0] vef_state; - localparam VEF_IDLE = 3'd0; - localparam VEF_PAYLOAD = 3'd7; - - reg [63:0] tdata; - - always @(posedge clk) - if(reset | clear) - begin - vef_state <= VEF_IDLE; - sid <= 16'd0; - vrlp_len <= 16'd0; - end - else - case(vef_state) - VEF_IDLE : - if(in_tvalid) - begin - vef_state <= 1; - sid <= in_tuser[15:0]; - vrlp_len <= in_tdata[15:0]; // modified for VRLP header - end - VEF_PAYLOAD : - if(in_tvalid & out_tready) - if(in_tlast) - vef_state <= VEF_IDLE; - default : - if(out_tready) - vef_state <= vef_state + 3'd1; - endcase // case (vef_state) - - wire [15:0] vrlp_len_in_bytes = {vrlp_len[13:0],2'b00}; // Vrlp length is in 32-bit words - - assign in_tready = (vef_state == VEF_PAYLOAD) ? out_tready : 1'b0; - assign out_tvalid = (vef_state == VEF_PAYLOAD) ? in_tvalid : (vef_state == VEF_IDLE) ? 1'b0 : 1'b1; - assign out_tlast = (vef_state == VEF_PAYLOAD) ? in_tlast : 1'b0; - assign out_tuser = ((vef_state == VEF_PAYLOAD) & in_tlast) ? {1'b0,vrlp_len_in_bytes[2:0]} : 4'b0000; - assign out_tdata = tdata; - - wire [47:0] pad = 48'h0; - wire [47:0] mac_src, mac_dst; - wire [15:0] eth_type = 16'h0800; - wire [15:0] misc_ip = { 4'd4 /* IPv4 */, 4'd5 /* IP HDR Len */, 8'h00 /* DSCP and ECN */}; - wire [15:0] ip_len = (16'd28 + vrlp_len_in_bytes); // 20 for IP, 8 for UDP - wire [15:0] ident = 16'h0; - wire [15:0] flag_frag = { 3'b010 /* don't fragment */, 13'h0 }; - wire [15:0] ttl_prot = { 8'h10 /* TTL */, 8'h11 /* UDP */ }; - wire [15:0] iphdr_checksum; - wire [31:0] ip_src, ip_dst; - wire [15:0] udp_src, udp_dst; - wire [15:0] udp_len = (16'd8 + vrlp_len_in_bytes); - wire [15:0] udp_checksum = 16'h0; - - setting_reg #(.my_addr(BASE), .awidth(SR_AWIDTH), .width(16)) set_mac_upper - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[47:32]), .changed()); - - setting_reg #(.my_addr(BASE+1), .awidth(SR_AWIDTH), .width(32)) set_mac_lower - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(mac_src[31:0]), .changed()); - - setting_reg #(.my_addr(BASE+2), .awidth(SR_AWIDTH), .width(32)) set_ip - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ip_src), .changed()); - - setting_reg #(.my_addr(BASE+3), .awidth(SR_AWIDTH), .width(16)) set_udp - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(udp_src), .changed()); - - // Tables of MAC/IP/UDP addresses - wire [8:0] ram_addr; // FIXME we could skip this part if we had wider SR addresses - - setting_reg #(.my_addr(BASE+4), .awidth(SR_AWIDTH), .width(9)) set_ram_addr - (.clk(clk), .rst(reset), - .strobe(set_stb), .addr(set_addr), .in(set_data), - .out(ram_addr), .changed()); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_ip - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+5)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob(ip_dst)); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_udpmac - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+6)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob({udp_dst,mac_dst[47:32]})); - - ram_2port #(.DWIDTH(32), .AWIDTH(9)) ram_maclower - (.clka(clk), .ena(1'b1), .wea(set_stb & (set_addr == BASE+7)), .addra(ram_addr), .dia(set_data), .doa(), - .clkb(clk), .enb(1'b1), .web(1'b0), .addrb(sid[8:0]), .dib(32'hFFFF_FFFF), .dob(mac_dst[31:0])); - - ip_hdr_checksum ip_hdr_checksum - (.clk(clk), .in({misc_ip,ip_len,ident,flag_frag,ttl_prot,16'd0,ip_src,ip_dst}), - .out(iphdr_checksum)); - - always @* - case(vef_state) - 1 : tdata <= { pad[47:0], mac_dst[47:32]}; - 2 : tdata <= { mac_dst[31:0], mac_src[47:16]}; - 3 : tdata <= { mac_src[15:0], eth_type[15:0], misc_ip[15:0], ip_len[15:0] }; - 4 : tdata <= { ident[15:0], flag_frag[15:0], ttl_prot[15:0], iphdr_checksum[15:0]}; - 5 : tdata <= { ip_src, ip_dst}; - 6 : tdata <= { udp_src, udp_dst, udp_len, udp_checksum}; - default : tdata <= in_tdata; - endcase // case (vef_state) - -endmodule // vrlp_eth_framer diff --git a/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita.v b/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita.v deleted file mode 100644 index 04da73616..000000000 --- a/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita.v +++ /dev/null @@ -1,90 +0,0 @@ - -module vrlp_to_compressed_vita - (input clk, input reset, input clear, - input [63:0] i_tdata, input i_tlast, input i_tvalid, output i_tready, - output [63:0] o_tdata, output o_tlast, output o_tvalid, input o_tready); - - wire [63:0] o_tdata_int; - wire o_tlast_int, o_tvalid_int, o_tready_int; - - reg [1:0] v2cv_state; - reg [11:0] seqnum; - reg trim_line; - - localparam V2CV_VRLP = 2'd0; - localparam V2CV_VRTH = 2'd1; - localparam V2CV_BODY = 2'd2; - localparam V2CV_DUMP = 2'd3; - - wire is_ec = i_tdata[63:60] == 4'h5; - wire has_trailer = i_tdata[58] & ~is_ec; - wire has_time = |i_tdata[53:52]; - wire eob = i_tdata[56] & ~is_ec; - wire [15:0] len = i_tdata[47:32]; - wire [31:0] sid = i_tdata[31:0]; - - wire [63:0] compressed_hdr = { is_ec, has_trailer, has_time, eob, seqnum, len, sid }; - wire bad_vita = |i_tdata[55:54] /* has secs */ | i_tdata[59] /* has class */ | ( {i_tdata[63],i_tdata[61:60]} != 3'b001 ); - reg [15:0] len_reg; - wire [16:0] vita_words32 = i_tdata[16:0]-17'd4; - assign trim_now = 0; - - always @(posedge clk) - if(reset | clear) - begin - v2cv_state <= V2CV_VRLP; - seqnum <= 12'd0; - trim_line <= 1'b0; - len_reg <= 16'd0; - end - else - case(v2cv_state) - V2CV_VRLP : - if(i_tvalid) - begin - seqnum <= i_tdata[31:20]; - trim_line <= i_tdata[0]; - len_reg <= vita_words32[16:1]; - if(~i_tlast) - v2cv_state <= V2CV_VRTH; - end - - V2CV_VRTH : - if(i_tvalid & o_tready_int) - begin - len_reg <= len_reg - 16'd1; - if(i_tlast) - v2cv_state <= V2CV_VRLP; - else if(bad_vita) - v2cv_state <= V2CV_DUMP; - else - v2cv_state <= V2CV_BODY; - end - - V2CV_BODY : - if(i_tvalid & o_tready_int) - begin - len_reg <= len_reg - 16'd1; - if(i_tlast) - v2cv_state <= V2CV_VRLP; - else if(len_reg == 16'd0) - v2cv_state <= V2CV_DUMP; - end - V2CV_DUMP : - if(i_tvalid) - if(i_tlast) - v2cv_state <= V2CV_VRLP; - endcase // case (v2cv_state) - - assign o_tdata_int = (v2cv_state == V2CV_VRTH) ? compressed_hdr : i_tdata; - assign o_tlast_int = i_tlast | (len_reg == 16'd0); - assign o_tvalid_int = i_tvalid && (((v2cv_state == V2CV_VRTH) && !bad_vita) || (v2cv_state == V2CV_BODY)); - assign i_tready = o_tready_int | (v2cv_state == V2CV_VRLP) | (v2cv_state == V2CV_DUMP); - - axi_fifo_short #(.WIDTH(65)) short_fifo - (.clk(clk), .reset(reset), .clear(clear), - .i_tdata({o_tlast_int,o_tdata_int}), .i_tvalid(o_tvalid_int), .i_tready(o_tready_int), - .o_tdata({o_tlast,o_tdata}), .o_tvalid(o_tvalid), .o_tready(o_tready), - .space(), .occupied()); - -endmodule // vrlp_to_compressed_vita diff --git a/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita_tb.v b/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita_tb.v deleted file mode 100644 index 167c0b014..000000000 --- a/fpga/usrp3/lib/packet_proc/vrlp_to_compressed_vita_tb.v +++ /dev/null @@ -1,120 +0,0 @@ -`timescale 1ns/1ps - -module vrlp_to_compressed_vita_tb(); - - reg clk = 0; - reg reset = 1; - - always #10 clk = ~clk; - - initial $dumpfile("vrlp_to_compressed_vita_tb.vcd"); - initial $dumpvars(0,vrlp_to_compressed_vita_tb); - - task send_packet; - input [63:0] data_start; - input [31:0] len; - - begin - // Send a packet - @(posedge clk); - {i_tlast, i_tdata} <= { 1'b0, data_start }; - i_tvalid <= 1; - @(posedge clk); - i_tdata <= 64'hAAAA_BBBB_CCCC_0000; - - repeat(len-2) - begin - i_tvalid <= 1; - @(posedge clk); - i_tdata <= i_tdata + 1; - end - i_tlast <= 1; - i_tdata <= i_tdata + 1; - @(posedge clk); - i_tvalid <= 1'b0; - - @(posedge clk); - end - endtask // send_packet - - - initial - begin - #1000 reset = 0; - #200000; - $finish; - end - - wire [63:0] o_tdata; - reg [63:0] i_tdata; - wire [2:0] o_tuser; - reg [2:0] i_tuser; - reg i_tlast; - wire o_tlast; - wire o_tvalid, i_tready; - reg i_tvalid, o_tready; - reg i_terror; - - localparam RPT_COUNT = 16; - - initial - begin - i_tvalid <= 0; - o_tready <= 0; - - while(reset) - @(posedge clk); - @(posedge clk); - - //send_packet(64'hA0,3'd0, 16, 0); - send_packet(64'hAABC_0008_DEAD_BEEF, 4); - send_packet(64'h7DEF_0008_8765_4321, 4); - send_packet(64'hAABC_0007_F00D_1234, 4); - send_packet(64'h7DEF_0007_ABCD_4321, 4); - o_tready <= 1; - //send_packet(64'hC0,3'd0, 16, 1); - //send_packet(64'hD0,3'd0, 16, 0); - //send_packet(64'hE0,3'd0, 16, 0); - //send_packet(64'hF0,3'd0, 16, 0); - - @(posedge clk); - - end // initial begin - - wire i_terror_int, i_tlast_int, i_tready_int, i_tvalid_int; - wire [2:0] i_tuser_int; - wire [63:0] i_tdata_int; - wire o_tlast_int, o_tready_int, o_tvalid_int; - wire [2:0] o_tuser_int; - wire [63:0] o_tdata_int; - wire [63:0] vrlp_tdata; - wire vrlp_tlast, vrlp_tvalid, vrlp_tready; - - axi_fifo #(.WIDTH(65), .SIZE(10)) fifo - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata({i_tlast,i_tdata}), .i_tvalid(i_tvalid), .i_tready(i_tready), - .o_tdata({i_tlast_int,i_tdata_int}), .o_tvalid(i_tvalid_int), .o_tready(i_tready_int)); - - compressed_vita_to_vrlp dut0 - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata(i_tdata_int), .i_tlast(i_tlast_int), .i_tvalid(i_tvalid_int), .i_tready(i_tready_int), - .o_tdata(vrlp_tdata), .o_tlast(vrlp_tlast), .o_tvalid(vrlp_tvalid), .o_tready(vrlp_tready)); - - vrlp_to_compressed_vita dut1 - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata(vrlp_tdata), .i_tlast(vrlp_tlast), .i_tvalid(vrlp_tvalid), .i_tready(vrlp_tready), - .o_tdata(o_tdata_int), .o_tlast(o_tlast_int), .o_tvalid(o_tvalid_int), .o_tready(o_tready_int)); - - axi_fifo #(.WIDTH(65), .SIZE(10)) fifo_out - (.clk(clk), .reset(reset), .clear(1'b0), - .i_tdata({o_tlast_int,o_tdata_int}), .i_tvalid(o_tvalid_int), .i_tready(o_tready_int), - .o_tdata({o_tlast,o_tdata}), .o_tvalid(o_tvalid), .o_tready(o_tready)); - - always @(posedge clk) - if(o_tvalid & o_tready) - begin - $display("%x",o_tdata); - if(o_tlast) - $display("======EOF========"); - end -endmodule // vrlp_to_compressed_vita_tb |