Xilinx基于PCIE的部分重配置实现

[复制链接]
966|0
手机看帖
扫描二维码
随时随地手机跟帖
zhangmangui|  楼主 | 2019-4-12 23:16 | 显示全部楼层 |阅读模式
本博文主要是对基于PCIE(mcap)的部分可重构实现的步骤做一个简单的演示,如有错误之处,欢迎批评指正。值得说明的是,基于PCIE的部分可重构需在ultrascale系列及ultrascale+芯片才能实现,具体哪些系列能实现哪种配置方式如下图所示:

1000007122-6367392579606766354359079.jpg
  图1
        本质上来说,无论是JTAG还是ICAP或者MCAP以及其它FPGA的配置方式,目的都是配置FPGA的逻辑。MCAP是通过PCIE来实现对FPGA的烧写,最终结果和使用JTAG进行FPGA烧写没有区别,而使用PCIE对FPGA烧写有更好的灵活性,在某些需求场合是必不可缺的,譬如在数据加速的部署,FPGA加速板卡是位于服务器端,在服务上线之后修改FPGA业务逻辑的话如果使用JTAG烧写,一方面操作十分不便,可行性极低,另一方面,重新烧写FPGA会导致原FPGA的PCIE设备从服务器中删除,需要重新启动服务器枚举设备(目前本人没有找到可以进入系统后重新枚举设备的方法),对于已经上线的服务器,在每次切换FPGA业务逻辑后重启服务器是无法接受的,因此,使用PCIE对FPGA的部分重配置就十分必要,部分重配置能够在保持FPGA静态逻辑(PCIE部分和其他非业务逻辑)正常工作的情况下动态修改某个区域的逻辑(业务逻辑)。使用这种技术能够不重启服务器情况下快速切换业务逻辑。
本文的实现基于Xilinx的VCU1525加速板卡实现,VCU1525的FPGA是一颗ultrascale+的VU9P,由上图可以知道UltraScale+系列的FPGA支持MCAP配置模式。下面由一个简单的例程实现MCAP部分重配置。
1.新建一个空白工程。
1000007122-6367392619659737549160736.jpg
图2
2.因为使用MCAP的配置方式,而MCAP集成于PCIE硬核中,因此需要例化一个PCIE相关的IP,这里使用XDMA进行本次例程(裸PCIE硬核也可以),该例程没有XDMA进行数据DMA搬运的相关内容,仅仅是借用XDMA中的MCAP功能,本人目前也有一个比较痛苦的地方,就是XDMA的上位机驱动怎么和MCAP的驱动整合在一起,不懂上位机驱动开发表示很迷茫,有大佬懂这个可以探讨下。
3.在Board选项中(在建立工程时选择Xilinx官方板卡才有这个选项)选择如下。
1000007122-6367392622051915864286031.jpg
图3
4.在Basic选项中,把图中红色框中的Mode设置成Advanced。
1000007122-6367392626762835318394994.jpg
图4
5.在Basic选项中,在最底部的Tandem Configuration or Partial Reconfiguration中选择PR over PCIE。
1000007122-6367458595281742689154521.jpg
图5
6.在Pcie ID选项的Device ID中设置成8011(因为Xilinx提供的驱动支持8011,8038,506F)
1000007122-6367458621448847069845851.jpg
图6
7.其它按照默认选项,生成该IP。
1000007122-6367458623426964471702111.jpg
图7
8.考虑到测试和实现的方便,使用XDMA的Example Design来修改例程,在XDMA综合完成之后(记得选择OOC),打开该IP的Example Design,在该工程上面做修改。
1000007122-6367458624756646867906736.jpg
图8
9.Example Design如下图。
1000007122-6367458627008200717262105.jpg
图9
10.首先我们先修改XDC文件和工程顶层,主要是LED的管脚和电平约束。在这个例子中,我们将要实现使用两个可重构模块,一个模块用于控制VCU1525的LED灯亮,一个模块用于控制VCU1525的LED灯灭,用这个简单的例子来说明PR的实现步骤。
11.修改工程中的时钟生成IP,此步骤不是必要,主要是指定输入时钟管脚,如果不是官方板子,在XDC里面约束即可。
1000007122-6367458629008193032818659.jpg
图10
12.新建两个模块,分别是LED_RM_0和LED_RM_1。其中LED_RM_0用于控制LED灭,LED_RM_1用于控制LED亮。两个模块的逻辑很简单,只是做演示作用。代码逻辑如下。

图11
13.在工程顶层例化其中一个RM模块。
1000007122-6367458631503495953528443.jpg
图12
14.完成上述步骤之后,选择Tools->Enable Partial Reconfiguration...选项,将工程转换成支持PR类型的工程,在后续弹出的方框中选择Convert。
1000007122-6367458632833178359733068.jpg
图13
15.此时工程已经转换完成,对比转换之前,在Flow Navigator的PROJECT MANAGER会多出Partial Reconfiguration Wizard选项。
1000007122-6367458634034736239194418.jpg
图14
16.设置我们要进行部分重构的逻辑,即LED_RM_x模块,如下图所示,右键LED_RM_0,选择Create Partition Definition...
1000007122-6367458635601917714240134.jpg
图15
17.在弹出的窗口中指定一个分区的名字,这里设置为LED_RM,点击OK。
1000007122-6367458637598785057040025.jpg
图16
18.完成上一步之后,LED_RM_0模块变成了一个黄色的棱形标志,如下图所示。
1000007122-6367458639069091909014576.jpg
图17
19.打开Partial Reconfiguration wizard
1000007122-6367458641653456985052955.jpg
图18
20.在Edit Reconfiguration Modules界面中,点击“+”符号,把LED_RM_1添加进来,表明有两个重配置模块,添加完成后如下图所示,属于LED_RM分区定义列表里面有LED_RM_0和LED_RM_1两个重配置模块。
1000007122-6367458644409696395831542.jpg
图19
21.在Editing Configurations界面中,选择automatically create configurations,并修改Configuration Name,如下图所示。
1000007122-6367458647267497929369030.jpg
图20
22.在Edit Configuration Runs界面中,选择automatically create configurations。
1000007122-6367458649486239409823043.jpg
图21
23.最后,点击Finish,部分重配置的向导设置完成,然后点击Run Synthesis综合设计。
1000007122-6367458651145608031954016.jpg
图22
24.综合完成之后打开综合设计。
1000007122-6367458653964347207374996.jpg
图23
25.在Floorplanning界面,右键LED_RM_0,选择Floorplanning->Draw Pblock,给RM模块划分重配置的区域。
1000007122-6367458656392462883158308.jpg
图24
26.在分配完重配置区域之后,保存相应的约束到xdc文件中,然后做DRC检查,检查分配的区域是否符合要求。
1000007122-6367458658945578073524577.jpg
图25
27.DRC检查没有问题之后,点击Generate Bitstream.
1000007122-6367458661103382292565443.jpg
图26
28.至此,部分重配置的工程就生成完毕,在生成出来的文件里面,在工程目录下会有两个imp的文件夹,里面会分别有静态逻辑和各自的重配置逻辑,我们将静态逻辑先烧写进去FPGA,之后就可以通过PCIE配置动态逻辑,关于MCAP的驱动的上位机,在Xilinx_Answer_64761__UltraScale_Devices这份文档中有详细的说明。
1000007122-6367458669797098903371300.jpg
图27
1000007122-6367458671626779381715064.jpg

使用特权

评论回复

相关帖子

发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入【TI DSP 论坛】 & 【DSP 技术】           TI忠诚粉丝!

934

主题

26374

帖子

585

粉丝