diff options
| -rw-r--r-- | usrp2/fifo/packet_router.v | 179 | 
1 files changed, 100 insertions, 79 deletions
| diff --git a/usrp2/fifo/packet_router.v b/usrp2/fifo/packet_router.v index 288ff05e3..031fe1c78 100644 --- a/usrp2/fifo/packet_router.v +++ b/usrp2/fifo/packet_router.v @@ -37,6 +37,9 @@ module packet_router      always @(posedge wb_clk_i)          wb_ack_o <= wb_stb_i & ~wb_ack_o; +    //which buffer: 0 = CPU read buffer, 1 = CPU write buffer +    wire which_buf = wb_adr_i[BUF_SIZE+2]; +      ////////////////////////////////////////////////////////////////////      // CPU interface to this packet router      //////////////////////////////////////////////////////////////////// @@ -47,8 +50,15 @@ module packet_router      wire        cpu_out_valid;      wire        cpu_out_ready; -    //which buffer: 0 = CPU read buffer, 1 = CPU write buffer -    wire which_buf = wb_adr_i[BUF_SIZE+2]; +    //////////////////////////////////////////////////////////////////// +    // Communication interfaces +    //////////////////////////////////////////////////////////////////// +    wire [35:0] com_inp_data; +    wire        com_inp_valid; +    wire        com_inp_ready; +    wire [35:0] com_out_data; +    wire        com_out_valid; +    wire        com_out_ready;      ////////////////////////////////////////////////////////////////////      // status and control handshakes @@ -67,20 +77,31 @@ module packet_router      assign status[1] = cpu_out_hs_stat;      //////////////////////////////////////////////////////////////////// -    // Ethernet input control +    // Communication input source combiner +    //   - combine streams from serdes and ethernet +    //////////////////////////////////////////////////////////////////// +    //TODO: just connect eth input to com input for now +    assign com_inp_data = eth_inp_data; +    assign com_inp_valid = eth_inp_valid; +    assign eth_inp_ready = com_inp_ready; + +    //////////////////////////////////////////////////////////////////// +    // Communication output sink demuxer +    //   - demux the stream to serdes or ethernet      //////////////////////////////////////////////////////////////////// -    //TODO: just connect eth input to cpu input for now -    //assign cpu_inp_data = eth_inp_data; -    //assign cpu_inp_valid = eth_inp_valid; -    //assign eth_inp_ready = cpu_inp_ready; +    //TODO: just connect eth output to com output for now +    assign eth_out_data = com_out_data; +    assign eth_out_valid = com_out_valid; +    assign com_out_ready = eth_out_ready;      //////////////////////////////////////////////////////////////////// -    // Ethernet output control +    // Communication output source combiner +    //   - combine streams from dsp framer, com inspector, and cpu      //////////////////////////////////////////////////////////////////// -    //TODO: just connect eth output to cpu output for now -    assign eth_out_data = cpu_out_data; -    assign eth_out_valid = cpu_out_valid; -    assign cpu_out_ready = eth_out_ready; +    //TODO: just connect com output to cpu output for now +    assign com_out_data = cpu_out_data; +    assign com_out_valid = cpu_out_valid; +    assign cpu_out_ready = com_out_ready;      ////////////////////////////////////////////////////////////////////      // Interface CPU input interface to memory mapped wishbone @@ -225,131 +246,131 @@ module packet_router      end      //////////////////////////////////////////////////////////////////// -    // Ethernet input inspector -    //   - inspect Ethernet and send it to CPU or DSP +    // Communication input inspector +    //   - inspect com input and send it to CPU, DSP, or COM      //////////////////////////////////////////////////////////////////// -    localparam ETH_INSP_READ_ETH_PRE = 0; -    localparam ETH_INSP_READ_ETH = 1; -    localparam ETH_INSP_WRITE_DSP_REGS = 2; -    localparam ETH_INSP_WRITE_DSP_LIVE = 3; -    localparam ETH_INSP_WRITE_CPU_REGS = 4; -    localparam ETH_INSP_WRITE_CPU_LIVE = 5; +    localparam COM_INSP_READ_COM_PRE = 0; +    localparam COM_INSP_READ_COM = 1; +    localparam COM_INSP_WRITE_DSP_REGS = 2; +    localparam COM_INSP_WRITE_DSP_LIVE = 3; +    localparam COM_INSP_WRITE_CPU_REGS = 4; +    localparam COM_INSP_WRITE_CPU_LIVE = 5; -    localparam ETH_INSP_MAX_NUM_DREGS = 12; //padded_eth + ip + udp + vrt_hdr lines -    localparam ETH_INSP_DREGS_DSP_OFFSET = 10; //offset to start dsp at +    localparam COM_INSP_MAX_NUM_DREGS = 12; //padded_eth + ip + udp + vrt_hdr lines +    localparam COM_INSP_DREGS_DSP_OFFSET = 10; //offset to start dsp at -    reg [2:0] eth_insp_state; -    reg [3:0] eth_insp_dreg_count; //data registers to buffer headers -    wire [3:0] eth_insp_dreg_count_next = eth_insp_dreg_count + 1'b1; -    reg [35:0] eth_insp_dregs [ETH_INSP_MAX_NUM_DREGS-1:0]; +    reg [2:0] com_insp_state; +    reg [3:0] com_insp_dreg_count; //data registers to buffer headers +    wire [3:0] com_insp_dreg_count_next = com_insp_dreg_count + 1'b1; +    reg [35:0] com_insp_dregs [COM_INSP_MAX_NUM_DREGS-1:0]; -    wire eth_inp_dregs_is_data = 1'b0; //TODO (not data for now) +    wire com_inp_dregs_is_data = 1'b0; //TODO (not data for now)      /////////////////////////////////////      //assign output signals to CPU input      ///////////////////////////////////// -    assign cpu_inp_data = (eth_insp_state == ETH_INSP_WRITE_CPU_REGS)? -        eth_insp_dregs[eth_insp_dreg_count] : eth_inp_data +    assign cpu_inp_data = (com_insp_state == COM_INSP_WRITE_CPU_REGS)? +        com_insp_dregs[com_insp_dreg_count] : com_inp_data      ;      assign cpu_inp_valid = -        (eth_insp_state == ETH_INSP_WRITE_CPU_REGS)? 1'b1          : ( -        (eth_insp_state == ETH_INSP_WRITE_CPU_LIVE)? eth_inp_valid : ( +        (com_insp_state == COM_INSP_WRITE_CPU_REGS)? 1'b1          : ( +        (com_insp_state == COM_INSP_WRITE_CPU_LIVE)? com_inp_valid : (      1'b0));      /////////////////////////////////////      //assign output signals to DSP output      ///////////////////////////////////// -    wire [3:0] eth_insp_dsp_flags = (eth_insp_dreg_count == ETH_INSP_DREGS_DSP_OFFSET)? +    wire [3:0] com_insp_dsp_flags = (com_insp_dreg_count == COM_INSP_DREGS_DSP_OFFSET)?          4'b0001 : 4'b0000      ; -    assign dsp_out_data = (eth_insp_state == ETH_INSP_WRITE_DSP_REGS)? -        {eth_insp_dsp_flags, eth_insp_dregs[eth_insp_dreg_count][31:0]} : eth_inp_data +    assign dsp_out_data = (com_insp_state == COM_INSP_WRITE_DSP_REGS)? +        {com_insp_dsp_flags, com_insp_dregs[com_insp_dreg_count][31:0]} : com_inp_data      ;      assign dsp_out_valid = -        (eth_insp_state == ETH_INSP_WRITE_DSP_REGS)? 1'b1          : ( -        (eth_insp_state == ETH_INSP_WRITE_DSP_LIVE)? eth_inp_valid : ( +        (com_insp_state == COM_INSP_WRITE_DSP_REGS)? 1'b1          : ( +        (com_insp_state == COM_INSP_WRITE_DSP_LIVE)? com_inp_valid : (      1'b0));      ///////////////////////////////////// -    //assign output signal to ETH input +    //assign output signal to COM input      ///////////////////////////////////// -    assign eth_inp_ready = -        (eth_insp_state == ETH_INSP_READ_ETH_PRE)  ? 1'b1          : ( -        (eth_insp_state == ETH_INSP_READ_ETH)      ? 1'b1          : ( -        (eth_insp_state == ETH_INSP_WRITE_DSP_LIVE)? dsp_out_ready : ( -        (eth_insp_state == ETH_INSP_WRITE_CPU_LIVE)? cpu_inp_ready : ( +    assign com_inp_ready = +        (com_insp_state == COM_INSP_READ_COM_PRE)  ? 1'b1          : ( +        (com_insp_state == COM_INSP_READ_COM)      ? 1'b1          : ( +        (com_insp_state == COM_INSP_WRITE_DSP_LIVE)? dsp_out_ready : ( +        (com_insp_state == COM_INSP_WRITE_CPU_LIVE)? cpu_inp_ready : (      1'b0))));      always @(posedge stream_clk)      if(stream_rst) begin -        eth_insp_state <= ETH_INSP_READ_ETH_PRE; -        eth_insp_dreg_count <= 0; +        com_insp_state <= COM_INSP_READ_COM_PRE; +        com_insp_dreg_count <= 0;      end      else begin -        case(eth_insp_state) -        ETH_INSP_READ_ETH_PRE: begin -            if (eth_inp_ready & eth_inp_valid & eth_inp_data[32]) begin -                eth_insp_state <= ETH_INSP_READ_ETH; -                eth_insp_dreg_count <= eth_insp_dreg_count_next; -                eth_insp_dregs[eth_insp_dreg_count] <= eth_inp_data; +        case(com_insp_state) +        COM_INSP_READ_COM_PRE: begin +            if (com_inp_ready & com_inp_valid & com_inp_data[32]) begin +                com_insp_state <= COM_INSP_READ_COM; +                com_insp_dreg_count <= com_insp_dreg_count_next; +                com_insp_dregs[com_insp_dreg_count] <= com_inp_data;              end          end -        ETH_INSP_READ_ETH: begin -            if (eth_inp_ready & eth_inp_valid) begin -                eth_insp_dregs[eth_insp_dreg_count] <= eth_inp_data; -                if (eth_inp_dregs_is_data & (eth_insp_dreg_count_next == ETH_INSP_MAX_NUM_DREGS)) begin -                    eth_insp_state <= ETH_INSP_WRITE_DSP_REGS; -                    eth_insp_dreg_count <= ETH_INSP_DREGS_DSP_OFFSET; +        COM_INSP_READ_COM: begin +            if (com_inp_ready & com_inp_valid) begin +                com_insp_dregs[com_insp_dreg_count] <= com_inp_data; +                if (com_inp_dregs_is_data & (com_insp_dreg_count_next == COM_INSP_MAX_NUM_DREGS)) begin +                    com_insp_state <= COM_INSP_WRITE_DSP_REGS; +                    com_insp_dreg_count <= COM_INSP_DREGS_DSP_OFFSET;                  end -                else if (eth_inp_data[33] | (eth_insp_dreg_count_next == ETH_INSP_MAX_NUM_DREGS)) begin -                    eth_insp_state <= ETH_INSP_WRITE_CPU_REGS; -                    eth_insp_dreg_count <= 0; +                else if (com_inp_data[33] | (com_insp_dreg_count_next == COM_INSP_MAX_NUM_DREGS)) begin +                    com_insp_state <= COM_INSP_WRITE_CPU_REGS; +                    com_insp_dreg_count <= 0;                  end                  else begin -                    eth_insp_dreg_count <= eth_insp_dreg_count_next; +                    com_insp_dreg_count <= com_insp_dreg_count_next;                  end              end          end -        ETH_INSP_WRITE_DSP_REGS: begin +        COM_INSP_WRITE_DSP_REGS: begin              if (dsp_out_ready & dsp_out_valid) begin -                eth_insp_dreg_count <= eth_insp_dreg_count_next; -                if (eth_insp_dreg_count_next == ETH_INSP_MAX_NUM_DREGS) begin -                    eth_insp_state <= ETH_INSP_WRITE_DSP_LIVE; -                    eth_insp_dreg_count <= 0; +                com_insp_dreg_count <= com_insp_dreg_count_next; +                if (com_insp_dreg_count_next == COM_INSP_MAX_NUM_DREGS) begin +                    com_insp_state <= COM_INSP_WRITE_DSP_LIVE; +                    com_insp_dreg_count <= 0;                  end              end          end -        ETH_INSP_WRITE_DSP_LIVE: begin -            if (dsp_out_ready & dsp_out_valid & eth_inp_data[33]) begin -                eth_insp_state <= ETH_INSP_READ_ETH_PRE; +        COM_INSP_WRITE_DSP_LIVE: begin +            if (dsp_out_ready & dsp_out_valid & com_inp_data[33]) begin +                com_insp_state <= COM_INSP_READ_COM_PRE;              end          end -        ETH_INSP_WRITE_CPU_REGS: begin +        COM_INSP_WRITE_CPU_REGS: begin              if (cpu_inp_ready & cpu_inp_valid) begin -                eth_insp_dreg_count <= eth_insp_dreg_count_next; +                com_insp_dreg_count <= com_insp_dreg_count_next;                  if (cpu_inp_data[33]) begin -                    eth_insp_state <= ETH_INSP_READ_ETH_PRE; -                    eth_insp_dreg_count <= 0; +                    com_insp_state <= COM_INSP_READ_COM_PRE; +                    com_insp_dreg_count <= 0;                  end -                else if (eth_insp_dreg_count_next == ETH_INSP_MAX_NUM_DREGS) begin -                    eth_insp_state <= ETH_INSP_WRITE_CPU_LIVE; -                    eth_insp_dreg_count <= 0; +                else if (com_insp_dreg_count_next == COM_INSP_MAX_NUM_DREGS) begin +                    com_insp_state <= COM_INSP_WRITE_CPU_LIVE; +                    com_insp_dreg_count <= 0;                  end              end          end -        ETH_INSP_WRITE_CPU_LIVE: begin -            if (cpu_inp_ready & cpu_inp_valid & eth_inp_data[33]) begin -                eth_insp_state <= ETH_INSP_READ_ETH_PRE; +        COM_INSP_WRITE_CPU_LIVE: begin +            if (cpu_inp_ready & cpu_inp_valid & com_inp_data[33]) begin +                com_insp_state <= COM_INSP_READ_COM_PRE;              end          end -        endcase //eth_insp_state +        endcase //com_insp_state      end  endmodule // packet_router | 
