Vivado综合设置选项分析:-shreg_min_size和-no_srlextract

Xilinx FPGA SliceM中的LUT可以配置为移位寄存器(ShiftRegister)。以UltraScale芯片为例,SliceM中的8个LUT可级联构成深度为256的移位寄存器而不会消耗额外的触发器。移位寄存器的工作原理如下图所示(此图只是工作原理并非真实架构)。通过adddr的控制可实现移位深度的动态切换。


采用LUT实现移位寄存器有两种方式,一种是通过原语SRL16E或SRLC32E(具体可参考ug974);另一种是手工RTL代码描述。对于第一种方式,SRL16E和SRLC32E的区别在于深度不同,同时后者提供了级联端口Q31,如下图所示。端口A0~A3功能与上图中的addr等效。当addr为0时,移位深度为1。

对于手工描述的方式,相应的RTL代码如下图所示(VHDL和Verilog代码是等效的,选择自己喜欢的阅读即可),注意:这里并没有复位信号。


-shreg_min_size的定义是Minimumlength for chain of registers to be mapped onto SRL,可以看出它就是用来管理移位寄存器是否映射为LUT,默认值为3。通过实验可以得到如下结论:

可见,当移位寄存器深度小于等于-shreg_min_size时,最终实现方式为触发器级联的形式;而当其深度大于-shreg_min_size时,实现方式则为FF + LUT + FF的形式。

-no_srlextract则是阻止工具将移位寄存器映射为LUT,其优先级高于-shreg_min_size。例如,当移位寄存器深度为4,-shreg_min_size为3,-no_srlextract被勾选,那么最终实现形式是4个触发器级联的形式,而非FF + LUT + FF的形式。

在SystemGenerator中,有两个模块Delay和Register,如下图所示。这两个模块是不同的。对于Delay延迟深度可设定,对于Register延迟深度就是1。

进一步,对于Delay的描述如下图所示:A delay line is a chain, each link of whichis an SRL16 followed by a flip-flop。可见Delay最终的实现形式是LUT+ FF。Register则直接对应Slice中的FF。

-shreg_min_size是全局选项,对所有模块均生效。为了更精确地控制,可采用模块化综合技术选项SHREG_MIN_SIZE,取值范围为3~32。此外,综合属性SRL_STYLE也可管理移位寄存器的实现方式。

移位寄存器采用LUT + FF或者FF + LUT + FF的好处在于节省了FF,尤其是对于较大深度的延迟;同时Slice中的FF其Tco(时钟到输出延迟)小于LUT的Tco,对时序收敛是有好处的。

结论
-移位寄存器的实现方式可通过-shreg_min_size进行全局管理,
-也可通过模块化综合技术选项SHREG_MIN_SIZE进行细粒度管理
-还可通过综合属性SRL_STYLE进行控制
-综合选项-no_srlextract优先级高于-shreg_min_size
-移位寄存器采用LUT实现时不支持复位
-SysGen中Delay和Register是不同的