使用Vivado Design Suite进行Control Sets优化

在FPGA设计中,控制集(Control Sets)是对一个寄存器的所有控制信号(如复位、置位、使能、时钟信号等)的集合。控制集在优化FPGA设计的性能和资源利用率方面起着关键作用。
首先,控制集优化可以根据设定的阈值(如Control_set_opt_threshold)调整控制集的数量。例如,对于具有完全相同的控制信号的寄存器,可以将它们放置在同一个Slice中,从而节省资源。此外,当同步复位、同步置位和同步使能信号的数量小于设定的阈值时,也可以将它们放置到同一个Slice中,进一步减少资源使用。
在这里插入图片描述
其次,在逻辑优化阶段,使用CONTROL_SET_REMAP属性可以为特定的寄存器触发缩减控制集。这允许逻辑优化器将控制信号映射到查找表(LUTs)的输入,从而简化逻辑结构,减少额外的逻辑层级,并提高设计的性能。这种优化技术通常用于提高设计的时序性能,并减少功耗。
最后,在布局布线阶段,可以通过合并等效控制信号来进一步减小控制集。这有助于减少布线复杂性,提高设计的稳定性和可靠性。

一、合并控制集

合并控制集是一种优化技术,它减少逻辑上等价的控制信号的驱动器数量,将它们合并为一个单一的驱动器。这类似于反向扇出复制(reverse fanout replication),并且最终得到的网络更适合基于模块的复制。
在FPGA设计中,控制信号通常用于控制不同逻辑单元的行为,例如触发器的置位、复位或使能。如果这些控制信号在逻辑上是等价的,即它们控制相同的功能或逻辑行为,那么将它们合并为一个单一的驱动器可以减少硬件资源的消耗,并简化设计的结构。
通过控制集合并,可以减少驱动器的数量,降低功耗,并提高设计的可维护性和可读性。同时,合并后的控制信号网络更适合进行基于模块的复制,这有助于在FPGA的不同部分实现相同的逻辑功能,提高设计的重用性和灵活性。

二、缩减控制集

在FPGA设计中,缩减控制集是一个优化步骤,它基于使能(Enable)信号来简化寄存器的控制逻辑。这种优化通常用于减少逻辑层级、提高时序性能,并优化资源利用率。
当指定基于使能信号的控制集缩减时,希望将寄存器的使能输入映射到数据输入(D-input),而不是将它作为一个独立的控制信号。这种映射可以利用查找表(LUTs)的内部逻辑功能,从而简化逻辑结构并减少不必要的逻辑层级。
具有多个独特控制集的设计在放置时可能拥有较少的选项,这可能导致功耗较高且性能较低。而具有较少控制集的设计在放置方面具有更多的选择和灵活性,通常能够产生更好的结果。
在Vivado等FPGA开发工具中,可以通过设置CONTROL_SET_REMAP属性来实现基于使能信号的控制集减少。当为寄存器设置此属性并指定ENABLE值时,逻辑优化器将尝试将使能信号映射到数据输入,以便更有效地利用查找表资源。
需要注意的是,控制集减少优化应该谨慎进行,以确保优化结果符合预期。过度或不当地使用此优化可能导致时序违规、资源利用率不佳或其他不期望的副作用。

三、CONTROL_SET_REMAP

虽然所有寄存器都支持复位和时钟使能,但它们的使用会显著影响最终实现的性能、利用率和功耗。具有大量独特控制集的设计在放置时可能拥有较少的选项,这可能导致功耗较高且性能较低。CONTROL_SET_REMAP属性被放置在寄存器基本单元上,以在逻辑优化(opt_design)期间触发对特定寄存器的精简控制集。
当逻辑路径终止于一个Fabric寄存器(FD)的时钟使能或同步置位/复位时,寄存器上的属性会指示Vivado逻辑优化器将使能或复位信号映射到数据引脚(D),该引脚具有专用的查找表(LUT)连接,可能更快。如果可能的话,逻辑会与驱动D输入的现有查找表结合,以防止插入额外的逻辑层级。
重要提示!当在任何寄存器上检测到CONTROL_SET_REMAP属性时,该优化会自动触发。DONT_TOUCH属性可以防止在指定的单元或层次结构上应用此优化。
适用对象
单元(get_cells)

• ENABLE:将EN输入重新映射到D输入。
• RESET:将同步的S或R输入重新映射到D输入。
• ALL:与ENABLE和RESET的组合相同,即同时执行ENABLE和RESET的重新映射。
• NONE:不执行任何操作。这是默认值,与未在该单元上设置此属性时的效果相同。
这些值用于设置FPGA设计中特定寄存器的CONTROL_SET_REMAP属性。当设置为ENABLE时,逻辑优化器会将寄存器的使能(EN)信号重新映射到数据(D)输入,从而可能减少逻辑层级,提高时序性能。类似地,当设置为RESET时,同步的置位(S)或复位(R)信号会被映射到D输入。选择ALL时,则同时应用ENABLE和RESET的映射。如果不需要任何重新映射,则可以使用NONE选项,这将保持寄存器的控制信号不变。
XDC 语法:

set_property CONTROL_SET_REMAP <value> [get_cells <cell_pattern>] 

XDC语法示例:

set_property CONTROL_SET_REMAP ENABLE [get_cells ff*] 

四、DONT_TOUCH

DONT_TOUCH指令告诉工具不要对用户层次结构、实例化组件或信号进行优化,这样优化就不会跨模块边界进行,也不会消除对象。虽然这有助于布局规划、分析和调试,但它会抑制优化,导致设计更大、更慢。
重要提示!AMD建议在RTL源文件中设置此属性。需要保留的信号通常在读取XDC文件之前就已经被优化。因此,在RTL中设置此属性可以确保属性被使用。

DONT_TOUCH属性与KEEP或KEEP_HIERARCHY属性的工作方式相同;然而,与KEEP和KEEP_HIERARCHY不同,DONT_TOUCH被向前注释到布局和布线阶段,以防止在实施过程中进行逻辑优化。DONT_TOUCH对不同对象的影响如下:
• Primitive Instance:不移除实例。但是,工具可以连接或断开实例的引脚。
• Hierarchical Instance:不移除实例或添加或移除实例的任何引脚。工具可以连接或断开引脚,并优化层次模块内部的逻辑。但是,优化不能将逻辑移入或移出层次模块。这是对实例层次边界的约束。
提示:将应用了DONT_TOUCH的层次实例的所有输出进行注册。
• 层次网络:不移除网络,或连接或断开网络上的任何引脚。
提示:在层次网络上,DONT_TOUCH只会保留它附加到的层次段,因此需要将它附加到要保留的所有段上。

DONT_TOUCH不支持单个模块或实体的端口。如果需要保留特定的端口,请在模块本身上放置DONT_TOUCH,或者使用以下Vivado综合设置:
flatten_hierarchy = “none”

这个设置可以阻止工具对层次结构进行扁平化,从而保留原始层次结构,这样就可以通过DONT_TOUCH来保留特定的端口或子模块。然而,这可能会增加设计的复杂性和大小,因此应该谨慎使用。
适用对象
此属性可以应用于任何信号、层次模块或原始实例。
单元(get_cells)
网络 (get_nets)
属性值
• FALSE:允许跨层次结构进行优化。这是默认设置。
• TRUE:通过不允许跨层次结构边界进行优化来保留层次结构。保留实例化的组件或网络,以防止它们在设计过程中被优化掉。
语法
Verilog语法
将Verilog属性直接放在用户层次结构实例化之前。

(* DONT_TOUCH = "{TRUE|FALSE}" *)

Verilog 语法示例:

// Preserve the hierarchy of instance CLK1_rst_sync (* DONT_TOUCH = 
"TRUE" *) reset_sync #(
.STAGES(5)
) CLK1_rst_sync (
.RST_IN(RST | ~LOCKED),
.CLK(clk1_100mhz),
.RST_OUT(rst_clk1)
);

Wire 示例:

(* dont_touch = "true" *) wire sig1; 
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
Module Example:
(* DONT_TOUCH = "true|yes" *) module example_dt_ver
(clk, In1, In2,
out1);

Instance 示例:

(* DONT_TOUCH = "true|yes" *) example_dt_ver U0 
(.clk(clk),
.in1(a),
.in2(b),
out1(c));
  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值