FPGA/CPLD设计中的逻辑复制
0赞逻辑复制时一种通过增加面积而改善时序条件的优化手段。逻辑复制最常使用的场合时调整信号的扇出。如果某个信号需要驱动后级很多单元,换句话说,也就是其扇出非常大,那么为了增加这个信号的驱动能力,就必须插入很多级Buffer,这样就在一定程度上增加了这个信号的路径延时。这时可以复制生成这个信号的逻辑,用多路同频同相的信号驱动后续电路,使平均到每路的扇出变低,这样不需要插入Buffer就能满足驱动能力增加的要求,从而节约该信号的路径延时。
先来做个实验吧:
EX1:
input a,b,c,d;
input sel;
output dout;
assign dout = sel ? (a+b):(c+d);
从综合出来的RTL视图来看,ADDER内部应该是使用了两个加法器,分别做好了(a+b)和(c+d)的运算,然后把结果送到后端2选1选择器的输入,所以此代码的设计时综合出了两个加法器和一个2选1选择器。
EX2:
input a,b,c,d;
input sel;
output dout;
wire ab,cd;
assign ab = sel ? a:c;
assign cd = sel ? b:d;
assign dout = ab+cd;
从这个视图看出,综合出来的斯两个2选1选择器和一个加法器。相比较两个不同的设计语法(其目的是一样的),EX1占用的资源多一些,但是速度快些;而EX2恰恰时相反。
相对于EX2来说,我们似乎更倾向于这种设计方式,因为它节约资源。但是另一方面来说,EX1就是一种逻辑复制的设计方法,因为本来我们在这个设计中只要一个加法器就可以了(如EX2),但是为了加快速度,我们就需要逻辑复制这个设计方法(如EX1),这个实验中就是利用两个加法器,用增加面积为代价换来了速度。从另一个角度说,逻辑复制也可以说是面积换速度的一个特例。
需要说明的时,现在很多综合工具都可以自动设置最大扇出值,如果某个信号的扇出值大于最大扇出值,则该信号将会自动被综合工具复制。