FPGA高速设计之Aurora64B/66B的应用与不足的修正
Aurora IP协议的特点
首先基于网上找到的一些资料,来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出,是由Xilinx提供的一个开源、免费的链路层串行传输通信协议,可扩展且轻量,可以实现点到点的串行数据传输。Aurora协议具有实现高性能数据传输系统的高效率和简单易用的特点。具体如下:
可扩展,轻量级:部署快捷,可在一个或多个高速串行通道上点对点传输;
链路层协议:独立于网络层,可直接传输工业标准协议封装的数据,例如TCP/IP、UDP等;
短距通信:针对芯片间和板间通信应用,通过标准光接口可用于设备间通信;
开源:免费使用和共享,可基于该协议标准开发独立应用。
Aurora 协议针对 FPGA 间的高速数据传输,能够为物理层提供透明接口。与 RapidIO、PCIE 等协议只支持固定的传输速率不同,Aurora 协议的传输速率可以进行灵活配置,支持速度为 0.75~13.1 Gbps,并可随着 FPGA 及其内嵌高速串行收发器的发展而进一步提高,可通过通道绑定的方法实现更高的数据传输速度。
Aurora 协议支持全双工和单工通道,使用的逻辑资源非常少,具有高带宽、无线帧尺寸和灵活组帧的特点。通过调用 Xilinx 公司的 Aurora IP 核,用户只需处理简单的用户接口即可,可以方便地实现器件间的单通道或多通道数据通信。
Aurora 总线协议包括物理层和数据链路层两层,最初采用了 8B/10B 编码方式,后续为了提高总线带宽利用率,Xilinx 公司于 2008年又采用了 64B/66B 编码。为了区分两种编码方式,采用 8B/10B 编码方式的 Aurora协议称为 Aurora 8B/10B;采用 64B/66B 编码方式的 Aurora 协议称为 Aurora 64B/66B 。
Aurora协议最大的优势即为开源和共享。Aurota协议为用户提供了一个透明的物理层接口,支持任何上层私有或符合工业标准的协议,如TCP/IP、以太网等,使得采用Aurora协议的高速串行总线接口能够在最短时间内与现有用户设计集成,而不大幅改动用户应用的设计。此外,Aurora协议也具有实现简单、占用物理资源少、通信效率高、速率可灵活配置等优点。
Aurora协议仍然具有不完善之处,如不具备地址机制,不支持通道切换功能,未规定数据有效载荷内校正等。Aurora总线的应用领域目前仍然局限于FPGA相关的通信,应用范围仍然不够广泛。
Aurora IP协议与应用
Aurora协议分为8B/10B版本(SP002)和64B/66B版本(SP011),主要介绍了五个方面的内容:
物理层:针对信号电平、时钟编码、编码和符号代码等进行介绍。
链路层:描述了在传输过程中如何标记用户协议数据单元(user PDUs)的整个过程,以及在传输期间如何在数据中插入数据暂停,以及如何管理发射机和接收机之间的时钟速率差异。
初始化和错误处理:定义了为跨单通道和多通道通信而准备通道Partners*所需的步骤。它还描述了通道Partners在通道中出现比特错误时应该如何处理。
数据分割:描述了数据如何被映射到一条由多个串行数据线组成的数据通道上。
流量控制:Aurora协议定义了链路层的流量控制机制,并提供了转发更高层用户流量控制消息的加速机制。
Aurora是一种简单,可扩展的开放式协议,支持下述或更多场景的应用:
芯片间通信:使用Aurora协议的通信总线为高速串行总线,相对传统IC间的并行总线,可大大减少硬件设计中的布线复杂度和布线层数;
板间通信:Aurora协议支持8B/10B编码或更高效率的64B/66B编码,使的Aurora可以与许多现有标准兼容。另外,aurora的数据传输率和通道个数是可自定义的,用户使用更加方便;
单工模式:Aurora协议支持单工模式,在不需要全双工通信的场景可节省更多布线资源。
ASIC设计:Aurora协议不仅仅应用于FPGA设计,还支持ASIC设计。Aurora的简单和开源特性使得它在FPGA和ASIC中都可以占用更小的资源和成本。
Aurora IP的配置
下图为vivado2018.3 KU+系列芯片中Aurora 64B/66B(不包括DRP重配置选项),IP的选项卡比较简洁明了,下面讲解下各个选项卡的作用。
- GT Type:KU+系列芯片拥有GTH,GTY两种GT口,其中GTY的速率较高32.75Gb/s,GTH仅有16.375Gb/s;
- Line Rate:高速收发器线速率,速率影响了高速收发器使用CPLL还是QPLL的输出作为参考时钟信号;
- Column Used:选择某一列GT口进行数据传输,与实际的FPGA的GT口位置相关,当前仅有left;
- Lanes:可以选择1~8lane进行高速传输,与器件相关;
- Start GT Quad/Lane:选择Quad与lane,当前器件2个Quad,8条lane;
- GT Refclk Selection:选择哪个Quad的时钟作为参考钟;
- GT Refclk MHz:高速收发器参考时钟频率;
- INIT clk:初始化时钟,对时钟来源没有要求,可以和DRP共用同一时钟;
- Generate Aurora without GT:不使用GT资源,只使用逻辑资源生成Aurora协议;
- Dataflow Mode:选择该IP工作模式,可选有仅发送、仅接收、收发单工,全双工,选择全双工模式可以进行环回实验;
- Interface:用户接口类型,Framing/Streaming前文分析过该IP支持两种用户接口,本文选择使用framing,即axi-stream数据格式 ;
- Flow Control:流量控制设置,支持两种流控模式,,简单情况下不使用流量控制传输;
- Little Endian Support:小端对齐。不勾选该选项时,图中数据信号的最高位是0,表示先传输高字节数据,采用大端对齐。勾选该选项后,数据位会颠倒,变成小端对齐,FPGA内部一般使用大端对齐,保持默认即可。
Aurora IP的第二个选项卡则为shared logic,可以将QPLL,时钟buffer等包含在IP中还是示例设计中,此处建议包含在example design,这样我们可以从示例工程学习到关键的时钟如何处理。
生成IP后,可在source-IP栏右键选择open example design。Xilinx官方的IP除了有配套手册外,还都提供了示例工程。通过手册得知IP的工作原理,通过示例工程去验证IP功能,然后在example design的基础上构建自己的代码。
Aurora IP的example design
打开示例工程后,会有一个工程与一个仿真,截图如下:
其中aurora_64b66b_0_exdes.v是一个完整收发模块,包含了协议层(aurora_64b66b_0_support.v),跨时钟同步设计(aurora_64b66b_0_cdc_sync.v),数据生成(aurora_64b66b_0_frame_gen.v)与检查(aurora_64b66b_0_frame_check.v),示例工程在TestBench中例化了两次该模块,即使用了两个高速收发器进行仿真,把高速收发器1的发送通道与高速收发器2的接收通道连接,从而形成数据闭环。
由于两个模块产生相同数据,在仿真时可以只关注一个收发器的接收和发送通道数据,就能够观察接收和发送数据是否正确,也可以第二个aurora中的GT设置为收发直连,形成数据闭环。直接运行仿真,可以查看如下的关键信号。
找到axis相关的tx,rx信号data,valid,ready,keep,last,可以看到信号收发正确,还有两个关键信号是channel_up与lane_up当这俩信号被拉低,表明GT初始化成功,才能看到数据的收发,仿真持续时间为34.8us。
Aurora IP的问题
当前在两片FPGA进行aurora通信时,我们采用了如上图的配置,RX侧user_clk=156.25MHz,在axis-stream模式下我们一般要使用一个异步FIFO来跨时钟域,问题来了user_clk=156.25MHz,但我们使用数据的频率仅为100MHz,这样无论多大的FIFO都会发生数据丢失的行为,因为我们无法利用axis_ready信号告诉前级,数据即将溢出,即aurora协议无法接收rx侧的axis_ready信号,从而产生接收数据丢失的风险。此处有两种办法:第一种是我们在接收信号的板子上引出一根ready信号,告诉前级数据不要再发数据了,因为axis_valid &&axis_ready同步拉高,前级的aurora才会发数,这样就相当于人为控制数据的收发,比较灵活。需要注意的是:在设计ready信号时需要关注从后级传到前级的时延;第二种方式则为Flow Control模式,可以通过NFC控制流量,让GT口暂停发数,最多可设置为256拍后才发数据,此方法适用于可以预知下级接收的FIFO什么时候会溢出,然后通过计数暂停发数。