平台:vivado2018.3
应用场景,在设计的过程中,一些特定的引脚,我们想在原有的基础上不改变其布局布线方式。
使用手动布局布线
验证模块led。在没有约束的情况下。布局,这里我们看这几个信号。
观察LED_REG,即LED输出寄存器。
在vivado里面的布局在。
clock region:X4Y0
Tiles:CLE_M_X65Y24
Site:SLICE_X97Y24
BEL:DFF2
这里我选中一个cells即我们的led_reg,打开原理图发现是一个FDCE。我选中当前cells,拖动到AFF2。
然后固定布线led_OBUF,右键fix routing。固定布线。
发现XDC文件中发现了将当前cells固定到了AFF位置。且led_OBUF信号布线也被约束固定。重新进行综合实现。
set_property FIXED_ROUTE { { CLE_CLE_M_SITE_0_DQ2 { INT_NODE_IMUX_96_INT_OUT IMUX_W21 } SDNDNW_W_0_FTS WW2_W_BEG0 INT_NODE_IMUX_54_INT_OUT BYPASS_W2 INT_NODE_IMUX_46_INT_OUT IMUX_W13 IMUXOUT13 XIPHY_BITSLICE_TILE_256_TX_Q HRIO_IOB_45_OP_PIN } } [get_nets u_led/led_OBUF]
set_property BEL D5LUT [get_cells u_led/led_i_1]
set_property LOC SLICE_X97Y24 [get_cells u_led/led_i_1]
set_property BEL AFF [get_cells u_led/led_reg]
set_property LOC SLICE_X97Y24 [get_cells u_led/led_reg]
打开实现后切换到floorplanning,找到led_reg观察他的位置。led_reg被固定到了AFF这个FDCE。但是由于我们约束了led_OBUF的布线。Vivado在保证他布线约束不变的情况下,我们的led_reg被我约束到了AFF,他在原来的DFF2上没有找到驱动,所以led_OBUF的约束无效。
那么布线约束的意义在哪。
删除布线约束,只保留cell关于led_reg的位置约束。
set_property BEL AFF [get_cells u_led/led_reg]
set_property LOC SLICE_X97Y24 [get_cells u_led/led_reg]
重新实现后出现如下情况。
可以看到,vivado的实现后,还是改变了其中的布局布线。
测试总结,手动布局布线可以选定其中一个routing,或者cell,约定其位置。但是你约束了其中一个,但是一个模块中其他的cell也会随之改变。
使用pblock划分区域布局布线划分静态区
在网上有人说到,如果使用的ultrascale和ultrascale+芯片,可以将目标模块放置在静态部分。这个是Floorplaning,然后创建一个pblock。
验证将我的LED模块创建pblock,放置在X5Y0区域。布局布线后,效果如下。
将该工程复制,在新工程中,加入XDMA的IP核。实现后。效果如下。
可以看到,在我规划的pblok中,pcie的IP核将他的布局布线也放置在了我的规划区域中。检测LED模块里面的几个cells发现布线位置没有改变。下面将我的led模块添加几个计数器,在重新实现一下。
未添加pcie核之前的布局布线。
添加了pcie核之后的布局布线。
可以发现综led_contral_reg已经改变了。
Vivado设计锁定与增量编译
增量编译的结果是在改动很小的情况下,增量布局布线,当改动较大时,增量编译后还是会重新布局布线。
下面验证一下增量编译。
将floorplanning_lock_2工程综合实现完成。找打DCP文件,文件路径如下。再新建一个dcp_files文件夹。将该文件放入到文件夹下。
然后在锁定该设计。新打开一个vivado界面,点击open_checkpoint。
打开后,在当前界面下输入tcl命令,锁定锁定设计(简单的增量编译不能保证模块固定在某个位置,这里对设计进行锁定)这里输入lock_design –level routing。
锁定设计后保存。
在将floorplanning_lock_2复制到floorplanning_lock_3,修改led模块代码。
修改完成后,在viavdo界面点击。Flow-Great Runs。
选择both。
不变。
点击make_active。
选择Do not launch now。
完成后。
完成后,新的综合和实现如上图。
在impl_2中选择set incremental implementation。
选中刚才锁定的设计。
实现增量锁定编译,直接失败了。
放弃使用增量编译锁定。实现增量编译。
选择设置setting-implementation-incremental implementation选择增量编译的dcp文件。
设置完成后开始编译。
编译完成后时间缩短了。
对于较小的改动布局布线没有改变。查阅资料发现对于以下两种情况下适用。
情形1:很小的设计改动。
情形2:与原始设计相比,更新后的设计只是添加了调试模块,如ILA等。
所以增量编译也不能保证原始设计布局布线不变。
验证结论
使用手动布局布线,在约束了模块中的cell和位置和routing布线约束后,只能保证当前信号的位置布线不改变。在vivado综合实现过程中,如果遇到需要优化的地方,默认其他cell的位置将采取最优值。
使用pblock划分区域,在floorplaning中,划分出一块区域,将当前模块划分在该区域中布局(布线也可以约束在此区域内)。约束完成后,对该工程进行综合,发现pblock中的布局布线约束也改变了,并不能保存默认不变。
使用增量编译,只有改动较小的时候(<5%),才能保证不变。
附录资料
资料时钟域clock region。
在FPGA设计中,时钟域的划分是为了解决时钟同步和数据同步的问题。
Tile:tiles指FPGA芯片上的最小物理单元,通常是由一组逻辑块、存储单元、时钟资源、IO资源等组成的。tiles是FPGA芯片上最小的可编程单元,设计人员可以通过对tiles进行编程,实现特定的功能。(图中的白色框就是tile的边界,可以包含多个BEL单元或者site(不同时包含BEL单元和site))
Site:在FPGA设计中,sites是指FPGA芯片上的物理位置,通常用于描述FPGA芯片上的资源分配和布局。FPGA芯片通常由一系列的逻辑块(logic blocks)、存储单元、时钟资源、IO资源等组成,每个逻辑块、存储单元、时钟资源、IO资源都会被分配到特定的site上。
BEL:BELs是FPGA设计中的一个术语,指的是Basic Element Library,即基本元素库。BELs是指一组基本的逻辑元素,例如AND、OR、NOT等,这些元素可以组合成更复杂的逻辑电路。这里是一个FDCE。