Vivado IP Integrator中实现DFX(Dynamic Function eXchange)的快速入门
作者: 付汉杰 hankf@xilinx.com hankf@amd.com
参考文档
Vivado Design Suite User Guide: Dynamic Function eXchange (UG909)
创建一个block design
创建一个block design,包含基本设计,如静态区和DFX的基本设计。
验证block design
在IP Integrator的右键菜单中,选择“Validate design”,验证block design。
为DFX创建一个层次化设计(hierarchy)
选择DFX的基本设计的所有模块,在IP Integrator的右键菜单中,选择“Create Hierarchy”,创建一个层次化设计(hierarchy)。
选择上述层次化设计,在右键菜单中,选择“Validate design”,验证层次化设计。
这个层次化设计(hierarchy),就是DFX的层次化设计,后面会反复用到。
创建block design container
选择上面DFX的层次化设计,在右键菜单中,选择"create block design container"。
Vivado会创建block design container,并创建一个新的block design,可以在“Design Sources”中看到。block design container的图标,被添加到上面的层次化设计上。层次化设计里面的IP变成了只读;只能在“Design Sources”中打开对应的block design,才能编辑相关的IP。
使能DFX(Dynamic Function eXchange)
双击上面DFX的层次化设计,在弹出的窗口中选择"Enable Dynamic Function eXchange on this container",还可以选择"Freeze the boundary of this container"。DFX的图标,也被添加到上面的层次化设计上。
创建其它可重配模块(Reconfigurable Modules)
有几个办法创建新的可重配模块(Reconfigurable Modules)。
第一个办法是可以选择上面的层次化设计,在右键菜单中,选择"Create Reconfigurable Modules"。Vivado会创建一个新的block design,包含相关的接口。工程师可以在此基础上继续添加IP,完成设计。
第二个办法是可以导出上面DFX的基本设计的block design的TCL,编辑TCL文件后,执行TCL文件,创建新的block design。TCL文件里的design名字,必须更改。这种办法,可以在之前设计的基础上,再添加IP,不用做重复工作。
还可以直接导入其它Vivado工程的block design。
添加可重配模块(Reconfigurable Modules)
双击上面DFX的层次化设计,在弹出的窗口的"Synthesis sources"下, 点击加号,添加可重配模块(Reconfigurable Modules),并选择active的可重配模块。
Generate output products
先为第一个block design,也就是静态区和DFX的基本设计的block design创建HDL wrapper。选择第一个block design,在右键菜单中,选择"Create HDL wrapper"。然后再选择它,在右键菜单中,选择"Generate output products"。
执行完毕后,在"Flow Navigator-->Project Manager"里,能看到新增加了菜单“Dynamic Function eXchange wizard”。
DFX向导(Dynamic Function eXchange Wizard)
在"Flow Navigator-->Project Manager"里,点击菜单“Dynamic Function eXchange wizard”,在弹出的窗口中选择"Next",在“Reconfigurable Modules Sssociations with Patition Definition”页面,能看到之前添加的可重配模块(Reconfigurable Modules); 继续点击"Next",在“Configurations”页面,点击“Automatically create configurations”;继续点击"Next",在“Configuration runs”页面,点击“utomatically create configuration run”;最后点击“Finish”。
在“TCL Console”里,可以看到类似下面的命令。
create_run child_2_impl_1 -parent_run impl_1 -flow {Vivado Implementation 2021} -pr_config config_4
create_run child_3_impl_1 -parent_run impl_1 -flow {Vivado Implementation 2021} -pr_config config_5
综合(Synthesis)
在"Flow Navigator"里,点击“Run Synthesis”。介绍后,点击“Open Synthesized Design”,打开设计。
在Vivado的主菜单中,选择"Layout"-->"Floorplanning"。
在“Netlist”中展开设计,再选择DFX的层次化设计的模块,然后在右键菜单中选择"Floorplanning"-->"Draw Pblock"。注意,不是"New Pblock"。用鼠标在“Device”中画出一个矩形,包含所有需要的资源。按住鼠标左键,开始画矩形;这时会显示已经画出的矩形包含的资源,比如"Slice: xx, DSP48: yy, RAMB18: zz, RAMB36: nn";松开鼠标左键则完成矩形绘制。
在“TCL Console”里,可以看到类似下面的命令。
create_pblock pblock_hier_axi_rm
resize_pblock pblock_hier_axi_rm -add {SLICE_X66Y121:SLICE_X102Y239 CFGIO_SITE_X0Y0:CFGIO_SITE_X0Y0 DSP48E2_X7Y50:DSP48E2_X12Y95 RAMB18_X2Y50:RAMB18_X4Y95 RAMB36_X2Y25:RAMB36_X4Y47 SYSMONE4_X0Y0:SYSMONE4_X0Y0} -remove {SLICE_X66Y121:SLICE_X102Y239 CFGIO_SITE_X0Y0:CFGIO_SITE_X0Y0 DSP48E2_X7Y50:DSP48E2_X12Y95 RAMB18_X2Y50:RAMB18_X4Y95 RAMB36_X2Y25:RAMB36_X4Y47 SYSMONE4_X0Y0:SYSMONE4_X0Y0} -locs keep_all
add_cells_to_pblock pblock_hier_axi_rm [get_cells [list design_1_i/hier_axi_rm]] -clear_locs
实现(Implementation)
点击“Generate Bitstream”, 运行布局布线,产生bit文件。执行完成后,在目录“runs”下,能看到各个可重配模块(Reconfigurable Modules)的partial.bit文件。
/proj/hankf/hankf/zcu106/v212/zcu106_dfx_test/zcu106_dfx_test.runs
hankf@XSZGS4:zcu106_dfx_test.runs$ find -name "*.bit"
./impl_1/design_1_wrapper.bit
./impl_1/design_1_i_hier_axi_rm_axi_rm0_1bram_1timer_inst_0_partial.bit
./child_3_impl_1/design_1_wrapper.bit
./child_3_impl_1/design_1_i_hier_axi_rm_axi_rm4_1bram_4timer_bd_inst_1_partial.bit
./child_2_impl_1/design_1_wrapper.bit
./child_2_impl_1/design_1_i_hier_axi_rm_axi_rm3_1bram_3timer_bd_inst_1_partial.bit
./child_0_impl_1/design_1_wrapper.bit
./child_0_impl_1/design_1_i_hier_axi_rm_axi_rm1_1bram_1timer_bd_inst_1_partial.bit
./child_1_impl_1/design_1_wrapper.bit
./child_1_impl_1/design_1_i_hier_axi_rm_axi_rm2_1bram_2timer_bd_inst_1_partial.bit