【低功耗设计学习笔记】(二)By-passing & Clock Gating
2015-02-10 19:53
232 查看
一、原理说明
背景和理解:
[b]a.CPU指令可以在多周期内完成,即把一条指令分成多个部分,然后依次在每个周期内完成。但是每个指令的所用周期数并不一样,如下图所示,以五级流水线为例子,有些指令需要4个周期(这里实际就是级数,但是若单独看暂且称作周期),有的指令需要3个周期,有的指令需要整整5个周期;[/b][b]b.流水线(pipeline)的发明提高了人们生产效率,同样将流水线应用在CPU指令处理中,可以提高CPU的吞吐率。在单周期内在不同级同时执行多个指令的小操作,亦可看做是并行处理指令,提高了效率;[/b]
[b]c.抽象,将共同的部分进行提取;[/b]
[b]d.结合a、b和c我们可以看到:为了使CPU能够应用流水线,我们从更高的一个层次抽象指令的行为,把CPU分成多个级数,通过一级一级加工,逐步来完成指令执行。这样对于所有指令共有的部分而言,这样做是好的,有益的;但是凡事有利弊,指令偶尔也会闹别扭,自己需要额外完成某些操作,如写回操作,那么此时就需要给它在WB级跑一遍。但这样还是好的,因为该做的毕竟还是得做的。最要命的就是有些指令,它本身不用跑WB这一级,但我们为了能够统一整个流水线,我们硬生生让它跑一遍。那这里它就做了无用功。[/b]
[b]d.对于MIPS这样架构的处理器,本身它的ISA就是精简指令集,那么对于这些指令的重复利用是必然的,那么无用功随着积累也成了大大的功耗。[/b]
[b]e.对于无用功,很显然,我们有两个方式去避免它:[/b]
[b](1)跳过它(By-passing):用控制的手段对指令进行预判,抄小路直接跳到后续的级数,从而减短了路径。[/b]
[b](2)不管它(Clock gating):同样也是用控制的手段,在它进入下一级的时候,我们同时告诉这一级,让它什么都不要做,避免了不必要的运算,从而减少了信号翻转,降低功耗。[/b]
二、仿真验证
1.验证方式:在ISE开发平台上进行总线仿真,利用Xpower Analyzer比较功率变化。2.方法设计:
说明(从左到右):
1.测试数据生成器:并非完全随机,相邻两数相同的概率为1/2;
2.测试数据ROM;
3.测试黑盒:a.clock gating处理;b.未处理;
4.测试结果:由XPA生成功率结果;
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 gating
module tbox( input wire clk, input wire clr, input wire [3:0] a, input wire [3:0] b, 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.验证结果:
[b]a、未处理:[/b][b]b、Clock gating:[/b]
分析:在这里我们理论上,clockgating后的功率应该减少的,但是这里反而不减倒增。反复更改了测试数据和程序,最后发现还是自己的理解不到位所致,总结原因如下:
1.clock gating的使用有条件的,那就是门控的所控制的操作所消耗的功耗要(远)大于门控自身的功耗,不能拣了芝麻丢了西瓜;
2.门控信号自身切换要不那么频繁,也就是要求系统在很长一段时间是稳定的,如像待机状态一样;
题外话:此次用的是MarkDown编辑器,算是新尝试!不过感觉最后排版很乱,还需要好好学习才行!
相关文章推荐
- Science论文"Clustering by fast search and find of density peaks"学习笔记
- 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载
- Spring MVC 学习笔记1 - First Helloworld by Eclipse【& - java web 开发Tips集锦】
- 系统分析与设计学习笔记之一: Introduction of SE & OOAD
- 学习 谭浩强c语言设计 & 慕课 笔记(2017.10.24)
- 【低功耗设计学习笔记】(一)Bus Invert
- 16.Spring学习笔记_前置通知&后置通知(by尚硅谷_佟刚)
- KVC & KVO 学习笔记by STP
- 数字电路设计之低功耗设计方法六:旁路(by-passing)
- 五级流水线CPU之低功耗设计(1)——旁路(By Passing)
- 设计模式学习笔记之 ( B…
- 2.Spring学习笔记_IOC&DI概述(by尚硅谷_佟刚)
- Java学习笔记15 单例设计模式(Sin…
- 设计模式学习系列笔记(builder&nbs…
- K近邻法(KNN)学习笔记(used by python & matlab)
- 设计模式学习笔记:What's 设计模式?
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第0步---知识点总结&效果预览&设计思路
- STM32学习笔记之时钟分析(硬件设计(535)&keil(476)&Cortex-M3(171)&PCB(334)很有见解)
- 数据库学习笔记---SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)
- 17.Spring学习笔记_返回通知&异常通知&环绕通知(by尚硅谷_佟刚)