作者:Gary Pan,AMD工程师;来源:AMD开发者社区
Ultra Accelerator Link (UALink) 是一种用于 AI 加速器之间芯片间互连和串行总线的开放规范。它由阿里巴巴、AMD、苹果、Astera Labs、AWS、思科、谷歌、惠普企业、英特尔、Meta、微软和 Synopsys 共同开发。
其首个规范将专门为可扩展网络提供互连。初始版本 200Gbps 的 UALink 规范基于 IEEE P802.3dj 200 Gb/s(超以太网)物理层。
UALink,每个系统节点由一个主机和所需数量的加速器组成,并由一个操作系统镜像进行管理。加速器可以使用多种互连协议(CXL、PCIe、XGMI、CHI c2c、Infinity Fabric)连接到主机。 UALink 交换机 (ULS) 可连接 AI“pod”内多达 1024 个加速器,每个加速器都被分配一个唯一的 10 位路由标识符。每个 UALink 交换机端口连接到一个不同的加速器。
如下图所示,一个UALink协议栈应包含:协议层(Protocol Layer),事务层(Transaction Layer),数据链路层(Data Link Layer),物理层(Physical Layer)。

正因为UALink的物理层,是基于以太网IEEE802.3设计并作了些许修改,本文将介绍用户如何利用例化Xilinx-AMD的DCMAC硬核IP来实现UALink的物理层部分。其上层部分,则应由用户的其它设计逻辑与软件驱动等自行设计完成。
1.利用DCMAC的Flex I/F接口模式产生相应IP核
UALink的物理层,基本保留了以太网802.3协议的内容;两者最大的区别,是Alignment Marker的填充。UALink协议简化掉了原以太网里的20个PCS Lanes部分,并定义了自己的AM覆写在每块的开头位置,如下结构图:

因此,我们可以利用DCMAC的Flex接口,选择(ctl_tx_flexif_select/ctl_rx_flexif_select = 2’b01)这个模式,来产生DCMAC硬核IP,然后由用户自己提供UALink所定义的AM数据,以及其它普通64B/66B数据,然后由DCMAC IP完成后续的扰码,Transcode,RSFEC等步骤。IP产生过程如下:
1)在Vivado工具中新建工程,产生DCMAC IP选择Independent MAC and PCS + FEC模式

2)然后,设置ctl_tx_flexif_select/ctl_rx_flexif_select = 2’b01,即利用下面框图中的FlexE/B00G OTN这条通路,用户只需要提供64B/66B数据给IP
(注:现成的IP可能缺省设置的正是这个模式,所以不用特意修改;用户需自己确认模式是否选择正确)

3)右键产生IP example design
(此处建议用户直接跑一下example的Functional Simulation,熟悉并参考下IP的初始化流程,以及收发数据的使用)
2. Flex I/F接口模式下的数据格式
在此模式下,用户收发的数据,为64B/66B数据;其具体格式,应当参考DCMAC文档PG369里的记载,详细解释如下:
例如,用户在tx/rx_flexif_data0收发数,“2 78 00 00 00 00 00 00 00”,按照64B66B编解码表定义,这里开头的2或1表示该数为控制字还是普通数据;如果是2,则表示控制字。
注意,这里用户填给DCMAC IP的所有数据,需要bit位级倒序,才能正确理解。
因此,这个数下一个类型78,实际上倒序后为1e,后面全0,按照编解码表,这是一个典型的IDLE。
而图中第二拍,第二个数,“2 1e aa aa aa aa aa aa bb”,实际上是控制字并且Type倒序后从1e变为78,按照64B/66B编解码表,这是一个以太网数据包的Start,后面的数据也对应倒序为d5555555555555前导码。
也就是说,下图中的下半部分,就是上半部分的数据倒序结果,可以理解为平时看到的数据顺序。再比如第三拍的第一个数,“1 a8 4e 42 cd 06 31 e9 44”,第一个1表示普通data,而不再是控制字,所以就没有Type了,由下半部分图看到,后面倒序后的实际数据为“22 97 8c 60 b3 42 72 15”。

UALink的(AM) Flit Code Sequence由20个Type=78,data为全F的64B/66B控制数,加上60个Type=1e,data全0的IDLE组成。
因此,用户可以倒序后,给DCMAC发数,20个“2 1e ff ff ff ff ff ff ff”和60个“2 78 00 00 00 00 00 00 00”,就组成了一个UALink的Alignment Marker。
3. 如何将你自己写的AM对齐并起效
通过上述章节的介绍,你已经会利用DCMAC,作为UALink的物理层进行工作,收发数据了。
然而,最后还有一个问题需要注意,当用户按照DCMAC文档要求,周期性拉高tx_flex_amflag,并同时提供自己的AM数据后,IP并不会马上起效。此时,需要额外做一下tx_serdes_reset,然后手动提供的AM才能实际对齐发送。
也就是说,实际上,IP内部也在自己周期性的发送AM,它并不会每时每刻去对齐用户拉高的amflag,只有在做了tx_serdes_reset后,IP才会对齐下一个amflag及其AM数据。
下图为利用IP example做的功能仿真,解释了这一行为。

总之,通过以上方式,用户就可以利用DCMAC硬核IP,实现UALink的物理层,并为其整个UALink上层设计提供基础。