Pblock(Physical Block)是Xilinx Vivado工具中用于实现物理位置约束的一个重要功能。它允许设计者指定FPGA设计中特定逻辑应放置在芯片的哪些区域,从而更好地控制布局和优化时序性能。
Pblock的基本概念
Pblock本质上是FPGA上的一个矩形区域,您可以将特定的设计元素(如模块、实例或层次结构)分配到这些区域内。Pblock的主要用途包括:
- 分区设计:将大型设计分成多个物理区域,便于并行工作和增量编译
- 时序优化:通过控制关键路径组件的放置来改善时序
- 资源规划:确保特定模块使用特定类型的FPGA资源
- 热点管理:分散高功耗组件以避免热点集中
- 接口约束:将I/O相关逻辑放置在接口附近
Pblock的创建方法
首先,对工程进行综合,综合运行完成后,打开综合后的设计。
在界面的右上角,将Vivado的模式由Default Layout
切换到Floorplanning
。
一旦切换到Floorplanning
模式,Vivado会自动打开Physical Constraints窗口(也可以通过Window -> Physical Constraints打开此窗口)和Device窗口。至此,就可以开始手动指定Pblock布局了。
手动指定Pblock进行布局就是为某一个模块设定一个资源和位置约束,Pblock的大小限定了该逻辑单元所能使用的FPGA资源,Pblock的位置限定了该逻辑单元在FPGA芯片中的位置,Pblock中所包含的FPGA资源类型限定了该逻辑单元所能使用的资源。
在Netlist窗口中选择需要进行位置约束的模块,例如图中的算法(algorithm)模块,点击Device窗口中的Pblock创建图标,即可在芯片中框出想要的位置。
框选完成后,会弹出一个窗口进行确认,其中的资源类型可以根据需求进行修改,通过勾选其中的资源类型,可改变该Pblock是否包含这类资源。
绘制Pblock也可以包含一个或多个Bank,绘制时候需要较为精确,Vivado会进行一定的自动吸附。对应确认窗口如下图所示。
一旦画好一个Pblock,在Physical Constraints窗口中就会有所显示,毕竟Pblock实质上就是一种物理约束。
Pblock的初始位置和大小并不重要。通常的做法是先给所有的需要手工布局的逻辑单元画Pblock,然后再根据这些逻辑单元的资源利用率以及连接关系调整相应的Pblock的大小和位置。
选中Pblock,在其属性窗口中,选择Statistics,可看到Pblock所包含的资源类型和数量,同时显示了对应逻辑单元需要用到的资源类型与数量,从而可以获得该Pblock中的资源利用率。
如果Pblock内部的资源比算法需要使用到的资源少时,就需要适当增大Pblock的大小,直到资源足够算法使用。
Pblock本质上是一种物理约束,因此也可以通过相应的Tcl命令完成。上述操作对应的Tcl命令如下。
1 | create_pblock pblock_algorithm |
这里主要使用了三条命令:
create_pblock
:创建Pblock
add_cells_to_pblock
:将逻辑单元分配给该Pblock
resize_pblock
:调整Pblock的大小和位置
关于Pblock的一些问题
Pblock是否可以嵌套
Pblock是可以嵌套的,尽管这种应用方式并不常见。嵌套Pblock是为了更细粒度的对相关逻辑进行布局约束。从设计层次角度讲,嵌套的Pblock对应的逻辑单元是父层与子层的关系。
图中为Pblock嵌套时的情况。
此时它们在Physical Constraints窗口中也是按层次方式显示的,这样就可以清晰且直观地看到Pblock的关系。
嵌套的两个Pblock,它们的一些属性是不相同的。最典型的是PARENT不同,顶层的Pblock其PARENT值为ROOT,而子层的Pblock其PARENT是顶层的Pblock。
Pblock是否可以包含多个矩形
Vivado支持创建多个矩形构成一个Pblock,从而使得该Pblock形状不是矩形。这在某些场合是非常有用的。
首先,对指定的cell创建一个Pblock;其次,在Device View中选中该Pblock,点击右键,选择Add Pblock Rectangle,如下图所示。此时会创建一个新的矩形。这两个矩形共同构成一个新的Pblock。可以反复选中Pblock,点击右键添加多个矩形Pblock,从而形成多个矩形Pblock共同构成一个非矩形的Pblock。
对于多个矩形构成一个Pblock的情形,这些矩形之间会以虚线形式连接,表面它们隶属于同一个Pblock。如下图所示。从Tcl命令角度讲,无非是增加了几行resize_pblock命令而已。
1 | create_pblock pblock_algorithm |
一个Pblock为什么会显示内外两个矩形
外层矩形,对应图中的粗紫色矩形,是Pblock的边界,显示了该Pblock所覆盖的FPGA面积。内层矩形,对应图中的细橙色矩形,表明了分配给该Pblock的资源与整个FPGA资源的比率。因此,我们只能调整外层矩形的大小来改变Pblock所占用的FPGA资源。
如何用不同颜色显示嵌套的Pblock
对于嵌套的Pblock,可以用不同的颜色显示。具体方法是:依次点击Tools -> Settings -> Colors -> Device,如下图所示。最多可修改三层嵌套的Pblock的颜色。
能否让工具自动设置Pblock的位置和大小
在Vivado中,如果已经创建了Pblock,依次选择Tools -> Floorplanning -> Place Pblocks,会弹出如下图所示对话框。这个界面显示了需要自动设置的Pblock,点击OK,工具就会自动调整Pblock的大小和位置。
如何使得Pblock内部资源仅供Pblock对应的模块使用
如果模块A分配给pblock_A,那么A只能使用pblock_A内部资源,但这并不能保证其他模块不使用pblock_A内部资源。为了使得pblock_A中的资源仅供模块A使用,可以设置属性EXCLUDE_PLACEMENT为true来达到此目的。但需注意,Pblock框住的只是逻辑资源而非布线资源,所以即使使用了该属性,其他模块也是可以使用该Pblock内的布线资源的。
1 | set_property EXCLUDE_PLACEMENT TRUE [get_pblocks pblock_algorithm] |
如何保证Pblock内部逻辑仅仅使用Pblock内部的布线资源
默认情形下,一旦给某一模块分配了Pblock,就保证了该模块只能使用Pblock内部的FPGA逻辑资源,但并不能保证该模块只使用该Pblock内部的布线资源。换言之,Pblock框住的只是逻辑资源,不包括布线资源。这样,相应的模块还是有可能使用Pblock外部的布线资源。为了增强设计的复用性,尤其在层次化设计中,应保证模块只使用Pblock内部的布线资源,这可通过属性CONTAIN_ROUTING实现。
1 | set_property CONTAIN_ROUTING TRUE [get_pblocks pblock_algorithm] |
参考链接
本文链接: https://hanqingjiang.com/2025/03/27/20250327_vivado_pblock/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
