所谓等效寄存器(equivalent registers)是指具有同源的寄存器即共享输入端口(时钟端口和数据端口)的寄存器。等效寄存器可能是设计者无意引入,也可能是有意为之。对于无意引入的寄存器,Vivado在综合阶段可将其优化掉,从而避免了额外的触发器(Flip Flop)开销,让利于关键模块或关键路径。这里重点关注“特意”构造的等效寄存器。
一个典型案例如下图所示。代码(VHDL和Verilog版本含义是等效的,选择适合自己的一种阅读即可)中信号rst_rep1和rst_rep2都是信号rst一个时钟周期延迟后的输出结果。从数字电路的角度看,可理解为有两个D触发器,它们的输入数据端口均为rst,时钟端口均为clk,而输出数据端口分别为rst_rep1和rst_rep2。此时,称这两个寄存器为等效寄存器。
对于上述代码,在综合阶段,如果勾选-keep_equivalent_registers,那么rst_rep1和rst_rep2对应的寄存器均会被保留,打开综合后的设计,在Schematic中会看到rst_rep1和rst_rep2这两个net。但是,通常上述代码只是工程中的一个很小的部分,勾选-keep_equivalent_registers会造成Vivado无法对其他无意引入的等效寄存器进行优化,这是不利的方面。鉴于此,可利用综合属性KEEP,如下图所示。
采用KEEP作用于rst_rep1和rst_rep2,确保了这两个寄存器不被优化,同时不勾选-keep_equivalent_registers也使得Vivado可以对其他无意引入的寄存器进行优化。
“特意”引入等效寄存器(也可称之为手工复制寄存器)的一个重要原因是可以有效降低关键路径上的扇出,优化时序,尤其对于全局复位或全局使能信号而言是一种行之有效的方式。
结论:
-通常情况下,建议不要勾选-keep_equivalent_registers,以确保工具对无意引入的等效寄存器进行优化;
-对于手工复制的寄存器,可通过综合属性KEEP确保其不被优化掉;
-对于全局复位或全局使能信号可通过手工复制寄存器的方式降低扇出,优化时序。