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系统架构图如下:
2.2 用户接口介绍
由图可知逻辑层对外的接口主要有: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推出了一种简化的报文格式。
帧类型说明:
hello报头:
hello头解析:
2.4 时钟关系:
3 IP配置
1,LAN配置:4X,5G,参考时钟选择125MHZ;
2,设备ID:可选择8BIT或16BIT;可根据互联设备选择;然后配置。
3,数据流控制:发送控制器可发送也可接收,接收控制器只可接收;根据项目需求选择了发送;
所有事事务类型介绍见2.3所述hello帧解析;
1,源端口:模块作为源设备,支持事务配置;根据需要选择了Write和Doorbell两中类型的hello。即IP模块支持发送这两种数据报;
2,目的端口:如过IP作为目标设备,支持事务配置;根据需要选择了Write和Doorbell,Streaming-Writr三中类型的hello。即IP模块支持接收这两种数据报;
3,是否选择维护功能:配置否;
IO port选择:IO数据端口有两种,一种condensed IO,一种initiator/target 。
condensed I/O:接收,发送共用一个IO通道;
initiator/target :发送,接收使用独立的IO通道;
messaging/ Maintainance 配是否使用hello包的传输方式;
request reordering :使用该功能,利用IP核自动对数据报发送顺序排序。
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 ()
);