非对齐加载指令,读RAM中读一个字的数据,用一部分内容更新目的寄存器的部分内容,可以用两种方法实现:
- 为regfile添加字节使能信号,像data_sram一样,支持部分写
- 将目的寄存器中的数据作为源操作数,读取其旧值与待写入新值,拼接成最终的32bit结果,再整体写入regfile
方法一
不会产生写后读数据相关问题(加载指令在译码级就读取了rt寄存器的数据,并通过数据前推端口解决了数据相关问题,之后由数据通路流入访存级),需要修改regfile的写控制信号,原来是1bit的字写使能信号,现在需要改成4bit的字节选择信号,由于修改了regfile端口,就还需要修改将其他模块送入ID译码模块的写目的寄存器的使能信号也改成4bit
旧代码的寄存器堆由32个时钟门控单元(时钟门控单元的计算),经过方法1的修改,寄存器堆会插入128个时钟门控单元,新代码的功耗显著高于旧代码。方法1会导致CPU轻负载情况平均功耗的增加
注意功耗控制:静态功耗、动态功耗、时钟网络功耗、动态功耗优化、时钟门控技术
方法二
译码级需要读取rt寄存器的数据作为源操作数,同时rt也是目的寄存器,需要添加新的数据通路让rt的旧值送到访存级
补充
- CPU这样的数字逻辑电路的功耗可简单分为静态功耗和动态功耗两部分。静态功耗主要由泄漏电流引起,动态功耗包括短路功耗和翻转功耗
短路功耗即内部功耗,指由期间内部由于P管和N管在某一瞬间同时导通引起的瞬时短路引起;翻转功耗由CMOS期间的输出端负载电容放电引起 - 时钟网络功耗和触发器的动态功耗在CPU中占比显著
- 时钟门控技术是一种降低时钟网络功耗和触发器动态功耗的常用技术,它使用时钟门控单元在触发器不需要更新时关断其时钟,目前主流EDA工具在综合实现过程中会自行插入时钟门控单元。
在寄存器的输入数据无效时,将寄存器的输入时钟置位0,而此时寄存器值保持不变,此时没有时钟翻转,避免了动态消耗
当寄存器的值不需要修改时
- if-else结构,无法生成门控时钟(伪时钟门控)
功能上实现了关闭传播的作用,在时钟功耗上没有较大的降低,因为clk信号始终在翻转,寄存器输出不变是因为存在反馈信号在不断的进行时能判断、输出、… - if结构,产生锁存器,可以生成门控时钟(直接时钟门控)
不好的地方:产生使能信号en的组合逻辑二点毛刺将完全反应到AND门,造成门控时钟输出质量变差(clk_en将会有占空比不良和毛刺等情况)
还有case的default分支,和else一样
Power-Gating:电源门控
Clock-Gating:时钟门控,一个时钟信号和一个非时钟信号做逻辑输出的时钟。例如,用一个控制信号“与”一个clk,可以控制clk的起作用时间;通过在电路中增加额外的逻辑单元、优化时钟树结构来节省电能