1,SRIO概述

   Rapid IO分为并行Rapid IO标准和串行Rapid IO标准,串行RapidIO是指物理层采用串行差分模拟信号传输的RapidIO标准,又称SRIO。

   Rapid IO协议由逻辑层、传输层、物理层构成。

   逻辑层定义了所有协议和包格式。这是对终端进行初始化和完成传送的很有必要的信息。对外的用户接口;只要业务有:直接IO/DMA和消息传递;用户主要通过操作逻辑层对外的用户接口,实现通信。

   传输层为数据包从一个终端到另一个终端通道的必要信息;基于包交换的互联技术,定义了包交换的路由和寻址机制;Rapid IO支持8bit/16bit器件ID。因此最多可容纳256或65536个器件;与以太网类似,支持广播,组播,单播;

   物理层描述了设备之间接口协议,例如包传装置,流量控制,电特性及低级错误管理等,包括 1X/4X。

2,Xilnx SRIO IP

    SRIO核核带宽支持x1, x2,x4 。速率支持1.25G 2.5G  3.125G 5G 6.25G。

    2.1 SRIO系统架构图如下:

交换芯片的serdes接口_sed

 2.2 用户接口介绍

交换芯片的serdes接口_用户接口_02

由图可知逻辑层对外的接口主要有:Use,Configuration Fabric

其中user端口主要包括IO port,Messaging Port,Maintenance Port,User-Defined Port。

其中Configuration端口主要为配置端口,可根据需要进行选择;

 IO port : 包括HELLO format 和SRIO stream;

 Messaging Port : 可选;message 可以通过IO prot传输; 

 Maintenance Port: 可选;如果配置底层寄存器需要选择,否则可以不用;

 User-Defined Port :可选;采用SRIO stream format,并拥有2个AXI4-Stream channels;

 2.3 hello包解析:

   在利用Xilinx的IP进行开发时,为了简化报文的解析和组包,SRIO Gen2 usesAXI4-Stream,Xilinx推出了一种简化的报文格式。

   帧类型说明:

交换芯片的serdes接口_IP_03

交换芯片的serdes接口_fpga_04

交换芯片的serdes接口_用户接口_05

hello报头:

交换芯片的serdes接口_sed_06

hello头解析:

交换芯片的serdes接口_fpga_07

交换芯片的serdes接口_sed_08

2.4 时钟关系:

  

交换芯片的serdes接口_fpga_09

3 IP配置

 

交换芯片的serdes接口_IP_10

1,LAN配置:4X,5G,参考时钟选择125MHZ;

2,设备ID:可选择8BIT或16BIT;可根据互联设备选择;然后配置。

3,数据流控制:发送控制器可发送也可接收,接收控制器只可接收;根据项目需求选择了发送;

交换芯片的serdes接口_交换芯片的serdes接口_11

所有事事务类型介绍见2.3所述hello帧解析;

1,源端口:模块作为源设备,支持事务配置;根据需要选择了Write和Doorbell两中类型的hello。即IP模块支持发送这两种数据报;

2,目的端口:如过IP作为目标设备,支持事务配置;根据需要选择了Write和Doorbell,Streaming-Writr三中类型的hello。即IP模块支持接收这两种数据报;

3,是否选择维护功能:配置否;

交换芯片的serdes接口_fpga_12

IO port选择:IO数据端口有两种,一种condensed IO,一种initiator/target 。

   condensed I/O:接收,发送共用一个IO通道;

  initiator/target :发送,接收使用独立的IO通道;

messaging/ Maintainance 配是否使用hello包的传输方式;

交换芯片的serdes接口_sed_13

request reordering :使用该功能,利用IP核自动对数据报发送顺序排序。

交换芯片的serdes接口_用户接口_14

3,IP例化

srio_gen2_0 srio_gen2_0
    (
        .sys_clkp                       (REFCLK_SRIO0_P     ),
        .sys_clkn                       (REFCLK_SRIO0_N     ),
        .sys_rst                        (srio_reset         ),//sys_reset          ),//(1'b0),//
        .log_clk_out                    (SRIO_CLK           ),
        .phy_clk_out                    (),
        .gt_clk_out                     (),
        .gt_pcs_clk_out                 (),
        .drpclk_out                     (),
        .refclk_out                     (),
        .clk_lock_out                   (),
        .cfg_rst_out                    (),
        .log_rst_out                    (),
        .buf_rst_out                    (),
        .phy_rst_out                    (),
        .gt_pcs_rst_out                 (),
        .gt0_qpll_clk_out               (),
        .gt0_qpll_out_refclk_out        (),
        .srio_rxn0                      (SRIO_A_RX_N        [0]),
        .srio_rxp0                      (SRIO_A_RX_P        [0]),
        .srio_rxn1                      (SRIO_A_RX_N        [1]),
        .srio_rxp1                      (SRIO_A_RX_P        [1]),
        .srio_rxn2                      (SRIO_A_RX_N        [2]),
        .srio_rxp2                      (SRIO_A_RX_P        [2]),
        .srio_rxn3                      (SRIO_A_RX_N        [3]),
        .srio_rxp3                      (SRIO_A_RX_P        [3]),
        .srio_txn0                      (SRIO_A_TX_N        [0]),
        .srio_txp0                      (SRIO_A_TX_P        [0]),
        .srio_txn1                      (SRIO_A_TX_N        [1]),
        .srio_txp1                      (SRIO_A_TX_P        [1]),
        .srio_txn2                      (SRIO_A_TX_N        [2]),
        .srio_txp2                      (SRIO_A_TX_P        [2]),
        .srio_txn3                      (SRIO_A_TX_N        [3]),
        .srio_txp3                      (SRIO_A_TX_P        [3]),
        //主要端口
        .s_axis_ireq_tvalid             (AXIs_Sireq_tvalid  ),
        .s_axis_ireq_tready             (AXIs_Sireq_tready  ),
        .s_axis_ireq_tlast              (AXIs_Sireq_tlast   ),
        .s_axis_ireq_tdata              (AXIs_Sireq_tdata   ),//[63:0]
        .s_axis_ireq_tkeep              (AXIs_Sireq_tkeep   ),//[7:0]
        .s_axis_ireq_tuser              (AXIs_Sireq_tuser   ),//[31:0]
        //未使用
        .m_axis_iresp_tvalid            (),
        .m_axis_iresp_tready            (1'b1),
        .m_axis_iresp_tlast             (),
        .m_axis_iresp_tdata             (),//[63:0]
        .m_axis_iresp_tkeep             (),//[7:0]
        .m_axis_iresp_tuser             (),//[31:0]
        //下发命令
        .m_axis_treq_tvalid             (AXIs_Streq_tvalid  ),
        .m_axis_treq_tready             (AXIs_Streq_tready  ),
        .m_axis_treq_tlast              (AXIs_Streq_tlast   ),
        .m_axis_treq_tdata              (AXIs_Streq_tdata   ),//[63:0]
        .m_axis_treq_tkeep              (AXIs_Streq_tkeep   ),//[7:0]
        .m_axis_treq_tuser              (AXIs_Streq_tuser   ),//[31:0]
        //未使用
        .s_axis_tresp_tvalid            ('b0),
        .s_axis_tresp_tready            (),
        .s_axis_tresp_tlast             ('b0),
        .s_axis_tresp_tdata             ('b0),//[63:0]
        .s_axis_tresp_tkeep             ('b0),//[7:0]
        .s_axis_tresp_tuser             ('b0),//[31:0]
        
        //测试信号
        .sim_train_en                   ('b0),
        .force_reinit                   ('b0),
        .phy_mce                        ('b0),
        .phy_link_reset                 ('b0),
        .phy_rcvd_mce                   (),
        .phy_rcvd_link_reset            (),
        .phy_debug                      (),//[223:0]
        .gtrx_disperr_or                (ot_gtrx_disperr_or),
        .gtrx_notintable_or             (ot_gtrx_notintable_or),
        .port_error                     (ot_port_error),
        .port_timeout                   (ot_port_timeout),//[23:0]
        .srio_host                      (),
        .port_decode_error              (),
        .deviceid                       (SRIO_dev_ID        ),//[15:0]
        .idle2_selected                 (),
        .phy_lcl_master_enable_out      (),
        .buf_lcl_response_only_out      (),
        .buf_lcl_tx_flow_control_out    (),
        .buf_lcl_phy_buf_stat_out       (),//[5:0]
        .phy_lcl_phy_next_fm_out        (),//[5:0]
        .phy_lcl_phy_last_ack_out       (),//[5:0]
        .phy_lcl_phy_rewind_out         (),
        .phy_lcl_phy_rcvd_buf_stat_out  (),//[5:0]
        .phy_lcl_maint_only_out         (),
        .port_initialized               (SRIO_state_port_init   ),
        .link_initialized               (SRIO_state_link_init   ),
        .idle_selected                  (),
        .mode_1x                        ()
    );