pipeline RISC设计(11)--优化Multiplexer(三)--一步一步优化FPGA RISC<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
传统的二分法MUX实现代价:
则实现RISC的LE消耗如下图,
图中标识的是一个bit MUX实现消耗的LE个数;所以以32bit数据宽度计算,图中MUX总共消耗LE:14x32=448 LEs。
而上图中逻辑/运算/比较单元消耗的LE如下图,
逻辑/算术/比较均是2输入1输出的Function,所以1bit对应一个LE,32 bit共消耗LE:3×32=96 LEs。
可以看出,相比MUX消耗的资源,RISC的FPGA实现中,运算部件消耗的资源要小得多。
使用优化得方法实现得MUX,资源消耗见下图,
MUX共消耗12×32=384 LEs。
还有什么地方可以减少LE呢?
已经知道registered 2-1 MUX和registered 3-1 MUX都是占用1个LE,也就是上图中的那个2-1 MUX可以无代价的变为3-1 MUX。这样,就可以从External Memory Read这条数据路径借用新增的MUX路径,见下图,
这样,通过Balance数据路径,又减少了一个LE,MUX总共消耗LE:11×32=352。
还有地方可以优化吗?
注意在上图中在移位器/乘法器出口,有一个3-1的MUX,因为是non-registered型的,因此占用了两个LEs,这部分能不能再少用一个LE呢?重新审视以前移位器/乘法器的实现,如下图,
我们可以看出3-1 MUX的3个输入不是独立的,能不能改变实现形式减少MUX的输入呢?见下图,
上图中OR逻辑被移近到MUX附近,从红色框外来看,输入的数据路径只有两条;而控制线需要几条呢?
红框中的MUX输出只有3中情形:
输出最左端(MUL_high,SHR,ASR);
输出最右端(MUL_low,SHL);
输出中间(ROT)。
因此控制线只需要2个就够了。
红框中实现见下图,
从上图中可以看出,一个LE中实现了两个2-1 MUX,但并不是实现了一个3-1 MUX,而是实现了一个输入有相关性的“伪”3-1 MUX。这样又减少了一个LE,总的MUX的LE消耗变为:10×32=320。
通常在优化过程中,还有一个特性可以利用来进行优化的,就是mostly zeros,也就是当某个地方出现很多0,可以对会出现很多0的数据路径进行优化。对于我们的RISC,有一个地方,就是比较运算的数据路径,回忆一下,
cmp.op ra, ra, rb
该指令的功能是
If (ra op rb)
Ra=32h00000001;
Else
Ra=32h00000000;
也就是比较指令的数据路径31~1,无论那种选择情况,都是0,只有bit-0可能出现1。那么在对比较输出进行MUX时,可以省下31个LE。
也就是在设计“逻辑运算-算术运算-比较运算”的3-1 MUX时,其中bit[0],真正使用3-1 MUX;而bit[31]~bit[1]只用2-1 MUX就行了,但是注意当出现比较运算时,要按时序对相关流水线寄存器的bit[31]~bit[1]进行同步复位。
这样,总的MUX LE消耗变为:320-31=289 LEs。
到这里,相比未优化的实现,通过优化MUX,共节省了(448-289)/(448+96)=159/544=29%的LE,其中MUX减少159/448=35%。
文章评论(0条评论)
登录后参与讨论