xucvai · 5月31日

AMBA CXS协议 长文解析,建议收藏

Introduction

CXS协议可用于任意点对点的数据包通信,基于steam方式,使用宽带接口,可用于向高速外部接口传递数据包。宽带接口可以将多个数据包合并为单一传输。CXS接口的主要使用场景是在芯片上的互连和PCIe控制器之间传输数据包。CXS的数据传输是单向的,因此在通信块之间通常存在一对CXS接口。图1-1展示了一个典型的CXS实现,它在两个CXS接口上传输CCIX和CXL数据包。

image.png

CXS operation

每个CXS接口由一个TX连接到对端的RX,数据单向传输。每个周期传输的数据称为一个数据块(flit),一个数据包可以占用一个或多个数据块。一个CXS必须要的接口信号如下:

image.png

  • 所有输入和输出信号都基于CLK的上升沿。
  • 接口上输入和输出信号之间不能存在组合路径。
  • 复位信号RESETn是低电平有效,异步复位,同步撤离。
  • 在复位期间,链路的控制信号均置低无效:

    • CXSVALID
    • CXSCRDGNT
    • CXSCRDRTN
    • CXSACTIVEREQ
    • CXSACTIVEACK
    • CXSDEACTHINT
  • 在复位期间,所有信用点都在链路的接收端。

TX通过驱动CXSDATA,将数据包控制信息放置在CXSCNTL上,并使能CXSVALID信号来传输数据。CXSRDGNT用于RX向TX传递credit。和AXI协议的ready-valid握手机制不同,CXS采用一种基于信用的握手,TX端只有足够的credit时,才可以发送数据。TX端的credit由RX端发送,这和PCIE基于credit的流控类似,但传递credit的方式不同。

信用交换机制

接口通过信用交换机制实现流量控制。信用机制的规则包括:

  • TX只有在RX至少授予一个信用时才能发送数据。
  • 当接口被复位或首次使能时,TX没有信用,不能在接口上发送数据。
  • 使用CXSCRDGNT信号将信用授予TX。
  • 当CXSCRDGNT信号置1时,每个周期向TX传输一个信用。每个信用允许传输一个flit。
  • RX必须保证它能够接收每个授予信用的一个数据块。
  • TX在拉高CXSVALID信号时,每个周期发送一个数据块,并消耗一个信用。
  • RX可以授予TX的最大信用数由CXS_MAX_CREDIT属性指定。
  • 如果接口是可配置的,TX必须能够记录CXS_MAX_CREDIT数量的信用。
  • 如果接口不可配置,TX必须能够记录15个信用。
  • TX不能在CXSCRDGNT信号被断言的同一周期内使用信用发送数据块。CXSCRDGNT和CXSVALID信号之间不要有组合路径。
  • 也可以不传输数据块,使用CXSCRDRTN信号将信用返回给RX。当CXSCRDRTN信号使能时,每个周期向接收器返回一个信用。CXSCRDRTN和CXSVALID信号不得在同一周期内有效言。
  • RX不能在CXSVALID信号或CXSCRDRTN信号使能的同一周期内重用已消耗或已返回的信用。CXSVALID和CXSCRDGNT信号之间,或CXSCRDRTN和CXSCRDGNT信号之间不要有组合路径。
  • 如果TX在接收信用的同一周期内返回或使用信用,则可用信用的数量不会改变。

一个典型的连接和时序如下:

image.png

a时刻,解除复位,b时刻开始,连续两个时钟周期RX授予TX两个credit,c时刻TX有可用credit,发送数据包f1和f2。发送f2之后,credit被用完,d时刻RX再次授予TX一个credit,因此在d时刻的下一个时钟周期,TX发送f3数据包。

CXS接口属性

CXS接口可以通过属性配置来实现具体的应用。主要的参数属性如下:

  • CXS_LAST,配置为false时,接口不存在CXS_LAST信号,配置为true则存在。默认为false。该信号指示当前数据包是否可以插入其他flit。该信号一般和数据包的连续传输有关,参见后续内容。
  • CXS_MAX_CREDIT,RX可以支持的最大信用值,默认为15。支持1~63范围可配置。
  • CXS_MAX_CREDIT_LATENCY,最大信用latency。对TX而言,有flit需要发送时,TX收到CXSCRDGNT到置位CXSVALID的delay。对于RX而言,表征credit重复使用的延迟,即收到TX发送的CXSVALID之后,到置位CXSCRDGNT的delay。支持1~16范围可配置。
  • CXS_PROTOCOL_TYPE,默认位false,接口不存在CXSPRCLTYPE信号。设置为true时,用于指示当前数据包的protocol类型。当CXSMAXPKTPERFLIT=1时,该参数需要设置为false。
  • CXSCHECKTYPE,默认为false,不进行接口信号的奇偶校验。设置为true时,接口信号会引入额外用于校验的信号。

image.png

  • CXSCONTINUOUSDATA,默认为false。设置为true时,需要credit足够多,以支持数据包的连续发送。
  • CXSDATAFLITWIDTH,数据包的数据宽度,默认为256,支持8~2048范围可配置,但必须要为8的倍数。
  • CXSLINKCONTROL,默认为None,不存在link的控制信号组。设置为Explicit_Credit_Return时,接口信号包含额外的控制信号:CXSACTIVEREQ,CXSACTIVEACK,CXSDEACTHINT,CXSCRDRTN。

image.png

  • CXSMAXPKTPERFLIT,每个flit中最大支持的pkt数。CXSMAXPKTPERFLIT大于1时,CXSDATAFLITWIDTH只能是256, 512, 或者 1024。CXSDATAFLITWIDTH是256时,CXSMAXPKTPERFLIT只能是1 或 2。CXSMAXPKTPERFLIT为1,CXSCNTLWIDTH = 0,CXS_LAST = False,CXS_PROTOCOL_TYPE = False,CXSCONTINOUSDATA = False。

连续数据包传输

CXS协议支持数据包的传输,这些数据包在通过不同通信层之后必须保持连续不被打断。CXSLAST信号的作用是指示是否可以在当前周期之后插入数据链路层信息的数据块。当CXSLAST信号无效时,RX必须连续接收TX数据包,并且在等待周期内不能插入来自另一个源的数据包。

CXSLAST信号必须在如下情况中设置为0:

  • 当前数据包之后必须紧跟着另一个数据包。
  • 如果当前周期内有一个未完成的数据包。

CXS_LAST属性用来指示链路接口是否支持连续数据包。CXS_LAST可以有以下值:

  • True:接口包括CXSLAST信号。
  • False:接口不包括CXSLAST信号。

如果CXS_LAST属性未声明,则假定为False。

多协议流传输

CXS允许在相同链路上传输携带不同协议的数据包。CXSPRCLTYPE是一个可选信号,用于指示数据块的协议类型。

当在CXS链路上交织传输来自不同协议的数据包时,需要遵守以下规则:

  • 使用多个flit传输的CXS数据,每个flit的类型相同。
  • 如果一个flit包含多个数据包,则每个数据包必须具有相同的协议类型。
  • 如果CXSCONTINUOUSDATA为False,则可以在任何周期交织不同协议类型的数据块。
  • 如果CXSCONTINUOUSDATA为True,则在CXSLAST为高之后才能改变协议类型。

CXS_PROTOCOL_TYPE属性用来指示链路接口是否支持协议类型指示器,它可以有以下值:

  • True:接口包括CXSPRCLTYPE信号。
  • False:接口不包括CXSPRCLTYPE信号。如果CXS_PROTOCOL_TYPE属性未声明,则假定为False。当CXSMAXPKTPERFLIT =1时,CXS_PROTOCOL_TYPE必须为False。

表2-5 CXSPRCLTYPE信号定义
image.png

CXS packets

数据包位置约束

CXSMAXPKTPERFLIT 指定了一个 flit 中可以包含的数据包的最大数量。在一个 flit 中,可以开始多达 CXSMAXPKTPERFLIT 个新的数据包,并且可以结束多达 CXSMAXPKTPERFLIT 个数据包。每个 flit 中数据包的最大数量,包括任何在前一个 flit 中开始并且在当前或后续 flit 中完成的数据包。

CXS 对每个 flit 中数据包的放置有特定的限制:

当 CXSMAXPKTPERFLIT 为 1 时:

  • 数据包开始于 CXSDATA 的第一个字节。
  • 数据包结束于 CXSDATA 的最后一个字节。
  • 数据包不会跨越多个 flit。

当 CXSMAXPKTPERFLIT 大于 1 时:

  • 数据包的第一个字节必须放置在 16 字节对齐的边界上。
  • 数据包的后续字节占用 flit 的后续字节。
  • 数据包可以结束在任何 4 字节对齐的边界上。
  • 从某个字节位置开始的数据包将占用该 flit 中的每个后续字节,直到数据包结束或 flit 结束。
  • 如果在 flit 结束时数据包还有剩余字节,该数据包将从下一个 flit 的字节[0] 开始,并占用每个后续字节位置,直到数据包结束或 flit 结束。
  • 当数据包在 flit 内结束时,flit 中剩余的字节不使用。
  • 任何 flit 中的数据包必须开始于相对于 flit 开始或前一个数据包结束的第一个可用的 16 字节边界。

数据包控制字段

image.png

数据包控制字段结构

表4-2 展示了对于所有CXSMAXPKTPERFLIT和CXSDATAFLITWIDTH组合的数据包控制字段的宽度和位置信息。以下是针对不同组合的详细字段宽度和位位置的说明:

image.png
image.png
image.png
image.png
image.png

数据包示例

CXSDATAFLITWIDTH = 256, CXSMAXPKTPERFLIT = 2, CXSCONTINUOUSDATA = True

image.png

cycle1: 只包含一个数据包,数据包未占满256bit

cycle2: 包含两个数据包,TLPB未占满128bit, TLPC需要从16 byte对齐的位置存放。

cycle3: 没有数据包传输

cycle4~cycle7:TLPD占用两个连续的flit,cycle4未完成的TLPD从cycle5的byte0开始。TLPE需要从cycle5的16byte对齐的位置开始存放,并连续占用后续cycle6和cycle7。

CXSDATAFLITWIDTH = 512, CXSMAXPKTPERFLIT = 4, CXSCONTINUOUSDATA = True

image.png

CXSDATAFLITWIDTH = 512, CXSMAXPKTPERFLIT = 4, CXSCONTINUOUSDATA = True with TLP Order

Protocol 0 的P0D and P0E需要保持连续传输。Protocol 1 的连续传输要求: • P1B and P1C • P1E, P1F, and P1G

image.png

cycle3: 该cycle传输P1B,由于P1B和P1C需要连续传输,因此cycle3的wlast为0,表示不能插入其他的flit。cycle4传输P1C, cycle4的wlast为1,后续可以插入其他的flit。

cycle7~cycle10:由于P0D和P0E需要连续传输,因此cycle7的wlast=0,而且cycle8传输P0E。由于P0E需要占用cycle8~cycle10,因此该3个cycle的wlast都为0,表示不能插入其他的flit。

CXSDATAFLITWIDTH = 512, CXSMAXPKTPERFLIT = 4, CXSCONTINUOUSDATA = False with TLP Order

image.png

cycle3: 该cycle传输P1B,由于P1B和P1C需要连续传输,因此cycle3的wlast为0,表示不能插入其他的flit。由于CXSCONTINUOUSDATA=False,因此不要cycle4一定传输protocol 1的数据包,但下一个传输P1的数据包一定是P1C, 即cycle5。

CXS interface activation and deactivation

接口控制与显式信用返回

CXS接口可以选择性地配置,以包含用于激活(activation)和停用(deactivation)的信号,使用CXSLINKCONTROL属性进行设置。该属性可以设置为None或Explicit_Credit_Return。

当CXSLINKCONTROL属性设置为None时,接口没有用于activation和deactivation的信号。此设置要求Receiver在有可用信用点时必须始终发送,而Transmitter也必须始终准备好接收。

当CXSLINKCONTROL属性设置为Explicit_Credit_Return时,向接口添加了如表5-1所示的信号。

表5-1 显式信用返回的链接控制信号
image.png

请求与确认握手

请求和确认握手使用CXSACTIVEREQ和CXSACTIVEACK作为主要信号。

TX在能够发送数据块之前需要获得信用点。当RX有资源可接受数据块时,会向前发射器传递信用。

  • 在退出复位时,所有信用点都由RX持有,并且在开始传输数据块之前,至少必须向TX传递一个信用点。
  • 在正常操作期间,接口两侧会持续交换flit和信用。
  • 在进入低功耗状态之前,必须停止发送有效载荷数据块,并且必须将所有信用点返回给接收器。

接口操作定义了四个状态:

STOP(停止)

  • 接口在STOP状态下不运行。所有信用点都由RX持有。
  • STOP是一个稳定状态。当进入此状态时,信道可以无限期保持在此状态。
  • RX保证不会接收数据块或信用返回。它不得发送信用。
  • TX不会收到信用。它不得发送数据块或信用返回。
  • 当TX有待发送的数据块时,它可以从STOP状态转换到ACTIVATE状态。

ACTIVATE(激活)

  • 此状态用于从STOP状态过渡到RUN状态。
  • 预期当进入此状态时,信道会在相对较短的时间内移动到下一个稳定状态。
  • TX必须接受信用,但在RUN状态之前不能发送数据块。
  • RX保证不会接收数据块或信用返回。
  • RX在ACTIVATE状态下不允许发送信用点。它被允许在进入RUN状态的同一周期内发送信用。由于潜在的竞争条件,因此TX可能在处于ACTIVATE状态时收到信用。

RUN(运行)

  • 此状态在两个组件之间持续交换数据块和信用。
  • RUN是一个稳定状态。当进入此状态时,信道可以无限期保持在此状态。
  • RX可以发送信用并接收数据块或信用返回。
  • TX可以发送数据块并接收信用点。
  • TX可以由于多种原因从RUN状态转换到DEACTIVATE状态,例如,当它没有数据块要发送。

DEACTIVATE(停用)

  • 此状态用于从RUN状态过渡到STOP状态。
  • DEACTIVATE(停用)是一个过渡状态。预期当进入此状态时,信道会在相对较短的时间内转移到下一个稳定状态。
  • TX在进入此状态之前必须停止发送数据块。由于潜在的竞争条件,RX在此状态下仍有可能接收到数据块。
  • RX在进入此状态时可以发送信用。它必须及时停止发送信用,以允许所有信用返回给RX。
  • RX可以接收信用的返回。
  • TX必须发送信用返回,以允许所有信用点返回给RX。
  • 只有当所有信用都已返回时,RX才能退出此状态并转移到STOP状态。

image.png

对新状态的响应

如果状态变化是由接口的另一端发起的,那么组件在转移到新状态时可能需要改变其行为。如果状态变化要求组件停止发送数据块或信用,则组件在响应时有一定的时间。TX始终负责从RUN状态发起到STOP状态的状态变化,或者从STOP状态到RUN状态。可以通过以下几种机制检测到这种状态变化要求:

  • TX可以确定它有数据块要发送,因此必须从STOP状态移动到RUN状态。
  • TX可以确定它在相当长的一段时间内没有要执行的活动,因此可以从RUN状态移动到STOP状态。
  • TX可以观察到一个独立的边带信号,指示它应该从RUN状态移动到STOP状态,或者从STOP状态移动到RUN状态。
  • TX可以观察到来自接收器的CXSDEACTHINT信号,并决定从RUN状态移动到STOP状态。

Race conditions

条件发生在接口的一侧同时或几乎同时执行两个动作时。CXS允许数据流和链路控制信号组之间存在不同的延迟。因此,到达的动作顺序可能与发出的顺序不同。

  • RX使能CXSACTIVEACK信号,从ACTIVATE状态转移到RUN状态,并开始发送信用:
  • RX允许在使能CXSACTIVEACK信号的同一周期内使能CXSCRDGNT。
  • 信用可能在传输器的本地CXSACTIVEACK信号被断言之前被接收。
  • 因此,传输器在处于ACTIVATE或RUN状态时必须接受信用。
  • TX停止发送数据块,然后取消CXSACTIVEREQ信号,从RUN状态转移到DEACTIVATE状态:
  • TX在取消CXSACTIVEREQ信号时不得发送数据块。
  • 一个在传输中的数据块可能在接收器的本地CXSACTIVEREQ信号被取消之后被接收。
  • 因此,RX在处于DEACTIVATE状态时必须接受数据块,并且只有在所有信用都已返回时才能移动到STOP状态。

数据与链路控制信号之间的时序关系

以下信号必须同步且具有相同的延迟:

  • CXSVALID
  • CXSDATA
  • CXSCNTL
  • CXSCRDRTN

以下信号必须同步:

  • CXSCRDGNT
  • CXSACTIVEACK
  • CXSDEACTHINT

以下信号必须同步驱动,但可以异步捕获:

  • CXSACTIVEREQ

CXSACTIVEREQ信号是个例外。在STOP状态下,接收器中的时钟可能会由于时钟门控而停止。CXSACTIVEREQ信号的断言可能被用来重启该时钟。在STOP状态下,传输器和接收器之间的触发器可能也在接收器的时钟域内,并且也会被时钟门控。CXSACTIVEREQ信号可能需要在传输器和接收器之间具有组合路径。由于距离和接口所需的频率,这个路径可能是多周期的。因为CXSACTIVEREQ和CXSACTIVEACK信号参与了一个四阶段握手,并且可以异步运行。

因此,接收器必须将CXSACTIVEREQ信号视为异步信号,并通过适当的同步逻辑运行,以避免在使用前产生亚稳态。

Interface activation and deactivation examples

  1. 在周期0中,发射器和接收器都处于STOP状态。双方可能被时钟门控或关闭电源。
  2. 发射器在周期2中断言CXSACTIVEREQ并进入ACTIVATE状态。
  3. 接收器在周期5唤醒并断言CXSACTIVEACK。
  4. 在本例中,CXSCRDGNT与CXSACTIVEACK在同一周期被断言。
  5. 收到信用点后,发射器在周期6发送一个数据块。
  6. 只要接收到信用点,发射器就继续发送数据块。

image.png

图5-4展示了与前例相同的情况,但是在CXSACTIVEACK信号路径上,接收器和发射器之间的延迟比CXSCRDGNT路径上的延迟更多。由于额外的延迟,发射器在ACTIVATE状态下就收到了信用点。然而,发射器在CXSACTIVEACK信号在周期5变为高电平并且进入RUN状态之前,不能发送数据块。
image.png

图5-5展示了一个接口停用的例子。链路的两侧都从RUN状态开始。发射器没有更多的数据块要发送,并决定停用接口。发射器取消断言CXSACTIVEREQ信号,使接口进入DEACTIVATE状态。发射器有一个非零的信用计数,因此它通过断言CXSCRDRTN来返回信用点。

接收器在继续授予几个周期的信用,直到它意识到链路正在被停用。发射器也必须返回额外的信用,在信用点计数变为零之前持续断言CXSCRDRTN。只有在接收器拥有所有信用点并且没有悬而未决的信用点授予时,接收器才能取消断言CXSACTIVEACK信号。只要发射器还有信用点,它就永远不会看到CXSACTIVEACK信号被取消断言。

image.png

CXS packet continuous delivery guarantees

一些CXS实现具有不能断流的下游接口,如PCIe。如果接收器(Receiver)或发送器(Transmitter)之一具备存储与转发(store-and-forward)缓冲区,那么可以通过CXS接口实现不间断的数据流。

如果接收器设计有存储与转发缓冲区,必须在数据包完全接收后才能通过下游接口转发。接收器需要有足够的缓冲空间来存储发送器可能发送的最大数据包。在这种情况下,接收器和发送器可以将CXSCONTINUOUSDATA属性设置为False,且发送器不需要对数据包进行缓冲。

如果接收器没有缓冲区并且要求连续数据流,则它会将CXSCONTINUOUSDATA属性设置为True,并且连接的发送器也必须将CXSCONTINUOUSDATA设为True。此时,发送器必须能够在不依赖于其他接口的情况下,发出数据包内的所有数据。发送器还必须确保不会在数据包部分但非全部数据已发送时尝试断开链路。

当需要连续数据传输时,集成者必须确保接收器有足够的信用(credit)来覆盖最坏情况下的往返信用延迟,这包括:

  • 从接收器到发送器的CXSCRDGNT信号延迟。
  • 当发送器因等待信用而暂停的数据包存在时,CXSTXCRDGNT与CXSTXVALID之间的最大内部延迟。这由发送器的CXS_MAX_CREDIT_LATENCY属性描述。
  • 发送器与接收器之间的CXSVALID信号延迟。
  • 接收器内部CXSRXVALID至CXSRXCRDGNT之间的最大延迟,由接收器的CXS_MAX_CREDIT_LATENCY属性描述。

接收器能发布的最大信用数量取决于其缓冲区的大小,可通过其CXS_MAX_CREDIT属性来描述。

作者:验证芯发现
文章来源:验证芯发现

推荐阅读

更多Arm AMBA 协议集技术干货请关注Arm AMBA 协议集技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
7910
内容数
82
Arm AMBA协议集,APB,AHB,AXI,CHI等相关公开课回放及文章
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息