基于FPGA的SRIO工程模块化提升设计
2021-10-20唐文武袁子乔
唐文武 袁子乔
(西安电子工程研究所 西安 710100)
0 引言
随着信息化时代的深入发展,信号处理系统往往需要具备极高的数据处理能力和传输能力,以满足信息的有效性与实时性。针对信号处理系统的传输性能要求,本文将着重介绍一种高速IO口——串行高速IO口(Serial Rapid I/O,SRIO)。RapidIO主要是一种基于数据包交换的互联体系结构[1],在处理器互连、存储子系统、通用计算平台等场合得到广泛应用。自2001年3月发布RapidIO1.1规范以来,RapidIO规范在不断迭代更新,传输速率也在不断提高,如今的RapidIO2.x规范已支持最高达6.25GHz的传输速率。RapidIO能够满足高性能嵌入式系统中板内多DSP与FPGA高速数据传输的技术要求,并克服传统互连模式存在的局限性,其在高性能嵌入式系统中的表现已得到业界的广泛认可。
本文旨在介绍SRIO接口及其协议,并重点介绍封装SRIO工程的必要性及自定义SRIO工程IP核使用问题,为此本文将按照如下章节安排进行论述:
1)第一节:对SRIO技术及其应用作简要概述,指出NREAD与SWRITE包包头格式。
2)第二节:介绍了本文对SRIO工程改进之处并进行仿真验证,最后介绍封装后的用户IP及其调用方法。
3)第三节:总结本次改进工作,提出待改善的问题。
1 SRIO技术及应用简介
串行高速IO口(Serial Rapid I/O,SRIO)是RapidIO标准的一种,其物理层数据传输过程是串行的。本文着重介绍串行RapidIO标准,即串行高速IO口(Serial Rapid I/O,SRIO)。串行RapidIO在数据传输中使用了串行差分信号传输的方式。这样的传输方式能有效地抑制干扰,提高传输距离,如图1所示,每个tx或rx代表一对差分信号线,数据包通过两根串行差分信号线进行传输。
图1 SRIO传输示意图
除了物理层之外,RapidIO还包含逻辑层和传输层,此三层协议共同构成RapidIO协议,对RapidIO协议有所了解有助于用户理解和使用,下面对SRIO协议做简要介绍。
1.1 RapidIO协议简介
RapidIO协议由逻辑层、传输层和物理层构成,为此互连技术提供相关的规范标准。RapidIO协议中逻辑层位于最高层,规定了包格式和所有的协议,为端点器件发起、完成事务提供了必要的信息。RapidIO支持直接IO/DMA和消息传递两类事务,其中直接IO/DMA事务又可分为NREAD(带响应的读事务)和SWRITE(流写事务)等。RapidIO协议规定在传输有效数据之前,需先传包头,包头包含了数据传输需要的相关信息,如定义格式类型的FTYPE字段,定义传输类型的TTYPE字段,一个完整的请求包和响应包包头格式分别如图2(a)和图2(b)所示。
图2 HELLO包包头格式
在工程应用中,用户只需了解逻辑层的各个字段含义即可。其中不同的FTYPE字段和TTYPE字段可唯一确定事务功能,下表1给出了工程中用到的NREAD模式和SWRITE模式HELLO包包头格式。
表1 逻辑层HELLO格式包包头
1.2 RapidIO技术在多通道高速数据传输中的应用
在高性能的嵌入式系统中,数据处理的快慢不仅取决于数字信号处理器(Digital Signal Processor,DSP)与FPGA处理能力[2-3],数据传输线路的传输性能也会影响到整个系统的效率。采用多通道并行传输的方式,可有效地提高数据传输速率、降低延时[4]。基于上述需求,本文提出以多通道(4X模式)SRIO互连技术作为作为数据传输方式,并采用其NREAD模式及SWRITE模式实现数据的有序分发,通过对FPGA中SRIO工程的模块化改进,实现更为高效的编程使用。
2 SRIO工程的改进与封装用户IP核
2.1 基于RAM的SRIO工程模块化设计
在雷达信号处理中,通常每秒需要几十至几百次运算[5],这无疑对数据吞吐量提出巨大挑战。为了提高传输效率,在本次改进工作中,我们规定SWRITE事务每次传输256字节数。其次,本文以简化双口RAM存储方式替代原先的FIFO存储,其优势在于与FIFO存储方式相比,RAM对存储单元是可寻址的,便于实现每写32个8字节数自动发送的功能,用户只需按照一定时序将数据写入RAM即可,不需要考虑何时发送及与发送相关的问题,极大地简化了使用过程。改进后的SRIO工程传输原理如图3所示。
图3 基于RAM的SRIO工程数据传输原理
2.2 SWRITE事务实现方法
SWRITE模式具有打包效率高、传输稳定的特点[6],对模块化设计的SRIO工程进行仿真时设立my_ireq_tlast信号,在每次传输至最后一个数据时将其拉高,因此两个相邻my_ireq_tlast脉冲的时间间隔即为完成一次数据包传输所消耗的时间。经过改进的SWRITE事务的用户数据写入时序如仿真图4所示。
仿真图时序关系为,当srio_init_done拉高时,表明SRIO初始化完成;此时用于时序控制的写使能控制计数器dv_cnt在RAM写时钟ram_wr_clk下开始累加。由图4可知,发送复位信号rst_send随着dv_cnt累加至一定值作周期性拉高数个ram_wr_clk;rst_send脉冲后延时2个写时钟,写使能dv_data_send拉高,8字节数data_send按照ram_wr_clk节拍写入RAM中;每写入32个data_send时,程序自动触发SRIO读取RAM数据并发送操作。
图4 SWRITE事务时序图
仿真中将SRIO的发送总线与接收总线相连,因此在正确传输数据时,数据接收总线data_send应接收到与数据发送总线val_treq_tdata_out上的数据。本次仿真中,发送数据按字节累加写入data_send,如图5(a)所示,data_send为一按字节递增数。在数据接收端val_treq_tdata_out上接收到与data_send相同的数据,如图5(b)所示,说明本此改进后的SRIO工程能正确地传输数据。
图5 仿真发送与接收的数据包
再观察数据包包头,按照协议,在每次传输256字节情况下SWRITE模式逻辑层包头应为0060_xffx_xxxx_xxxx,这里x代表未定数,各字段含义参照表1所示。根据仿真结果,如图6所示,发送数据第一包为包头,其值为0060_2ff0_0c30_0000,可知FTYPE字段的值为6,表明这是一个SWRITE事务。
图6 SWRITE请求事务包头信息
2.3 NREAD事务分析
为了对比不带响应的SWRITE事务与带响应的NREAD事务,本节将分析NREAD事务数据交换流程,确定两者差异,为工程应用提供参考。NREAD请求事务仅包含HELLO格式包头,包头提供了必要的信息,仿真结果显示其包头数据为xx24_2ff0_00c3_0000,x代表未定数,按照表1对应关系可知FTYPE字段为2,TTYPE字段为4,说明这是一个NREAD事物包,仿真结果如图7所示,val_ireq_tvalid与val_ireq_tready同时为高时,val_ireq_tdata上的数据即为包头数据。
图7 NREAD请求事务包头信息
NREAD事务的发起方提供数据交流所需的必要信息,目标方则需要对此进行响应,按发起方的要求将数据发送给发起方。响应事务HELLO格式包头类似于表1,响应事务的FTYPE=13,TTYPE=8。
在FPGA向DSP进行雷达数据分发时,若采用SWRITE事务类型,FPGA主动向DSP发送数据,数据分发效率较高,需要DSP进行及时处理;若采用NREAD事务类型,DSP主动向FPGA请求数据,在DSP处理性能较低或处理任务量巨大时可采用此事务类型。
2.4 封装SRIO工程
原SRIO工程可全面测试SRIO各项功能,并生成一些报告信息,其源文件较多,且源代码较混乱,不适用于实际工程。针对工程应用,在确保仿真各项逻辑无误且编译通过的情况下,本文改进工作简化了SRIO工程,去除冗余代码及模块,达到了提升工程模块化设计和提高应用效率的预期效果,工程包含了四个模块,分别为:
1)top_srio_app.v模块:工程的顶层模块,负责本地设备与远端设备进行信息交互,用户可通过该模块给SRIO核与RAM提供时钟、系统复位、数据写入与接收等操作;
2)srio_gen.v模块:工程的中间模块,作为顶层模块top_srio_app.v与底层请求/响应模块的数据与控制交换中心,并例化了SRIO IP核;
3)srio_request_gen.v模块:底层模块,用于接收srio_gen.v模块下传的数据与控制信号,并按照RapidIO协议产生与请求包相应的数据与控制信号;
4)srio_response_gen.v模块:底层模块,模块功能与srio_request_gen.v模块相似,只是其产生的是响应包的数据与控制信号。如前文所述,本次改进工作在SWRITE事务数据缓存上,采用了一个宽度64bit,深度512的RAM代替FIFO。
为进一步提高该工程的便捷性、可移植性,遵循“三化”原则,本文将改进后的SRIO工程在vivado环境下封装成用户IP核,封装后的IP核仿真工程结构如图8所示,对比封装前工程,封装后工程得到大幅简化,并且封装内部变量与模块,引出输入输出引脚供用户使用,实现了工程模块化设计。封装后的SRIO工程即为用户自定义IP核,其引脚图如图9所示,左侧信号是输入,右侧信号是输出。
图8 封装后的SRIO工程结构
图9 封装后的用户自定义IP核
本用户IP核控制逻辑与时序见2.2节,各引脚说明见表2所示。
表2 用户IP核引脚说明
使用本用户IP核时,需先将IP核拷贝到个人计算机,然后在vivado工程管理界面中添加该IP核至个人工程中,最后即可在IP目录下找到该用户IP核,双击调用即可。在使用中,为了避免丢包情况发生,在可接受范围内应尽可能降低写使能信号占空比。
3 结束语
本文按照“三化”要求,紧密结合工程应用现状,对FPGA中的SRIO工程进行改进,改进工作主要围绕以RAM存储方式取代FIFO以及SWRITE事务下每次写入32×8字节数自动触发发送过程,最后对改进的SRIO工程实行封装用户自定义IP核,致力于解决SRIO工程中信号定义及控制逻辑不统一,移植效率较低的问题。实际验证表明,本次改进工作取得良好的预期效果,但仍存在待解决的问题,如发送带宽从时序上及存储上有待优化,特别是在避免丢包漏包的问题上,可能存在更优的处理方案,以实现写使能信号占空比的最大化,进一步提高带宽。