【低功耗设计学习笔记】(二)By-passing & Clock Gating
发布时间:2020-12-13 22:35:24 所属栏目:百科 来源:网络整理
导读:一、原理说明 背景和理解 : a.CPU指令可以在多周期内完成,即把一条指令分成多个部分,然后依次在每个周期内完成。但是每个指令的所用周期数并不一样,如下图所示,以五级流水线为例子,有些指令需要4个周期(这里实际就是级数,但是若单独看暂且称作周期)
一、原理说明背景和理解:a.CPU指令可以在多周期内完成,即把一条指令分成多个部分,然后依次在每个周期内完成。但是每个指令的所用周期数并不一样,如下图所示,以五级流水线为例子,有些指令需要4个周期(这里实际就是级数,但是若单独看暂且称作周期),有的指令需要3个周期,有的指令需要整整5个周期;b.流水线(pipeline)的发明提高了人们生产效率,同样将流水线应用在CPU指令处理中,可以提高CPU的吞吐率。在单周期内在不同级同时执行多个指令的小操作,亦可看做是并行处理指令,提高了效率;c.抽象,将共同的部分进行提取;d.结合a、b和c我们可以看到:为了使CPU能够应用流水线,我们从更高的一个层次抽象指令的行为,把CPU分成多个级数,通过一级一级加工,逐步来完成指令执行。这样对于所有指令共有的部分而言,这样做是好的,有益的;但是凡事有利弊,指令偶尔也会闹别扭,自己需要额外完成某些操作,如写回操作,那么此时就需要给它在WB级跑一遍。但这样还是好的,因为该做的毕竟还是得做的。最要命的就是有些指令,它本身不用跑WB这一级,但我们为了能够统一整个流水线,我们硬生生让它跑一遍。那这里它就做了无用功。d.对于MIPS这样架构的处理器,本身它的ISA就是精简指令集,那么对于这些指令的重复利用是必然的,那么无用功随着积累也成了大大的功耗。e.对于无用功,很显然,我们有两个方式去避免它:(1)跳过它(By-passing):用控制的手段对指令进行预判,抄小路直接跳到后续的级数,从而减短了路径。(2)不管它(Clock gating):同样也是用控制的手段,在它进入下一级的时候,我们同时告诉这一级,让它什么都不要做,避免了不必要的运算,从而减少了信号翻转,降低功耗。二、仿真验证1.验证方式:在ISE开发平台上进行总线仿真,利用Xpower Analyzer比较功率变化。2.方法设计:说明(从左到右):1.测试数据生成器:并非完全随机,相邻两数相同的概率为1/2; 3.测试代码:a.测试数据生成(.py): import random
print 'memory_initialization_radix = 16;'
print 'memory_initialization_vector = '
TEST_DATA_NUM = 1024
pre = random.randint(0,1)
pre_num = random.randint(0,128)
for i in range(TEST_DATA_NUM):
if(i % 32 == 0):
print ''
elif(i % 8 == 0):
print ' ',cur = random.randint(0,1)
if(cur == pre):
print('%02X'%pre_num),else:
cur_num = random.randint(0,128)
pre = cur
pre_num = cur_num
print('%02X'%cur_num),if(i != TEST_DATA_NUM -1):
print(','),else:
print(';')
b.未处理:module tbox(
input wire clk,input wire clr,input wire [3:0] a,input wire [3:0] b,output reg [3:0] c,output reg [9:0] addr
);
always@(posedge clk or posedge clr)
begin
if(clr == 1)
addr <= 9'b0;
else begin
addr <= addr + 1'b1;
end
end
always@(posedge clk or posedge clr)
begin
if(clr == 1)
c <= 4'b0;
else
c <= (a * b + a) * b;
end
endmodule
c.Clock gatingmodule tbox(
input wire clk,output reg [9:0] addr,output reg [3:0] c
);
reg gate;
reg [3:0] atmp,btmp;
always@(posedge clk or posedge clr)
begin
if(clr == 1)
addr <= 0;
else
addr <= addr + 1'b1;
end
always@(posedge clk or posedge clr)
begin
if(clr == 1)
gate = 0;
else begin
if(a == atmp && b == btmp)
gate = 1;
else
gate = 0;
end
end
always@(posedge clk or posedge clr)
begin
if(clr == 1)
c <= 4'b0;
else if(gate == 1)
;
else if(gate == 0)begin
c <= (a * b + a) * b;
atmp <= a;
btmp <= b;
end
end
endmodule
4.验证结果:a、未处理:b、Clock gating:分析:在这里我们理论上,clockgating后的功率应该减少的,但是这里反而不减倒增。反复更改了测试数据和程序,最后发现还是自己的理解不到位所致,总结原因如下: 题外话:此次用的是MarkDown编辑器,算是新尝试!不过感觉最后排版很乱,还需要好好学习才行! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |