一个运用NoC访问片外GDDR6的例子
日益增长的数据加速需求对硬件平台提出了越来越高的要求,FPGA 作为一种可编程可定制化的高性能硬件发挥着越来越重要的作用。近年来,高端 FPGA 芯片采用了越来越多的 Hard IP 去提升 FPGA 外围的数据传输带宽以及存储器带宽。但是在 FPGA 内部,可编程逻辑部分随着工艺提升而不断进步的同时,内外部数据交换性能的提升并没有那么明显,所以 FPGA 内部数据的交换越来越成为数据传输的瓶颈。
为了解决这一问题,Achronix 在其最新基于台积电(TSMC)7nm FinFET 工艺的 Speedster7t FPGA 器件中包含了革命性的创新型二维片上网络(2D NoC)。这种 2D NoC 如同在 FPGA 可编程逻辑结构之上运行的高速公路网络一样,为 FPGA 外部高速接口和内部可编程逻辑的数据传输提供了大约高达 27Tbps 的超高带宽。
作为 Speedster7t FPGA 器件中的重要创新之一,2D NoC 为 FPGA 设计提供了几项重要优势,包括:
· 提高设计的性能,让 FPGA 内部的数据传输不再成为瓶颈。
· 节省 FPGA 可编程逻辑资源,简化逻辑设计,由 NoC 去替代传统的逻辑去做高速数据传输和数据总线管理。
· 增加了 FPGA 的布线资源,对于资源占用很高的设计有效地降低布局布线拥塞的风险。
· 实现真正的模块化设计,减小 FPGA 设计人员调试的工作量。
本文用了一个具体的 FPGA 设计案例,来体现上面提到的 NoC 在 FPGA 设计中的几项重要作用。这个设计的主要目的是展示 FPGA 内部的逻辑如何去访问片外的存储器。如图 1 所示,本设计包含 8 个读写模块,这 8 个读写模块需要访问 8 个 GDDR6 通道,这样就需要一个 8x8 的 AXI interconnect 模块,同时需要有跨时钟域的逻辑去将每个 GDDR6 用户接口时钟转换到逻辑主时钟。除了图 1 中的 8 个读写模块外,红色区域的逻辑都需要用 FPGA 的可编程逻辑去实现。
图 1 传统 FPGA 实现架构
对于 AXI interconnect 模块,我们采用 Github 上开源的 AXI4 总线连接器来实现,这个 AXI4 总线连接器将 4 个 AXI4 总线主设备连接到 8 个 AXI4 总线从设备,源代码可以在参考文献 2 的链接中下载。我们在这个代码的基础上进行扩展,增加到 8 个 AXI4 总线主设备连接到 8 个 AXI4 总线从设备,同时加上了跨时钟域逻辑。
为了进行对比,我们用另外一个设计,目的还是用这 8 个读写模块去访问 8 个 GDDR6 通道;不同的是,这次我们将 8 个读写模块连接到 Achronix 的 Speedster7t FPGA 器件的 2D NoC 上,然后通过 2D NoC 去访问 8 个 GDDR6 通道。如图 2 所示:
图 2 Speedster7t 1500 的实现架构
首先,我们从资源和性能上做一个对比,如图 3 所示:
图 3 资源占用和性能对比
从资源占用上看,用 AXI 总线连接器的设计会比用 2D NoC 的设计占用多出很多的资源,以实现 AXI interconnect 还有跨时钟域的逻辑。这里还要说明一点,这个开源的 AXI interconnect 实现的是一种最简单的总线连接器,并不支持 2D NoC 所能提供的所有功能,比如地址表映射,优先级配置。
最重要的一点是 AXI interconnect 只支持阻塞访问(blocking),不支持非阻塞访问(non-blocking)。阻塞访问是指发起读或者写请求以后,要等到本次读或者写操作完成以后,才能发起下一次的读或者写请求。而非阻塞访问是指可以连续发起读或者写请求,而不用等待上次的读或者写操作完成。在提高 GDDR6 的访问效率上面,阻塞访问会让读写效率大大下降。
如果用 FPGA 的可编程逻辑去实现完整的 2D NoC 功能,包括 64 个接入点、128bit 位宽和 400MHz 的速率,大概需要 850 k LE,等效于占用了 Speedster7t 1500 FPGA 器件 56%的可编程资源。而 2D NoC 则可以提供 80 个接入点、256bit 位宽和 2GHz 速率,而且不占用 FPGA 可编程逻辑。
从性能上来看,使用 AXI 总线连接器的设计只能跑到 157MHz,而使用 NoC 的设计则能跑到 500MHz。如果我们看一下设计后端的布局布线图,就会有更深刻的认识。图 4 所示的是使用 AXI 总线连接器的设计后端布局布线图。
图 4 使用 AXI interconnect 的设计后端布局布线图
从图中可以看到,因为 GDDR6 控制器分布在器件的两侧(图中彩色高亮的部分),所以 AXI 总线连接器的布局基本分布在器件的中间,既不能靠近左边,也不能靠近右边,所以这样就导致了性能上不去。如果增加 pipeline 的寄存器可以提高系统的性能,但是这样会占用大量的寄存器资源,同时会给 GDDR 的访问带来很大的延时。
如果再看一下图 5 中使用了 2D NoC 的布局布线图,就会有很明显的对比。首先,因为用 2D NoC 实现了 AXI 总线连接器和跨时钟域的模块,这就节省了大量的资源;另外,因为 2D NoC 遍布在整个器件上,一共有 80 个接入点,所以 8 个读写模块可以由工具放置在器件的任何地方,而不影响设计的性能。
图 5 使用 2D NoC 设计的后端布局布线图
从本设计的整个流程来看,使用 2D NoC 会极大的简化设计,提高性能,同时节省大量的资源;FPGA 设计工程师可以花更多的精力在核心模块或者算法模块设计上面,把总线传输、外部接口访问仲裁和接口异步时钟域的转换等工作全部交给 2D NoC 吧。