FPGA设计进阶3--FPGA物理约束

Reference: Xilinx FPGA权威设计指南

        Xilinx Vivado集成开发环境为设计者提供了通过设置FPGA内对象的属性实现对FPGA内对象进行约束的物理约束。这些约束包括:

(1)I/O约束,如位置和I/O标准

(2)布局约束,如单元的位置

(3)布线约束,如固定的布线

(4)配置约束,如配置模式

对于大多数的物理约束,其语法格式表示为:

set_property <property><value><object_list>

        Note:当XDC中出现非法的约束条件时,Vivado提示“Critial Warning”信息,其中也包括对设计中没有的对象进行约束的情况。Xilinx推荐设计者仔细查看严重警告信息,以保证所有的约束条件都是正确的。

1. I/O约束 -- 约束输入输出引脚的位置和电气标准

I/O约束的命令如下所示:

set_property PACKAGE_PIN G13 [get_ports reset]
set_property IOSTANDARD LVCMOS18 [get_ports reset]

2. 网表约束

        网表约束用于设置网表对象,如端口,引脚,网络或者单元。这样,编译工具可以以特殊的方式处理它们。

(1)CLOCK_DEDICATED_ROUTE

        该属性控制时钟信号的布线方式。当没有使用专用时钟资源时,该属性可以设置为FALSE。该值允许Vivado工具使用通用的布线资源,将来自输入端口的时钟连接到一个全局时钟资源,如BUFG和MMCM等。

(2)MARK_DEBUG

        在RTL中的一个网络上设置该属性,使得在网表中可以看到该网络。这样,允许在编译流程中,在任意点将该网络连接到逻辑调试工具中。

(3)DONT_TOUCH

        在叶子单元(Leaf Cell),层次化单元或者网络对象上设置DONT_TOUCH,用于在网表优化的过程中保护这些网表对象。该属性用于:

1)禁止优化由DONT_TOUCH声明的网络。

2)禁止合并人工复制的逻辑。

        这里书中提到一个注意点就是:由于Vivado集成设计环境不能实现平坦化(flatten)逻辑层次,因此在实现设计时避免在层次单元上使用DONT_TOUCH。在综合时,使用KEEP_HIERARCHY保持逻辑层次。但是,我发现Vivaod工具在实现时,其实是默认先将设计整个flatten进行整体优化,然后再重新生成原HIERARCHY结构的。很奇怪,也就是Vivado集成设计环境是能实现flatten逻辑层次优化的。

(4)LOCK_PINS

        LOCK_PINS是一个单元的属性,用于在逻辑LUT的输入(I0,I1,I2,...)和LUT物理引脚(A6,A5和A4)之间指定映射关系。普遍的用法是,将时序上有严格要求的LUT输入强制映射到最快的A6和A5的物理输入。如下是将I1映射到A6,I0映射到A5.

set myLUT2 [get_cells u0/u1/i_365]
set_property LOCK_PINS {I0:A5 I1:A6} $myLUT2
get_property LOCK_PINS $myLUT2

3. 布局约束

        将布局约束应用到单元,用于控制这些单元在FPGA元器件内的位置。布局约束包括:

(1)LUTNM

        唯一的字符串名字应用到两个LUT,用于控制它们在单个LUT位置上的布局。不像HLUTNM和LUTNM,可以用于组合属于不同层次单元的LUT。

(2)HLUTNM

        唯一的字符串名字应用到相同层次上的两个LUT,用于控制它们在单个LUT位置上的布局。

(3)PROHIBIT

        禁止布局到某个位置。

(4)PBLOCK

        将一个逻辑块约束到FPGA元器件内的一个物理区域内。PBLOCK是一个只读单元属性,即其单元所分配到Pblock的名字。

(5)PACKAGE_PIN

        在目标元器件封装的一个引脚上指定一个设计端口的位置。

(6)LOC

        将来自网表的一个逻辑元素放置到FPGA元器件内的一个位置外。

(7)BEL

        将来自网表的一个逻辑元素放置到FPGA元器件上一个切片内一个指定的BEL上。

在Vivado工具中,提供了两种类型的布局。

(1)Fixed Placement,由设计者通过指定的布局:手工布局,XDC约束,对加载到存储器中的设计的一个单元对象上使用IS_LOC_FIXED或者IS_BEL_FIXED约束。

(2)Unfixed Placement,由实现工具所执行的布局。

1)以下是将一个BRAM放置在RAMB18_X0Y10的位置,并且将其位置固定。

set_property LOC RAMB18_X0Y10 [get_cells u_ctrl0/ram0]

2)以下是将一个LUT放置到一个切片内的C5LUT BEL的位置,并且将BEL的分配固定。

set_property BEL C5LUT [get_cells u_ctrl0/lut0]

3)以下是将输入总线寄存器放置到ILOGIC单元中。这样做的目的是为了更短输入延迟。

set_property IOB TRUE [get_cells mData_reg*]

4)以下是将两个小的LUT组合到一个LUT6_2中,它使用了O5和O6输出。

set_property LUTNM L0 [get_cell {u_ctrl0/dmux0 u_ctrl0/dmux1}]

5)以下是用于阻止布线器使用第一列的BRAM

set_property PROHIBIT TRUE [get_sites {RAMB18_X0Y* RAMB36_X0Y*}]

4. 布线约束

        布线约束应用于网络对象,用于控制它们的布线资源。

        固定布线:固定布线是用于锁定布线的一种机制。锁定一个网络布线包含3个网络属性。

        1)ROUTE: 只读网络属性

        2)IS_ROUTE_FIXED: 用于将整个布线标记为固定。

        3)FIXED_ROUTE: 一个网络的固定布线部分

        注意:为了保证一个网络布线是固定的,则布线上的所有单元必须预先也是固定的。

        如对下图1中电路中的netA的布线进行固定。

 图 1

set_property LOC SLICE_X0Y47 [get_cells {a0 L0 L1}]
set_property BEL CFF [get_cells a0]
set_property BEL A6LUT [get_cells L0]
set_property BEL B6LUT [get_cells L1]
set_property LOCK_PINS {I1:A4 I0:A2} [get_cells L0]
set_property LOCK_PINS {I1:A3 I0:A2} [get_cells L1]
set_property FIXED_ROUTE {CLBLL_LL_CQ CLBLL_LOGIC_OUTS6 FAN_ALT5 FAN_BOUNCE5  {IMUX_L17 CLBLL_LL_B3} IMUX_L11 CLBLL_LL_A4} [get_nets netA]

5. 布局约束实现

图 2 

        如图2所示的电路,对其进行自动布局实现后的结果如图3所示,白色高亮的器件是Instance_counter3b 实现,蓝色高亮的器件是Instance_div_clk实现。这时,我想让每个module实现靠近一些,因此对其进行布局约束。

图 3 

图 4 

        在Netlist菜单栏中,选中相应的Instance,右键出Draw Pblock在Device中进行布局约束。完成的布局约束如图5所示。

图 5 

        使用Pblock的XDC约束如下所示,首先为Instance创建pblock,然后将具体的Instance与创建的pblock绑定,最后,为pblock添加相应的资源。

create_pblock pblock_Instance_counter3b
add_cells_to_pblock [get_pblocks pblock_Instance_counter3b] [get_cells -quiet [list Instance_counter3b]]
resize_pblock [get_pblocks pblock_Instance_counter3b] -add {SLICE_X0Y8:SLICE_X1Y9}
create_pblock pblock_Instance_div_clk
add_cells_to_pblock [get_pblocks pblock_Instance_div_clk] [get_cells -quiet [list Instance_div_clk]]
resize_pblock [get_pblocks pblock_Instance_div_clk] -add {SLICE_X2Y8:SLICE_X3Y8}

        最后,经过布局约束后实现的资源分布图如下所示:

图 6 

6. 布线约束实现(有些地方还没相通,再研究研究)

7. 配置约束原理

        配置约束是全局约束,用于当前设计的比特流生成。其中包含对配置模式的约束。

(1)下面是将CONFIG_MODE设置为M_SELECTMAP

set_property CONFIG_MODE M_SELECTMAP [current_design]

(2)下面是将元器件的E11和F11引脚设置为电压参考引脚

set_property VREF {E11 F11} [current_design]

(3)下面是禁止CRC检查

set_property BITSTREAM.GENERAL.CRC Disable [current_design]
  • 13
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值