1 概述
SRIO本质上就是利用Rapid IO协议来进行通信的一种接口,只不过在TMS320C6474中被命名为SRIO。
1.1 一般Rapid IO系统
Rapid IO是非专有的高带宽系统级互连。它是一个包交换互连,主要目的是作为系统内部接口,以每秒千兆字节的性能水平进行芯片对芯片或者板对板通信。可以在连接的微处理器、内存和在网络设备、内存子系统和通用计算中操作的内存映射I/O设备中找到该体系结构的用途。Rapid IO的主要特点包括:
•灵活的系统架构,允许点对点通信
•具有错误检测功能的可靠通信
•频率和端口宽度可伸缩性
•非软件密集型的操作
•高带宽互连,低开销
•针数少
•低功率
•低延迟
1.1.1 Rapid IO架构层次
Rapid IO被定义为一个三层架构层次结构。
•逻辑层:指定端点处理事务所需的协议,包括包格式
•传输层:定义寻址方案,在系统中正确路由信息包
•物理层:包含设备级接口信息,如电气特性、错误管理数据、基本流量控制数据等。
在Rapid IO体系结构中,传输层的单个规范与逻辑层和物理层的不同规范是兼容的。
1.2 SRIO支持的Rapid IO特征
•Rapid IO符合互连规范V1.2和勘误表1.2
•物理层符合1x/4x LP-Serial Specification V1.2
•2个1x端口
·通过TI SERDES来集成和恢复时钟
•硬件错误处理,包括循环冗余码(CRC)
•支持交流耦合的差分CML信号
•支持1.25、2.5和3.125 Gbps速率,最高速率为3.125Gbps
•不使用端口的电源关闭选项
•读取、写入、带响应写入、流写入、传出原子和维护操作
•对CPU产生中断(门铃包和内部调度)
•支持8位和16位的ID
•支持34位的接收地址
•支持产生34位、50位、66位地址
·支持的数据尺寸:byte,,half-word, word,,double-word
·大端模式数据传输
·在1字节、2字节、4字节和8字节边界上的小端交换
·直接IO口发送
·消息传递发送
·数据负载最多256字节
·最多由16个信息包组成的单个消息
·用于时钟域切换的弹性存储FIFOs
· 支持错误管理扩展
·支持拥塞控制扩展
·支持三个组播id
1.3 TMS320C6474 SRIO支持的接口特性
核的个数 |
SRIO端口个数 |
SRIO线路个数 |
配置 |
SRIO模块频率 |
3 |
2 |
2 |
1X/1X |
DSP frequence /3 |
C6474中开放了2port,所以虽然代码中有4个port可配,但是对6474只能只用前2port,port的使用必须参照硬件设计来编程,两个port分别对应不同的引脚,要想实现两块DSP间的数据传输,必须将对应的引脚连接起来。基带板上将port 0作为DSP1与DSP2之间的引脚,所以必须使用port 0来进行测试。
2. SRIO 功能描述
2.1 概述
2.1.1 外设数据流
该外设被设计成一个外部驱动的从模块,能够作为DSP系统的主控模块。这意味着外部设备可以根据需要将(突发写入)数据推送到DSP,而无需向CPU生成中断,也无需依赖DSP 的EDMA模块。这有几个好处:它减少了中断的总数,减少了与只读外围设备相关联的握手(延迟),并为其他任务释放了EDMA。
SRIO指定有效负载不超过256字节的数据包。很多时候, 一个信息包将跨越多个包,Rapid IO为每个消息指定最多16个信息包。虽然为每个包事务生成一个请求,以便DMA可以将数据传输到L2RAM,但是只有在消息包的最后一个包之后才会生成一个中断。这个中断通知CPU L2RAM内存中的数据可用来进行处理。
作为终端设备,外设根据目的地ID接收数据包。有两种接收数据包的选项,可以选择;第一个选择是只接受与0x0080中的本地device ID匹配的包,这提供了一定程度的安全性;第二种选择是系统组播操作。
图1 SRIO 外设模块框图
对于接收端: SRIO 接口的 Rx 模块接收输入引脚的高速率数据,该数据传输到时钟恢复模块(Clock recovery)用于从数据流中获取时钟信号,该时钟信号提供给 S2P模块,S2P 将收到的数据转化为 10-bit words。再经过 8/10 decode 模块解码,除去冗余,恢复数据,因此 3.125Gbps 的数据速率有20%的冗余,理论最高传输速率为 2.5Gbps。解码传输的数据经过 FIFO 缓存,数据恢复,CRC 校验后,以数据包的形式存储在内部存储其中,再通过 DMA 将数据传输至指定目的端,至此完成 SRIO 的接收功能。发送为接收的逆过程,原理相似,这里将不再重复叙述。
2.1.2 SRIO包
SRIO数据流由逻辑层、传输层和物理层的数据字段组成。
•逻辑层由头(定义访问类型)和负载(如果存在)组成。
•传输层部分依赖于系统的物理拓扑,由发送和接收设备的源ID和目标ID组成。
•物理层依赖于物理接口(即包括优先级、确认和错误检查字段)。
2.1.2.1 操作序列
SRIO事务基于请求和响应包。包是系统中端点设备之间的通信元素。主或发起者生成一个请求包,该请求包被发送到目标。然后目标生成一个响应包返回给发起者以完成事务。
SRIO端点通常不直接相互连接,而是具有中间连接结构设备。控制symbols用于管理SRIO物理互连中的数据流。控制symbols用于包确认、流控制信息和维护功能。下图显示了数据包如何在系统中运行。
2.1.2.2 控制symbols
控制符号是物理层消息元素,用于管理链路维护、包分隔、包确认、错误报告和错误恢复。所有传输的数据包由包的开始和包的结束分隔符分隔。SRIO控制symbols长24位,由自己的CRC保护。控制symbols提供两种功能:stype0 symbols表示传输symbols的端口的状态,stype1 symbols是对接收端口或传输分隔符的请求。
2.1.2.3 SRIO包类型
SRIO包的类型由包中的Ftype和Ttype字段的组合决定。
例如:
Ftype = 5 Ttype = 4 数据包类型为NWRITE类型(传输数据常用)
Ftype = 10 Ttype = x 数据包类型为Doorbell类型(产生中断用)
2.1.2.4 SRIO数据包与Doorbell包的结构
图1. SRIO数据包的结构
图2. SRIO Doorbell包的结构
包结构中各个段的含义为:
AckID:交换结构期间将使用控制符号来确认是哪一个包;
Prio:表明该包的优先级;
tt:指定 Device ID 是用 8bit 或 16bit 表示;
fftyp:表示包的类型(门铃包的类型常用1010b);
destID:包传送的目的地址 ID;
sourceID:包的源地址 ID;
CRC:包结构的校验保护;
Info:门铃中断触发控制。
2.2 功能运作
2.2.1 组成架构
下图所示为SRIO的外设组成架构图。加载/存储单元(LSU)控制着直接IO数据包的发送,内存入口单元(MAU)控制着直接IO数据包的接收。LSU也控制着维护包的传输。SRIO通过TXU与RXU来发送和接收消息包。这里有四个单元被用来内部DMA与内部内存之间的通信。它们使用缓冲区和接收/传输端口与外部设备通信。串行/反串行(SERDES)宏通过执行传输的并行到串行编码和接收的串行到并行解码来支持端口。
2.2.2 SERDES宏及其配置
SRIO通过支持可伸缩的非专有接口为客户提供了许多好处。使用TI的SERDES宏指令,外设具有很强的适应性和带宽可伸缩性。同一个外设可以用于Rapid IO互连规范V1.2中指定的所有三个频率节点(1.25、2.5和3.125 Gbps)。这允许您在整个系统中只设计一个协议,并选择性地选择带宽,从而在许多实例中消除了对用户专有协议的需要,并提供了更快的设计转向和生产坡道。由于该接口是串行的,所以应用程序空间不限于单个板。它也将推广到背板应用。将这些宏集成到ASIC或DSP上,可以减少板上离散组件的数量,并消除对总线驱动芯片的需求
此外,TI SERDES还内置了一些有价值的特性。系统优化可以是唯一的管理满足个人客户的应用。例如,在SERDES中控制寄存器允许您调整TX差动输出电压(V)在每个驱动器的基础上。这允许权力通过减少TX摆动,可以节省(在同一块板上)短跟踪链接。同样,数据边缘率也可以通过控制寄存器进行调整,以帮助减少任何电磁干扰影响。未使用的链接可以单独使用断电不影响工作环节。
SERDES宏是一个自包含宏,它包括发射机(TX)、接收机(RX)、锁相环(PLL)、时钟恢复、串行到并行(S2P)和并行到串行(P2S)块。内部锁相环乘以用户提供的参考时钟。锁相环的所有环路滤波元件都在芯片上。同样,差动TX和RX缓冲器包含片上终端电阻。唯一的非晶片元件要求是直流闭塞电容器。
2.2.2.1 使能PLL
SERDES宏配置了寄存器SERDES_CFG0_CNTL、SERDES_CFGRXn_CNTL和SERDES_CFGTXn_CNTL,其中n是宏的数量。要启用内部锁相环,必须设置SERDES_CFG0_CNTL的ENPLL位。设置该位后,需要允许1 us使调节器稳定下来。此后,只要RIOCLK和RIOCLK是稳定的,锁相环将不超过200个参考时钟周期来锁定所需的频率。
Bits |
Filed |
Description |
9-8 |
LB |
Loop bandwidth |
5-1 |
MPY |
PLL multiply |
0 |
ENPLL |
Enable PLL |
根据MPY的值,可以计算相对线速率:
图1 行速率与锁相环输出时钟频率的关系
SERDES宏的主工作频率由基准时钟频率和锁相环倍增系数决定。但是,为了支持较低的频率应用程序,每个接收器和发射器也可以通过SERDES_CFGRXn_CNTL和SERDES_CFGTXn_CNTL寄存器来进行配置。
图2 Effect of the RATE Bits
图3 Frequency Range versus MPY Value
注意:若MPY = 10,则 line rate 必须为 Full。
2.2.2.2 使能接收机
要启用SRIO的接收机,必须将关联SERDES_CFGRXn_CNTL寄存器(100h-10Ch)的ENRX位设置为高。
CDR位元中列出的时钟恢复算法操作来调整用于对接收到的消息进行采样的时钟,以便在数据转换中间提取数据样本。可以选择性地禁用二阶算法,并且可以配置这两种算法来优化它们的动态。这两种算法使用相同的基本技术来确定采样时钟是否处于理想位置,如果不是,则需要提前或稍后移动它。当两个连续数据样本不同时,对两个连续数据样本之间的相位样本进行检验。取8个数据样本和9个阶段样本,每一个结果都作为投票,以提前或延迟移动样本点。这八个数据位构成了投票窗口。然后对8张选票进行计数,如果提前或延迟投票占多数,就会采取行动调整采样时钟的位置。一阶算法对每一多数票进行单相调整。二阶算法根据前期和后期多数票的净差额反复进行运算,从而根据阶段变化率进行调整。
将ALIGN字段设置为1可以对包含在IEEE定义并被许多传输标准采用的8b:10b数据编码方案中的K28逗号符号进行对齐。对于不能使用基于逗号的符号对齐的系统,单比特对齐jog功能提供了一种直接从ASIC核心实现的逻辑控制接收机符号对齐特性的方法。这种逻辑可以设计成支持任何需要的对齐检测协议。
EQ位允许启用和配置包含在所有接收信道中的自适应均衡器,该均衡器可以通过相对于信号的高频分量衰减低频分量来补偿信道插入损耗,从而减少码间干扰。在零频率以上,增益以6dB/octave增加,直到达到高频增益。当启用时,接收机均衡逻辑分析数据模式和转换时间,以确定是否应该增加或减少均衡器的低频增益。对于完全自适应设置(EQ = 0001),如果低频增益达到最小值,则减小零频率。同样,如果它达到最大值,那么零频率就会增加。该决策逻辑作为一种具有较长分析间隔的投票算法实现。结果的慢时间常数降低了错误决策的概率,但允许均衡器补偿通道的相对稳定响应。
2.2.2.3 使能发送机
要使发射器能够串行化,必须将关联SERDES_CFGTXn_CNTL寄存器(110h-10Ch)的ENTX位设置为高。当ENTX低时,发射机内部的所有数字电路将被关闭,时钟将被关闭,只有发射时钟(TXBCLK[n])输出将继续正常工作。除了电流模式逻辑(CML)驱动程序(如果选择边界扫描,该驱动程序将保持通电)之外,发射机内的所有电流源都将完全断电。
CM位:常见的模式。调整公用模式,以适应所附接收器的结束。对于大于750mV的输出摆幅设置,这种减少的共模会导致波形失真。在这些条件下,这个位应该设置得高一些。
SWING位:输出摆动。在125和1250mv之间选择8个输出振幅设置之一。
ENFTP:使发射输入时钟相对于发射输出时钟具有固定的相位关系。该字段的唯一有效值是0b;所有其他值都是保留的。
2.2.3 直接IO操作
直接I/O(装载/存储)模块作为所有输出直接I/O包的源。使用直接I/O, Rapid IO包包含数据在目标设备中存储或读取的特定地址。直接I/O要求Rapid IO源设备在目标设备中为内存保留一个本地地址表。一旦建立了这些表,Rapid IO源控制器就使用这些数据计算目标地址并将其插入包头。Rapid IO目标外围设备从接收到的包头中提取目标地址以及通过DMA将载荷传递至内存中。
当CPU要将数据从内存发送到外部processing element(PE)或从外部PE读取数据,它提供了力拓外围DSP等关键信息传输内存地址,目标设备ID,目标目的地地址,数据包优先级等。从本质上讲,必须存在一种手段来填补所有Rapid IO包的头字段。Load/Store模块(LSU)提供了一种机制,通过充当传输描述符的一组MMRs来处理这种信息交换。如图12所示,这些寄存器可以由CPU通过配置总线寻址。在完成对LSUn_REG5的写入之后,将为NREAD、NWRITE、NWRITE_R、SWRITE、ATOMIC或MAINTENANCE Rapid IO数据包启动数据传输。有些字段,例如Rapid IO srcTID/targetTID字段,是由硬件分配的,没有相应的命令寄存器字段。
其中各部分的含义为:
RapidIO Address MSB、 RapidIO Address LSB、 Xamsbs:为扩展地址所用,适用于 Packet Type 为 2、 5、 6 的包;
DSP Address: 32 位的 DSP 地址;
Byte_Count:读写的数据长度,最长为 4KB;
ID Size: RapidIO 接口使用 ID 的长度;
Priority: SRIO 包在传输过程中的优先级;
DestID:目的端设备的 ID;
Packet Type:指明了传输包的类型包括门铃包和数据包;
OutPortID:数据发送端口的 ID;
Drbll Info:指明使用 DoorBell 的 Doorbelln_ICSR(中断状态寄存器)以及配置门铃包的中断位;
Hop Count: Packet Type 为 8 的包的存在时间;
Interrupt Req:使能在 CPU 上产生中断请求;
BSY:表明 Command Register 的状态;
Completion Code:指明传输过程是否成功,或者指明出错的原因。
2.3.4门铃包操作
门铃操作如图26所示。它由门铃和响应事务组成(通常是DONE响应),处理元素使用它向其发送非常短的消息另一加工元件通过互连织物。门铃事务包含信息字段以保存信息,且没有数据有效负载。这个字段是软件定义的,可以使用为任何目的,用于信息字段的信息。接收A的处理元素门铃事务获取包并将其放入处理过程中的门铃消息队列中元素。这个队列可以在硬件或本地内存中实现。这种行为与那种类似典型消息传递邮箱硬件的。本地处理器将读取队列确定发送处理元素和info字段,并确定要采取什么操作。
门铃功能是用户定义的,但是这个包类型通常用于启动DSP核心(CPU)中断。门铃包与先前传输的特定数据包没有关联,因此包的info字段必须配置为反映要服务的门铃位,以便处理正确的TID(传输信息描述符)信息。
门铃包的16位信息字段指示要设置哪个门铃寄存器中断位。目前有4个门铃寄存器,每个寄存器有16位,允许64个中断源或循环缓冲区。关于DOORBELL_INFO字段的16位分配,请参见表1。每个位可以被分配到任何核如下所述的中断条件路由寄存器。此外,每个状态位都是用户为应用程序定义的。例如,如果控制数据使用高优先级(例如,高优先级= 2),而数据包按优先级0或1发送,那么最好支持每个核具有多个TID循环缓冲区的多个优先级。这允许控制包在交换结构中具有优先级,并尽可能快地到达。由于数据和控制包处理可能需要分别中断CPU,因此使用单独的循环缓冲区,并且门铃包需要区分它们以进行中断服务。如果设置了DOORBELL_INFO字段中的任何保留位,将发送错误响应。如果DOORBELL_INFO字段指示已经设置的中断位(ICSR),则发送重试响应。
3.CPU中断
SRIO外围设备支持以下中断:
·错误状态:表示到达运行时错误的事件。CPU应该复位/重新同步外围。
•临界错误:表示达到临界错误状态的事件。CPU应该重置系统。
•CPU服务:指示CPU应该为外围设备服务的事件。
3.1 中断条件状态和清除寄存器
中断条件状态和清除寄存器将基于外围活动配置如何生成哪些CPU中断,。导致CPU中断的所有外围条件都被分组,以便中断可以在尽可能少的寄存器读取中被访问。
对于三种中断类型(CPU服务、错误状态和关键错误)中的每一种,都有两组寄存器。
•中断状态寄存器(ICSR): 状态寄存器,反映每个可以触发中断的状态。
·中断条件清除寄存器(ICCR):命令寄存器,允许每个条件被清除。这通常是在启用条件之前需要的,这样就不会生成伪中断。
3.2 使用DOORBELL来产生CPU中断
具体步骤如下:
1. 配置Lsu中的doorbellInfo的值,这个值是由以下四部分组成的:
Reserved |
Doorbell Reg# |
Reserved |
Doorbell bit |
保留位 (不配置) |
Doorbelln_XXX(n=0,1,2,3) 此值说明使用哪个Doorbelln_XXX来配置DOORBELL |
保留位 (不配置) |
表示Doorbelln_ICSR的哪一位被置1,也就是ICS0-ICS15其中的哪个为1 |
2. 设置Doorbelln_ICRR 的值,Doorbelln_ICRR的值表示的是ICRx与INTDST的对应关系。
例如:Doorbell0_ICRR = 0x00000420,表示ICR0—> INTDST0,
ICR1—> INTDST2,ICR2—> INTDST4。
例如:Doorbell1_ICRR = 0x00000315,表示ICR0—> INTDST5,
ICR1—> INTDST1,ICR2—> INTDST3。
可以通过修改Doorbelln_ICRR的值,可以实现不同的映射关系,但每个核对应接收的中断路由号是唯一的。
Core 0 |
INTDST0 |
INTDST1 |
|
Core 1 |
INTDST2 |
INTDST3 |
|
Core 2 |
INTDST4 |
INTDST5 |
3. 一般Doorbell0_ICRR的设置如下:
Doorbell0_ICRR = 0x00000420
Doorbell1_ICRR = 0x00000531
可得到ICSx、 ICRx以及INTDSTn之间的映射关系如下:
Doorbelln_ICSR |
Doorbelln_ICRR |
ICRx值 |
中断目的号 |
目的核 |
ICSx |
ICRx |
0000b |
INTDST0 |
Core0 |
0001b |
INTDST1 |
|||
0010b |
INTDST2 |
Core1 |
||
0011b |
INTDST3 |
|||
0100b |
INTDST4 |
Core2 |
||
0101b |
INTDST5 |
|||
0110b |
INTDST6 |
Reserved |
||
0111b |
INTDST7 |
|||
1xxxb |
Reserved |
其中x 就是Doorbell bit的值。
4. 根据Doorbell Reg #的值,可知使用的是哪个寄存器Doorbelln_XXX。若Doorbell Reg# = 0,则使用Doorbell0_XXX来实现对Doorbell的配置。
SRIO的中断事件号有两个,分别是71和72。需要根据n的奇偶性来决定选用SRIO的中断事件号。若n为偶数,则使用中断事件号71来完成中断映射;若n为奇数,则使用中断事件号72来完成中断映射。