电子说
CXS (Credited eXtensible Stream)是一个流接口协议,主要用于点到点(point-to-point)的数据包通信。CXS接口的主要使用情形是在片上互连和PCIe控制器。CXS中的数据传输是单向的,因此一般CXS接口是收/发成对出现的。
看到这里,是不是想起了什么?没错,就是AXI-Stream,同样也是点到点的流接口传输,比如中断控制器GIC的组件之间就采用了AXI-Stream。AXI-Stream在 FPGA中应用较多,尤其是多媒体领域。
CXS接口的数据传输是单向的,两端是Transmitter(TX)和Receiver(RX)。一个时钟周期内传输的数据称作flit。一个数据包可以占用一个或多个flit组成。
CXS的接口信号分为两部分,一部分是必须包含的,另一部分是可选信号。其中必须实现的信号如下(以下用正粗体表示信号,斜粗体表示属性):
从接口信号上看,并没有READY信号,也就是说CXS不像其它的AMBA总线,比如AXI,是通过“VALID - READY”来控制流量。
正如名字中的含义,CXS接口上的流量控制(flow control)通过信用交换机制实现。其信用机制规则如下:
正常情况下,TX发送一个flit给RX,同时消耗一个信用值;RX接收到flit,如果有能力接收更多的flit,则可以授予TX一个信用值;随后,TX得到新的信用值。从TX消耗信用值到得到新的信用值,这段时间称为信用延迟(credit latency)。为保证TX能够源源不断的发送数据,则需要设计好最大可用的信用数量,以保证不会由于信用延迟造成的断流。
CXS接口的属性包括以下:
其中,TX和RX的属性可以单独设置。
CXS的完整接口信号列表如下:
其中,CXSLAST用于连续传输;CXSPRCLTYPE用于支持多种协议类型。
当CXSCHECKTYPE 属性被设置成Odd_Byte_Parity,CXS接口上会增加额外的信号线,用于增强接口信号的完整性。对于单bit信号线,增加一个bit,比如 CXSVALID ,增加一个信号 CXSVALIDCHK ;对于多bit信号,每8bit增加一个信号,比如256-bit的 CXSDATA ,增加一个32-bit信号 CXSDATACHK 。增加的信号与原信号相加为奇数。
CXS对每个flit中的数据包放置进行了限制,以简化数据路径实现:
CXSCNTL信号总线可以分为五个字段,分别为:START,START[N:0]PTR,END,ENDERROR和END[N:0]PTR。下面分别解释。
下图给出CXSCNTL信号的组成示例。当属性 **CXSMAXPKTPERFLIT ** = 4,属性 **CXSDATAFLITWIDTH ** = 512时,CXSCNTL信号共有36-bit。
CXS接口传输满足以下要求的数据包大小需满足:
如果CXS用于CCIX数据包传输,需要遵守CCIX的约定。
协议中给出了数据包传输的例子,看一个比较复杂的示例。属性 ***CXSMAXPKTPERFLIT *** = 4, ***CXSDATAFLITWIDTH *** = 512, ***CXSCONTINUOUSDATA *** = true,Protocol 0用于可变长数据包,Protocol 1用于固定长64-byte数据包。在Protocol 0中,P0D和P0E分组必须保持在一起;在Protocol 1中,P1B和P1C分组必须保持在一起,P1E,P1F和P1分组必须保持在一起。
当属性 **CXSLINKCONTROL _ ** = Explicit *Credit *Return,CXS接口上会多出一组信号, CXSCRDRTN , CXSACTIVEREQ ,CXSACTIVEACK和 CXSDEACTHINT 。
其中 CXSACTIVEREQ ,CXSACTIVEACK实现四相位的握手机制。握手机制共分为四种状态:
四种状态转换的关系如下图:
TX始终负责启动从RUN到STOP,或从STOP到RUN的状态更改,例如:
当接口的一方同时执行两个操作时,即存在竞争条件。CXS规范允许数据流和链路控制信号组之间存在不同的延迟。因此,到达时的操作顺序可能与发出的顺序不同。竞争条件之所以会存在,是因为不要求CXSACTIVEREQ和CXSACTIVEACK信号不需要在TX和RX之间的其它信号具有相同的延迟。
CXS接口信号间的时序关系如下。
来看一个例子。
某些情况下,CXS通道不能中断数据流,例如PCIe。这时,需要TX和RX实现一个存储转发(store-and-forward)buffer。
如果RX内置了这个buffer,数据包可以被下游完整接收。RX必须有足够的空间来存储TX所能发送的最大数据包。这种情况下,TX和RX可以设置属性 *** CXSCONTINUOUSDATA * ** = False。TX无需缓存数据包。
如果RX没有缓冲区并且需要连续数据,则它会将** *CXSCONTINUOUSDATA *属性设置为True,并且TX也必须将 *CXSCONTINUOUSDATA ***设置为True。然后,TX必须能够在不依赖其它接口的情况下发出数据包内的所有flit。
如果需要连续流量,必须确保RX有足够的信用来覆盖最坏情况下的往返信用延迟:
RX可以发出的最大信用数取决于其缓冲区的大小,可以通过其** CXS MAX *CREDIT ***属性来描述。
如果下游接口的时钟比CXS链路慢,则可能不需要每个周期发送一个flit。在这种情况下,RX保持恒定流量所需的信用数可能小于往返延迟。
全部0条评论
快来发表一下你的评论吧 !