手工布局应该算是一项高级技能,在某些场合是不可或缺的,例如Partial Reconfiguration。同时,它也是实现时序收敛的一种可选方法。

首先,打开综合后的设计,将Vivado切换到Floorplanning模式,如下图所示。

一旦切换到Floorplanning模式,Vivado会自动打开Physical Constraints窗口(也可以通过Window -> Physical Constraints打开此窗口)和Device窗口,如下图所示。至此,我们就可以开始手工布局。

手工布局的本质是对指定逻辑单元设定面积约束,在Vivado下就是对其画一个Pblock。Pblock的大小限定了该逻辑单元所能使用的FPGA资源;Pblock的位置限定了该逻辑单元在FPGA中的位置;Pblock中所包含的FPGA资源类型限定了该逻辑单元所能使用的资源。

第二步,在Netlist窗口中选择需要手工布局的逻辑单元,这里我们选取了模块arnd1,如下图所示。之后在Device窗口中点击蓝色椭圆标记的快捷键。

第三步,一旦点击上图标记2的按钮,就可以开始画Pblock,如下图所示。图中Grids显示了该Pblock所包含的资源类型及数量。

一旦画好一个Pblock,在Physical Constraints窗口中就会有所显示,毕竟Pblock实质上就是一种物理约束。

Pblock的初始位置和大小并不重要。通常的做法是先给所有的需要手工布局的逻辑单元画Pblock,然后再根据这些逻辑单元的资源利用率以及连接关系调整相应的Pblock的大小和位置。

选中Pblock,在其属性窗口中,选择Statistics,可看到Pblock所包含的资源类型和数量,同时显示了对应逻辑单元需要用到的资源类型与数量,从而可以获得该Pblock中的资源利用率,如下图所示。

如前所述,Pblock本质上是一种物理约束,因此也可以通过相应的Tcl命令完成。上述操作对应的Tcl命令如下图所示。

这里主要使用了三条命令:

create_pblock: 创建Pblock

add_cells_to_pblock: 将逻辑单元分配给该Pblock

resize_pblock: 调整Pblock的大小和位置

实际上,我们可以利用Create Pblocks Wizard,一次创建多个Pblock,这是一种半自动化的方式。相比于前一种更高效一些。

第一步,在Netlist窗口中选中需要创建Pblock的多个cell,如下图所示。

第二步,依次选择Tools -> Floorplanning -> Create Pblocks,如下图所示,会弹出Create Pblocks Wizard界面。

第三步,点击上图中的Next,会显示需要创建Pblock的cell,也就是第一步选中的那些cell,如下图所示。在这个界面中,点击“+”可以添加其他cell;选中某个cell,点击“-”可以删除该cell。

第四步,点击上图中的Next,会显示Pblock的命名格式要求。这里有两种:

一种是pblock_

例如:pblock_arnd1,pblock_arnd2;

一种是pblock_

例如:pblock_1,pblock_2。

在Suffix中选中命名格式,在Sample中会显示相应的样例。

第五步,点击上图中的Next,会显示Summary,如下图所示。这个界面清晰地显示了待创建的Pblock的名字以及对应的cell。

第六步,点击上图中的Finish,完成Pblock的创建。此时,Netlist窗口和Physical Constraints窗口相应的cell和Pblock图标都会发生变化,如下图所示。

至此,多个Pblock已经创建。上述步骤与如下所示的Tcl命令等效。可以看到,此时Pblock的大小、位置等还没有设定。

第七步,在Physical Constraints窗口中,选中一个Pblock,点击右键,选择Set Pblock Size,可进一步设置Pblock的大小和位置。这时需要逐一设置,因此这被称之为半自动化的方式。

在上图中,Pblock之间的互连线(以深蓝色表示)显示了两个cell的互联程度,这个线越宽表明互联程度越深。在Device View窗口设置中(点击右上角的齿轮标记),可以看到其中的Bundle Nets,如果想看到这个互连线,就需要勾选这个选项。

pblock是否可以嵌套

Pblock是可以嵌套的,尽管这种应用方式并不常见。嵌套Pblock是为了更细粒度的对相关逻辑进行布局约束。从设计层次角度讲,嵌套的Pblock对应的逻辑单元是父层与子层的关系。

看下面一个例子。模块arnd1和模块transformLoop[0].ct关系如下图所示。对这两个模块分别画Pblock,得到pblock_arnd1和pblock_transformLoop[0].ct,这两个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命令而已。

pblock是否可以占据整个Clock Region

此外,pblock的大小可以是整个时钟区域(Clock Region,包括相应的IO Bank)。只需要在画pblock时,将整个时钟区域框住即可,如下图所示。

此时,相应的Tcl命令就很简单,可以看到只需要一条resize_pblock命令即可确定pblock的大小和位置。实际上,在SSI芯片设计中,给每个die画一个大的pblock时(整个Pblock将整个die包含其中),只用指定左下角和右上角的时钟区域坐标即可。

1. 一个Pblock为什么会显示内外两个矩形?

外层矩形,对应图中的粗紫色矩形,是Pblock的边界,显示了该Pblock所覆盖的FPGA面积。内层矩形,对应图中的细橙色矩形,表明了分配给该Pblock的资源与整个FPGA资源的比率。因此,我们只能调整外层矩形的大小来改变Pblock所占用的FPGA资源。

2. 如何用不同颜色显示嵌套的Pblock?

对于嵌套的Pblock,可以用不同的颜色显示。具体方法是:依次点击Tools -> Settings -> Colors -> Device,如下图所示。最多可修改三层嵌套的Pblock的颜色。

例如,将第二层Pblock用绿色显示,点击Apply之后,效果如下图所示。

3. 如何修改Pblock所包含的FPGA资源类型?

选中一个Pblock,在Pblock Property窗口的General子卡中会显示该Pblock的资源类型与范围,如下图所示。通过勾选其中的资源类型,可改变该Pblock是否包含这类资源。

例如,不勾选DSP48,一旦选中该Pblock,包含在该Pblock中的资源会以灰色显示,而未被包含的资源,也就是这里的DSP48则仍然是常规亮度。如下图所示,左侧为包含DSP48的Pblock,右侧为不包含DSP48的Pblock。

4. 能否让工具自动设置Pblock的位置和大小?

在Vivado中,如果已经创建了Pblock,依次选择Tools -> Floorplanning -> Place Pblocks,会弹出如下图所示对话框。这个界面显示了需要自动设置的Pblock,点击OK,工具就会自动调整Pblock的大小和位置。

5. 如何分析Pblock的资源利用率?

实际上,Pblock的资源利用率与整个工程的资源利用率分析方法是一致的,都可以用命令report_failfast来实现,只是一些选项设置不同而已。对于Pblock,可采用如下图所示方式。

生成报告如图所示,显示了Pblock资源利用率的指导值和实际值,Status为Review的需要格外关注。

6. 如何使得Pblock内部资源仅供Pblock对应的模块使用?

如果模块A分配给pblock_A,那么A只能使用pblock_A内部资源,但这并不能保证其他模块使用pblock_A内部资源。为了使得pblock_A中资源仅供模块A使用,可以设置属性EXCLUDE_PLACEMENT为true来达到此目的。但需注意,Pblock框住的只是逻辑资源而非布线资源,所以即使使用了该属性,其他模块也是可以使用该Pblock内的布线资源的。

7. 如何保证Pblock内部逻辑仅仅使用Pblock内部的布线资源?

默认情形下,一旦给某一模块分配了Pblock,就保证了该模块只能使用Pblock内部的FPGA逻辑资源,但并不能保证该模块只使用该Pblock内部的布线资源。换言之,Pblock框住的只是逻辑资源,不包括布线资源。这样,相应的模块还是有可能使用Pblock外部的布线资源。为了增强设计的复用性,尤其在层次化设计中,应保证模块只使用Pblock内部的布线资源,这可通过属性CONTAIN_ROUTING实现。具体方式如下:

8. 在只有布局或布线后的DCP的情况下,如何获取Pblock的范围?

每个Pblock都有一个属性GRID_RANGES,查询该属性即可获得Pblock的具体范围,同时也可获知其位置信息。具体方法如下图所示。可以看到,这里的GRID_RANGES的值与命令resize_pblock的设置相对应。

转载自微信公众号:Lauren的FPGA

Copyright @ Lauren的FPGA

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。