本期文章让我们聊聊一种数字ic设计技术——展开,展开用于产生一个一次迭代就相当于原有结构的多次迭代的新电路结构。其相当于之前聊过的折叠技术的反向操作,折叠使用一个功能单元通过多次迭代来完成原有电路结构一次迭代的操作,相对于通过时间换取面积,而展开则是使用多个功能单元,一次迭代就相当于原有电路结构的多次迭代,相当于通过面积换取时间。
下面让我们开始了解展开这一技术~
一、展开算法
1.1 J倍降速
首先普及一个基础概念,我们将一个能够在一次迭代内,完成原有程序J次迭代的展开过程,其中的J称为展开因子。
当我们对一个程序进行展开时,原有程序路径中的延迟会按照展开因子进行J倍降速(J-slow), 这里的J倍降速指的是:我们原程序进行了J倍的展开,因此在展开后的程序中一个周期的迭代,就相当于原程序的J个周期的迭代,因此如果展开后的路径中有1个延迟单元,假设第k次迭代的输入信号为x(kj+m),其中的m是展开后的节点的编号。那么此时这个延迟单元的输出信号应该是上一次k-1次迭代的结果,即x(j(k-1)+m)=x(kj+m-1*j),也就是说对于展开后的结构来说,它的一个延迟单位的效果相当于原程序J个延迟单元的效果,这就是所谓的J倍降速。
利用J倍降速可以得到展开后的电路结构,举个例子说明一下,假设有以下电路:
该电路可以使用以下方程进行描述:
我们对其进行2阶展开,用2k来代替n,因此可以得到以下方程:
上面两个式子分别是展开后m=0,1的路径方程,结合J倍降速的概念,我们可以发现m=1这条路径上有2个延迟单元,m=0这条路径上有1个延迟单元,于是展开后的电路结构为:
以上就是利用J倍降速的方式得到展开后的电路结构的流程介绍,不过这种方法还是比较麻烦的,特别是面对较大的J,下面我们再介绍一种更为简单的展开方法。
1.2 图形化的展开方法
我们可以依照下面的步骤利用图形化的方式快速的构建一个展开结构:
对原始结构的每一个节点U,画出J个节点U0,U1,U2,U3…Uj-1。
对原始结构中的每一条带有延迟w的边U->V,画J条带有延迟floor((i+w)/J)的边,这些边从节点Ui指向V(i+w)%J,其中i=0,1,2…J-1。
对于没有延迟的边,可以简化为从节点Ui指向Vi。
接下来,我们通过一个例子来展示上述方法的使用效果:
首先,我们给出上一节中的电路结构的数据流图,如下所示,其中的节点A代表输入,节点B代表加法,节点C代表乘法,节点D代表输出:
我们采用2倍展开,J=2,因此上述数据流图中的每个节点复制两份,我们主要关注有延迟的边,即节点B到节点C的这条边,使用步骤2,得出它对应的展开:
B0->C1, 延迟为1B1->C0, 延迟为2
于是展开后的数据流图为:
可见,这种图形化的展开方法得到的电路结构和上一节中的使用J倍降速得到的电路结构是一致的,我们使用时选取其中一种即可。
二、展开的属性
接下来,让我们了解一下展开的属性,这对我们理解展开技术具有很大的帮助:
对一个电路结构使用展开,不会改变其中的延迟单元(寄存器)数量。
上面的示例就显示了这点,展开前后,电路中的延迟单元数量始终是3个。
对原始电路结构中延迟为w0的环路l进行J阶展开,展开后的电路结构会有gcd(w0,J)(该式表示w0和J的最大公约数)个环路,这些环路中的每个环路都包含了w0/gcd(w0,J)个延迟,以及环路l中出现的每个节点的J/gcd(w0,J)个拷贝。
以展开因子J展开一个迭代边界为T的原始电路结构,会得到一个迭代边界为J*T的J阶展开结构。
因为J阶展开的结构代表了原始结构的J次迭代,那么展开后的系统迭代边界也会扩大J倍,但是由于新的系统可以并行的处理J个样本点,所以采样边界仍然为T,也就是说展开不改变系统的极限吞吐率。
对于原始结构中延迟为w的路径,当w<J时,展开后会得到(J-w)个无延迟的路径,和w个延迟为1的路径。
这个很好理解,从图形化的展开算法中的计算延迟的方法——floor((i+w)/J),即可看出当i<J-w时延迟为0,当J-w<=i<J-1时延迟为1.
由于当w<J时,展开后会得到(J-w)个无延迟的路径,因为没有延迟单元打拍,这些路径的时序可能较差,甚至成为关键路径,因此需要限制J<=w。
任何通过重定时J阶展开的结构的GJ所能得到的可行时钟周期,都可以通过之间对于原始结构的G重定时和以J为展开因子的展开来得到。
这一点是说明展开和重定时之间的顺序不重要,如果可以通过先展开再重定时得到一个电路结构,那么必然也可以通过先重定时再展开得到同样的一个电路结构。
三、展开的应用
通过对展开的属性的理解,不难得到如下的展开应用。
3.1 采样周期的缩短
首先,让我们来讨论展开对系统采样频率提高,缩短采样周期的应用。迭代周期是一个DSP程序的迭代周期的下限,我们无法将DSP程序的迭代周期小于迭代边界。但是我们可以通过展开的应用,将系统的采样周期缩短至迭代边界。
有以下几种情况会使得原始DSP程序的采样周期达不到迭代边界:
-
在数据流图中,某个节点的计算时间大于迭代边界时(这里假设该节点不能拆分为两个计算时间更少的子节点)。
-
迭代周期不为整数的情况。
-
以上两种情况合一,即某些节点的计算时间大于迭代边界,且迭代周期不为整数。
针对以上几种情况,我们可以使用不同展开因子的展开, 通过展开提升采样周期到迭代边界。
首先是针对第一种情况,由于节点的计算时间大于迭代边界,会使得原始结构的采样周期无法等于迭代边界,因此我们可以利用上一节中的展开属性3,即通过展开提升迭代边界T为JT,这样就可以解决节点的计算时间大于迭代边界的限制了。
具体方法是,假设某节点U的计算时间tU大于迭代边界T,那么可以使用展开因子为ceil(tU/T)的展开。
举个例子说明一下:例如下图中原始结构的迭代周期为T=3,其中节点S和T的计算时间为4u.t.,对其进行割集重定时后,最小采样周期为4u.t.,可见采样周期大于迭代边界,因此使用展开因子ceil(tU/T)=ceil(4/3)=2的展开,展开后的结构如右图所示,它的关键路径周期为6u.t.,而迭代边界为JT=6,可见通过展开能够使得DSP程序的采样周期达到迭代边界:
针对第二种情况,首先需要假设节点的计算时间为整数,由于迭代边界为带小数的单位时间,因此在原始的DSP程序中,不能通过重定时之类的方法使得采样时间等于迭代周期,因此还是利用上一节的属性3,对系统进行展开,即:将迭代边界写成t/w的形式,其中t和w互为素数,接着进行展开因子为w的展开即可。以下是一个例子:
针对第三种情况,最小的展开因子是能使得迭代边界T,乘上展开因子J后,JT成为整数时的J的最小值。
3.2 并行处理
展开变换的一个直接应用就是从串行处理架构中设计出并行处理架构。在这里我们介绍两种情况——字级和位级并行处理架构。
3.2.1 字级并行处理
首先是字级并行处理架构,我们可以使用展开变换从字串行处理架构设计出字并行处理架构。所谓的字级指的是dsp程序以一个完整的数据(字)为处理单位,每个周期N个数据。
接下来,我们以下面的2阶fir滤波器作为展示:
上述的fir滤波器每个周期处理一个输入数据x(n),并输出一个输出数据y(n),这就是一个字串行架构。接下来我们以展开因子J=3,产生一个能每个周期并行处理3个数据的字并行架构,按照前面的展开算法所述,我们只需要注意有延迟的边的情况,即:
A0->D1, 延迟为0
A1->D2, 延迟为0
A2->D0, 延迟为1
D0->E1, 延迟为0
D1->E2, 延迟为0
D2->E0, 延迟为1
除了上述的边外,其他的边直接相连,可以得到以下的3阶fir并行结构,该结构能每个周期处理3个输入数据,从而大大提升了采样周期:
3.2.2 位级并行处理
位级处理结构就是以位为标准处理单位,每个周期处理N个位。利用展开算法,我们可以从位级串行结构中,得到位并行和数字串行架构,这些架构的定义如下所述,首先假设W为数据的字长。
-
位串行处理:一个时钟周期处理一位数据,一个完整的字在W个周期内处理完成。
-
位并行处理:一个W位的字在一个时钟周期内处理完成。
-
数字串行处理:一个时钟周期处理N位,一个字在W/N个时钟周期倍处理完成。参数N称为数字尺寸。
-
于串行数据来说,由于不能在一个周期内处理完,我们需要考虑数据的进位处理,即我们需要使用开关(选择器)来对输入数据进行选择,例如:对于加法器来说,可以在bit0时无需进位,在其他位时需要进位,所以对于位级串行结构的展开来说,重点是开关(选择器)的展开,这一过程如下所示:
首先,我们做出如下两个假设:
-
字长W是展开因子J的倍数,即W=W’J。
-
所有进出开关的边都不含延迟。
其实如果包含了延迟单元也没关系,我们可以假设在这条边的延迟单元和选择器之间有个虚节点,在完成展开后,再消除这些虚节点即可。
接下来,我们按照以下两步对节点进行展开:
- 将开关的闭合写为:
这里的l为迭代次数,u=0,1,2,3…W-1,也就是一次迭代的子周期数。
- 在展开后的图中,结合上式,从节点Uu%J到节点Vu%J画一条不带延迟的边,它在W’l + floor(u/J)时刻闭合。
此外,我们还需要注意一点,展开包含开关的电路将不再保留延迟。
下面通过一个例子说明上述算法,假设有字长W=4的串行加法器:
首先,我们可以观察到,该串行加法器会在迭代的子周期u=0选择进位为0,其他时候选择进位为延迟单元的输出,我们以展开因子为2进行展开,所以有W’=2,设加法器的输入节点为A和B,输出为S,加法器为节点X,并且在延迟单元和开关之间设置一个虚节点D,0处的输入节点设为Z,a,首先还是按照展开算法,画出加法器节点X到虚节点D之间的关系:
X0->D1, 延迟为0
X1->D0, 延迟为1
然后,画出开关的关系式:
4l+0=2(2l+floor(0/2))+(0%2)=2(2l+0)+0
4l+1=2(2l+floor(1/2))+(1%2)=2(2l+0)+1
4l+2=2(2l+floor(2/2))+(2%2) =2(2l+1)+0
4l+3=2(2l+floor(3/2))+(3%2)=2(2l+1)+1
于是可知:
Z0->X0, 在2l+0时刻闭合
D1->X1, 在2l+0时刻闭合
D0->X0, 在2l+1时刻闭合
D1->X1, 在2l+1时刻闭合
由于迭代周期为2,因此可知D1到X1之间始终闭合,因此可以去除选择器,于是有以下的并行展开结构:
最后,我们去掉虚节点和死节点,可以得到如下的加法器电路:
以上就是位级串行处理结构展开为数字尺寸为2的数字串行处理结构的例子。接下来让我们再举一个位级串行处理结构展开为位级并行结构的例子,还是上述的加法器,区别在于本次将展开因子设置为4,于是有以下的展开结构:
观察一下可以发现D0是虚节点也是死节点,因此延迟会被一起去掉,所以最终的电路没有延迟了,即:
四、总结
以上就是对展开技术的介绍了,利用展开,我们可以对存在环路的电路进行并行化,这对提升电路效率,缩短采样周期有很大的帮助。
以下是往期的内容链接,欢迎阅读哟~
ic进阶|性能篇01:ic设计中的重定时到底是什么?一文带你了解重定时的原理!(qq.com)
ic进阶|面积篇01:改善面积的神器–折叠技术!以fir滤波器为例带你了解折叠技术!(qq.com)
ic基础|时钟篇05:芯片中buffer到底是干嘛的?一文带你了解buffer的作用 (qq.com)
ic基础|存储器篇02:cache的写机制-Write-through与Write-back是什么 (qq.com)
ic基础|存储器篇01-芯片中的信息存储单元有哪些?一文带你了解芯片中的存储器!(qq.com)
如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!