有两种代码风格可用来描述移位寄存器。第一种风格如图1所示,第二种风格如图2所示。相比而言,第一种风格易于参数化,且将移位深度设置为参数可实现设计复用。同时,这种风格还可方便地使用综合属性SRL_STYLE,从而达到控制综合结果的目的。第二种风格是无法使用SRL_STYLE的。SRL_STYLE的具体使用方法可参考这里Vivado综合属性:SRL_STYLE。
图1和图2所示代码移位深度为6,以此代码为例,在综合设置选项为默认值的情形下(-shreg_min_size为3),综合后的电路形式为FF->SRL->FF,如图3所示。
从时序收敛的角度而言,图3所示的电路是易于达到收敛的目的的,但在实践中,我们发现,有时第一级的触发器与后续的SRL距离较远,导致布线延迟太大。一个可能的解决方法是能否从该SRL中“拽出”一个触发器,也就是将SRL变为FF+SRL,此时的SRL深度为原始SRL深度减1。这时可利用属性SRL_STAGES_TO_REG_INPUT。具体使用方法如图4所示。这里get_cells命令的对象为图3中的SRL。
该属性在opt_design阶段生效,因此如果其作为约束,相应的约束文件应作为Hook Script显示在tcl.pre里,如图5所示。
最终布局布线后的电路就变为如图6所示情形。
此外,如果希望从SRL中“拽出”一个触发器与最后一级触发器相连,可利用属性SRL_STAGES_TO_REG_OUTPUT。
结论
SRL_STAGES_TO_REG_INPUT可从SRL中向其输入方向“拽出”一个触发器
SRL_STAGES_TO_REG_OUTPUT可从SRL中向其输出方向“拽出”一个触发器