diff options
| author | Josh Blum <josh@joshknows.com> | 2010-12-10 20:29:00 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-12-10 20:29:00 -0800 | 
| commit | 6ab84f8f1a51ecd7eb9562f9e2fb52f893721c43 (patch) | |
| tree | f2b03dc43714dfae07a5905cef27dec2c4775aee | |
| parent | e052378deebaec3a1e06438af95095bbed6d046c (diff) | |
| download | uhd-6ab84f8f1a51ecd7eb9562f9e2fb52f893721c43.tar.gz uhd-6ab84f8f1a51ecd7eb9562f9e2fb52f893721c43.tar.bz2 uhd-6ab84f8f1a51ecd7eb9562f9e2fb52f893721c43.zip | |
packet_router: added fifo before cpu_out, tweaked inspection logic
| -rw-r--r-- | usrp2/fifo/packet_router.v | 54 | 
1 files changed, 29 insertions, 25 deletions
| diff --git a/usrp2/fifo/packet_router.v b/usrp2/fifo/packet_router.v index 9d18c3c42..df1ba7351 100644 --- a/usrp2/fifo/packet_router.v +++ b/usrp2/fifo/packet_router.v @@ -89,12 +89,14 @@ module packet_router      );      //setting register to program the UDP ctrl ports +    /*      wire [15:0] ctrl_udp_port, other_udp_port;      setting_reg #(.my_addr(CTRL_BASE+2)) sreg_ctrl_ports(          .clk(stream_clk),.rst(stream_rst),          .strobe(set_stb),.addr(set_addr),.in(set_data),          .out({other_udp_port, ctrl_udp_port}),.changed()      ); +    */      //setting register to program the UDP data ports      wire [15:0] dsp0_udp_port, dsp1_udp_port; @@ -420,19 +422,13 @@ module packet_router      wire com_insp_dreg_counter_done = (com_insp_dreg_count_next == COM_INSP_MAX_NUM_DREGS)? 1'b1 : 1'b0;      reg [35:0] com_insp_dregs [COM_INSP_MAX_NUM_DREGS-1:0]; -    //Inspection logic: -    wire com_insp_is_ip_udp = 1'b1 -        && (com_insp_dregs[3][15:0] == 16'h800)        //ethertype IPv4 -        && (com_insp_dregs[6][23:16] == 8'h11)         //protocol UDP -    ; -    wire com_insp_is_bcast = 1'b1 -        && (com_insp_dregs[0][15:0] == 16'hffff)       //ethernet dst mac -        && (com_insp_dregs[1][31:0] == 32'hffffffff)   //ethernet dst mac -    ; -    wire com_insp_is_ip_match = (my_ip_addr == com_insp_dregs[8][31:0])? 1'b1 : 1'b0; -    wire com_insp_is_dsp0_port = (com_insp_dregs[9][15:0] == dsp0_udp_port)? 1'b1 : 1'b0; -    wire com_insp_is_ctrl_port = (com_insp_dregs[9][15:0] == ctrl_udp_port)? 1'b1 : 1'b0; -    wire com_insp_is_vrt_pkt = (com_inp_data[15:0] != 16'h0)? 1'b1 : 1'b0; +    //extract various packet components: +    wire [47:0] com_insp_dregs_eth_dst_mac   = {com_insp_dregs[0][15:0], com_insp_dregs[1][31:0]}; +    wire [15:0] com_insp_dregs_eth_type      = com_insp_dregs[3][15:0]; +    wire [7:0]  com_insp_dregs_ipv4_proto    = com_insp_dregs[6][23:16]; +    wire [31:0] com_insp_dregs_ipv4_dst_addr = com_insp_dregs[8][31:0]; +    wire [15:0] com_insp_dregs_udp_dst_port  = com_insp_dregs[9][15:0]; +    wire [15:0] com_insp_dregs_vrt_size      = com_inp_data[15:0];      //Inspector output flags special case:      //Inject SOF into flags at first DSP line. @@ -503,31 +499,33 @@ module packet_router                  com_insp_dregs[com_insp_dreg_count] <= com_inp_data;                  if (com_insp_dreg_counter_done | com_inp_data[33]) begin                      com_insp_state <= COM_INSP_STATE_WRITE_REGS; +                    com_insp_dreg_count <= 0;                      //---------- begin inspection decision -----------// -                    if (com_insp_is_bcast | com_inp_data[33]) begin +                    //bcast or EOF: +                    if ((com_insp_dregs_eth_dst_mac == 48'hffffffffffff) || com_inp_data[33]) begin                          com_insp_dest <= COM_INSP_DEST_BOF; -                        com_insp_dreg_count <= 0;                      end -                    else if (~com_insp_is_ip_udp) begin +                    //not IPv4/UDP: +                    else if ((com_insp_dregs_eth_type != 16'h800) || (com_insp_dregs_ipv4_proto != 8'h11)) begin                          com_insp_dest <= COM_INSP_DEST_CPU; -                        com_insp_dreg_count <= 0;                      end -                    else if (~com_insp_is_ip_match) begin +                    //not my IP address: +                    else if (com_insp_dregs_ipv4_dst_addr != my_ip_addr) begin                          com_insp_dest <= COM_INSP_DEST_EXT; -                        com_insp_dreg_count <= 0;                      end -                    else if (com_insp_is_dsp0_port & com_insp_is_vrt_pkt) begin +                    //UDP data port and VRT: +                    else if ((com_insp_dregs_udp_dst_port == dsp0_udp_port) && (com_insp_dregs_vrt_size != 16'h0)) begin                          com_insp_dest <= COM_INSP_DEST_DSP;                          com_insp_dreg_count <= COM_INSP_DREGS_DSP_OFFSET;                      end +                    //other:                      else begin                          com_insp_dest <= COM_INSP_DEST_CPU; -                        com_insp_dreg_count <= 0;                      end                      //---------- end inspection decision -------------// @@ -570,9 +568,9 @@ module packet_router      ////////////////////////////////////////////////////////////////////      //dummy signals to join the the splitter and muxes below -    wire [35:0] _split_to_ext_data, _split_to_cpu_data; -    wire        _split_to_ext_valid, _split_to_cpu_valid; -    wire        _split_to_ext_ready, _split_to_cpu_ready; +    wire [35:0] _split_to_ext_data,  _split_to_cpu_data,  _cpu_out_data; +    wire        _split_to_ext_valid, _split_to_cpu_valid, _cpu_out_valid; +    wire        _split_to_ext_ready, _split_to_cpu_ready, _cpu_out_ready;      splitter36 bof_out_splitter(          .clk(stream_clk), .rst(stream_rst), .clr(stream_clr), @@ -592,7 +590,13 @@ module packet_router          .clk(stream_clk), .reset(stream_rst), .clear(stream_clr),          .data0_i(com_insp_out_cpu_data), .src0_rdy_i(com_insp_out_cpu_valid), .dst0_rdy_o(com_insp_out_cpu_ready),          .data1_i(_split_to_cpu_data),    .src1_rdy_i(_split_to_cpu_valid),    .dst1_rdy_o(_split_to_cpu_ready), -        .data_o(cpu_out_data),           .src_rdy_o(cpu_out_valid),           .dst_rdy_i(cpu_out_ready) +        .data_o(_cpu_out_data),          .src_rdy_o(_cpu_out_valid),          .dst_rdy_i(_cpu_out_ready) +    ); + +    fifo_cascade #(.WIDTH(36), .SIZE(9/*512 lines plenty for short pkts*/)) cpu_out_fifo ( +        .clk(stream_clk), .reset(stream_rst), .clear(stream_clr), +        .datain(_cpu_out_data), .src_rdy_i(_cpu_out_valid), .dst_rdy_o(_cpu_out_ready), +        .dataout(cpu_out_data), .src_rdy_o(cpu_out_valid),  .dst_rdy_i(cpu_out_ready)      );      //////////////////////////////////////////////////////////////////// | 
