vivado中移位寄存器的优化(一)

本文详细介绍了在VivadoFPGA开发工具中,如何通过SRL(ShiftRegisterLookup)的优化,如扇出优化、SRL与寄存器基本单元之间的转换以及流水线级的选择性移动,来提升设计的时序性能和资源利用率。作者强调了在进行这些转换时需要考虑设计的整体需求和约束,以达到最优设计效果。
摘要由CSDN通过智能技术生成

在Vivado等FPGA开发工具中,SRL(Shift Register Lookup基于查找表的移位寄存器)是一种特殊的硬件资源,用于实现高效的查找表操作。SRL的优化包括多种转换。

一、 SRL扇出优化

如果一个SRL基本单元驱动一个扇出数(即输出连接数)为100或更大的网络,那么会从SRL链的末尾取出一个寄存器级(register stage),并将其转换为一个寄存器基本单元。这样,如果网络变得对时序敏感,可以更容易地实现下游的灵活复制。通常,与高扇出SRL驱动器相比,复制高扇出寄存器驱动器更为简单。

二、SRL和寄存器基本单元之间的转换

1、SRL_TO_REG
可以使用SRL_TO_REG属性并将其值设置为true,将SRL基本单元转换为逻辑上等价的寄存器基本单元链。这种转换通常用于增加可用的流水线寄存器阶段的数量,这些寄存器级可以被分散开来,以便信号在设备内部穿越长距离。增加寄存器阶段的数量可以提高时钟频率,但会以更高的延迟为代价。
在硬件设计中,当信号需要在芯片的不同部分之间传输时,由于物理布局或布线限制,直接连接可能会导致时序问题或资源利用不足。通过将SRL转换为寄存器链,可以更有效地管理时序和资源使用。
需要注意的是,虽然SRL到寄存器链的转换可以提高时序性能和资源利用率,但它也可能增加硬件实现的复杂性。因此,在决定进行这种转换之前,需要仔细评估设计的整体需求和约束,以确保转换带来的好处超过了任何潜在的负面影响。
适用对象
作为leaf级SRL实例的单元(通过get_cells获取)。
属性值
Vivado逻辑优化器将从指定的SRL基本单元输入端拉出一个寄存器。
XDC 语法

set_property SRL_TO_REG <True | False> <objects> 

默认情况下,SRL_TO_REG属性的值为false。需要转换的对象应该是可以实例化或推断的静态移位寄存器,例如SRL16E和SRL32E。
XDC 示例

set_property SRL_TO_REG 1 [get_cells {cell1 cell2}] 

2、REG_TO_SRL
可以使用REG_TO_SRL属性并将其值设置为true,将寄存器基本单元链转换为逻辑上等价的SRL基本单元。这种转换通常用于减少信号在设备内部穿越长距离所使用的流水线寄存器级的数量。拥有太多的寄存器级可能会导致拥塞或其他布局问题。
适用对象
作为leaf级寄存器实例的单元(get_cells)。
属性值
True(或1):Vivado逻辑优化会将指定的寄存器基本单元转换为SRL。
False(或0):Vivado逻辑优化不会将指定的寄存器基本单元转换为SRL。
这种转换在某些情况下可能是有益的,特别是在需要减少硬件资源使用或简化布局的情况下。然而,转换并不总是最佳选择,因为SRL和寄存器具有不同的性能和资源特性。因此,在决定进行这种转换之前,应该仔细评估设计需求,并考虑转换对时序、资源利用率和布局的影响。
Vivado工具会在逻辑优化阶段检查REG_TO_SRL属性的值,并根据需要执行相应的转换。
XDC 语法

set_property REG_TO_SRL <True | False> <objects> 

默认情况下,REG_TO_SRL属性的值为false。对象应该是寄存器,并且要被吸收到同一个SRL中的寄存器应该共享相同的控制集,并且没有复位。
当REG_TO_SRL属性设置为true时,Vivado工具会尝试将逻辑上等价的寄存器链转换为SRL基本单元。这种转换通常用于简化设计的硬件实现,减少资源使用,并可能改善性能。
XDC 示例:

set_property REG_TO_SRL 1 [get_cells {cell1 cell2}] 

三、流水线级的选择性移动

当流水线寄存器链由SRLs和寄存器基本单元组成时,可以使用一下这些转换。寄存器级可以从SRLs的输入或输出端被拉出或推入,以便对流水线寄存器结构进行更精细的控制,以解决流水线不足或过度的问题。
1、流水线不足
要从SRL的输入端拉出一个寄存器阶段,应用SRL属性SRL_STAGES_TO_REG_INPUT,并将其值设置为1。要从SRL的输出端拉出一个寄存器阶段,应用SRL属性SRL_STAGES_TO_REG_OUTPUT,并将其值设置为1。

2、流水线过度
要向SRL的输入端推入一个寄存器阶段,应用SRL属性SRL_STAGES_TO_REG_INPUT,并将其值设置为-1。要向SRL的输出端推入一个寄存器阶段,应用SRL属性SRL_STAGES_TO_REG_OUTPUT,并将其值设置为-1。

3、SRL_STAGES_TO_REG_INPUT
通过使用SRL_STAGES_TO_REG_INPUT属性,可以将寄存器级从SRL输入中拉出,或者推入SRL输入中。这提供了对流水线寄存器结构的控制,以解决SRL基本单元输入端流水线不足或过多的问题。
适用对象
作为leaf级SRL实例的单元(get_cells)。
属性值
1:Vivado逻辑优化器将从指定的SRL基本单元输入中拉出一个寄存器。
-1:Vivado逻辑优化器将向指定的SRL基本单元输入中推入一个寄存器。
通过调整SRL_STAGES_TO_REG_INPUT属性的值,可以在SRL输入端灵活地增加或减少寄存器级。
请注意,使用此属性时应该谨慎,并确保了解其对时序和资源使用的影响。在进行更改之前,最好先对设计进行充分的仿真和时序分析,以确保更改不会导致任何不期望的结果。
XDC 语法

set_property SRL_STAGES_TO_REG_INPUT <1 | -1> <objects> 

对于对象来说,它们应该是SRLs,并且要被吸收到SRL中的寄存器应该共享相同的控制集,并且没有复位功能。
XDC 示例:

set_property SRL_STAGES_TO_REG_INPUT 1 [get_cells {cell1 cell2}] 

4、SRL_STAGES_TO_REG_OUTPUT
通过使用SRL_STAGES_TO_REG_OUTPUT属性,可以从SRL(的输出端拉出一个寄存器级,或者向SRL的输出端推入一个寄存器级。这提供了对流水线寄存器结构的控制,以解决SRL基本单元输出端流水线不足或过多的问题。
适用对象
作为leaf级SRL实例的单元(get_cells)。
属性值
1:Vivado逻辑优化器将从指定的SRL基本单元输出端拉出一个寄存器。
-1:Vivado逻辑优化器将向指定的SRL基本单元输出端推入一个寄存器。
通过调整SRL_STAGES_TO_REG_OUTPUT属性的值,可以在SRL的输出端灵活地增加或减少寄存器级,以满足设计的性能、时序和资源使用要求。在某些情况下,增加输出端的寄存器级可能有助于减少信号延迟或改善时序性能。而在其他情况下,减少寄存器级可能有助于减少硬件资源的使用。
注意:从寄存器到SRL的所有转换只有在控制集兼容的情况下才可能实现。
XDC 语法

set_property SRL_STAGES_TO_REG_OUTPUT <1 | -1> <objects> 

对象的类型应该是SRL(Shift Register Lookup,移位寄存器查找表),并且要被吸收到同一个SRL中的寄存器应该共享相同的控制集,并且没有复位功能。
XDC 示例

set_property SRL_STAGES_TO_REG_OUTPUT 1 [get_cells {cell1 cell2}] 
``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值