低功耗设计

        前面已经介绍过低功耗相关概念【IC】低功耗设计理论知识,这里主要分享下RTL级的常用低功耗设计,欢迎讨论交流。

一、时钟门控clock gating

        毫无疑问,时钟门控是前端设计中最有效的低功耗设计。

        时钟门控的基本思想是在寄存器不工作的时候,把时钟clock关掉,从而时钟树clock tree上的buffer和寄存器就不会有时钟工作,也就没有动态功耗。

        单元库中会有专门提供用于时钟门控的cell,优秀的代码在工具进行综合时也会用命令自动插入cell。

        由上面的图可以看出,插入门控时钟单元后,原有电路中的MUX就不需要了,如果数据位宽是多bit的,插入clock_gating后,电路面积可能反而会减少;但如果数据是单bit信号,那么节省的功耗就比较少。

        因此,工具可以根据位宽来决定是否增加门控时钟。如果位宽很小,那么插入的clock_gating面积比原来的MUX有可能大很多,但节省的功耗又很少,性价比不高;只有当位宽超过了一定的bit数(>4bit)后,才有必要插入clock_gating。

1.1 使用DC添加门控时钟

        在dc_shell中输入man set_clock_gating_style可以查看具体的配置说明,这里列出其中几个主要的配置:

-global:可以使门控时钟穿越层次结构。如果不用选项“-global",在每个模块里都会产生一个门控时钟单元;

-minimum_bitwidth:用于设置进行时钟门控的寄存器阵列的最小宽度。对于宽度小于该设置的寄存器阵列,不进行时钟门控;然而当电路由有公共使能时,会对电路进行分解进行集体门控;

-max_fanout:设置一个门控单元所驱动的最大负载数目,定义CG单元最大扇出的一个目的是减少CG后面的时钟延迟,门控时钟单元的扇出越大,它到达寄存器的延迟越长;此外,还有用来约束重新平衡;

-num_stages:用于设置一个多级门控的级数。在有些设计中,顶层的门控信号会分解成不同的子门控信号。在缺省情况下,仅对跟寄存器阵列相连的门控制信号生成门控逻辑;

-sequential_cell,该选项设置采用何种门控时钟风格:

-sequential_cell latch:基于锁存器的离散门控单元,该配置为默认值;

-sequential_cell none:采用不适用锁存器的门控单元;

-positive_edg_logic:简写为-positive或-pos,设置在RTL代码中用上升沿锁存的寄存器(也就是上升沿沿触发的寄存器)采用何种门控逻辑,如-pos “or”表示对于上升沿触发的寄存器,采用或门逻辑进行门控,-pos "integrated"表示对于上升沿触发的寄存器采用集成门控单元进行门控;

-negative_edg_logic:简写为-negative或-neg,设置在RTL代码中用下降沿锁存的寄存器(也就是下降沿触发的寄存器)采用何种门控逻辑;

-control_point和-control_signal:这两个开关和DFT有关,用于设置该门控单元在DFT时是否可控,DFT控制信号是scan-enable还是test-mode,以及DFT控制信号与EN信号的组合逻辑是放在门逻辑中的锁存器之前还是之后。通常,将DFT控制信号与EN信号进行或操作,这样在DFT时,可以控制该门控逻辑;

-observation_point:该开关和DFT有关,用于设置是否要插入观测逻辑,以便在DFT时能看到门控逻辑内部的信号;

-setup:设置建立时间约束;

-hold:设置保持时间约束;

-observation_logic_depth:设置观察电路中异或门的数目。

通常的设置参数如下:

set_clock_gating_style "integrated" -max_fanout 30 -minimum_bitwidth 4
insert_clock_gating -global
propagate_constraints -gate_clock

1.2 RTL推荐代码风格

        为了便于工具自动识别enable并插入门控cell,良好的代码风格是必须的,下面举例说明:

理想的代码风格:

always(posedge clk or negedge rst_n)beginif(rst_n == 1’b0)beginq <= 32’b0;endelse if(en)beginq <= d;end
end

错误的代码风格:

always(posedge clk or negedge rst_n)beginif(rst_n == 1’b0)beginq <= 32’b0;endelse if(en)beginq <= d;endelse beginq <= 32’b0;end
end

        当然这里只是一个最简单的示例,核心思想就是理想的代码风格就是寄存器的赋值一定需要有相应的条件,如果没有条件就赋值,就会造成无法自动插入时钟门控了。

        对这种编码模式,可以通过脚本进行检查,如果代码风格不符合ICG时钟门控的插入,则报错并提醒设计者进行手动代码优化。

二、减少数据翻转率

2.1减少不必要的复位

        对于控制寄存器,清理掉残余状态是很有必要的,但对于data数据寄存器,数据残余可以不要复位。如果只在wr_en的条件下把有效的数据写入data_reg,没有必要在wr_en=0的时候复位寄存器,这么做只会白白增加翻转率toggle rate。总的来说,寄存器使能条件越精确(打开ICG几率越少),越有利于power优化。

2.2如何进行数据传输

        当数据需要穿过N拍delay后再使用时,我们通常有两种方法来实现,是将数据打N,一级一级往传。是将数据存入FIFO,到后级需要使用时直接读出来。两种方式valid信号都需要单独传递。如果数据特别大,也可以考虑第三种使用RAM的形式搭建资源池进行读写,而RAM也可以考虑加上时钟门控进一步优化功耗

        对比PIPE打拍的方式,FIFO的方式有额外地址计算比较的开销,但每个数据只需要读写各一次,很明显FIFO方式每个寄存器的toggle rate将大幅下降。

        因为FIFO额外地址计算的开销,所以这里要根据FIFO的深度和位宽进行选择,数据宽度越宽,FIFO深度越深,功耗优化效果越明显

三、操作数隔离

        操作数隔离的原理是: 如果在某一段时间内,数据通路的输出是无用的,则将它的输入置成个固定值,这样,数据通路部分没有翻转,功耗就会降低。

四、总线数据分割

总线数据分割的思想是将多位总线数据分割成高位和低位两部分,并且优先判断高位。

比如,32bit总线数据分成高1bit和低31bit,只有当高位bit符合要求时再进行低位的比较。

五、其他

状态机编码:传统是用二进制编码,改成格雷码,相邻状态可以减少瞬变的次数;同理,可用独热码。

并行结构:增加资源做处理,可以降低时钟频率。这种设计需要在增加的面积和节约的功耗之间做平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279425.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP---Bert分词

目录&#xff1a; Q&#xff1a;bert分词步骤1&#xff1a;构建N * N 的相关性矩阵&#xff0c;计算相邻两个字的相关性&#xff0c;低的话&#xff08;<阈值&#xff09;就切割。2&#xff1a;将A词进行mask计算出A的embedding&#xff0c;然后将AB两个词一起mask&#xff…

微信小程序的配置文件使用说明:

在上一文中学习开发小程序的起航日记&#xff0c;我们准备好了开发小程序时所需的环境和准备工作&#xff0c;同时也简单的了解了一下小程序的项目结构组成。 这一章&#xff0c;我们主要对小程序的配置文件进行学习。 文章目录 小程序_配置文件1.json2.app.jsonpages 属性wind…

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…

【linux】Debian访问Debian上的共享目录

要在Debian系统上访问共享目录&#xff0c;通常意味着要访问通过网络共享的文件夹&#xff0c;比如通过SMB/CIFS&#xff08;Server Message Block/Common Internet File System&#xff09;协议共享的Windows共享文件夹。以下是访问共享目录的步骤&#xff1a; 1. 安装必要的…

MyBatis记录

目录 什么是MyBatis MyBatis的优点和缺点 #{}和${}的区别 Mybatis是如何进行分页的&#xff0c;分页插件的原理 Mybatis是如何将sql执行结果封装为目标对象并返回的 MyBatis实现一对一有几种方式 Mybatis设计模式 什么是MyBatis &#xff08;1&#xff09;Mybatis是一个…

[Qt学习笔记]QT下获取Halcon图形窗口鼠标事件并执行相应操作

目录 1、背景2、参考信息3、目标4、步骤4.1 Halcon库的配置4.2 读取图像&#xff0c;并实现图像自适应窗体控件大小4.3 主要的图形绘制和贴图操作见如下代码&#xff0c;其中重点为全局函数的创建来实现选择Select、拖拽Drag和尺寸Resize事件响应。 5、总结 1、背景 在视觉项目…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

k8s详细教程

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点…

4.线性数据结构——3.栈及例题

标准库的栈 定义&#xff1a;stack<typename> myStack;大小&#xff1a;size()压栈&#xff1a;push()弹栈&#xff1a;pop()栈顶&#xff1a;top()判空&#xff1a;empty() #include <cstdio> #include <string> #include <map> #include <algor…

HarmonyOS NEXT应用开发之搜索页一镜到底案例

介绍 本示例介绍使用bindContentCover、transition、animateTo实现一镜到底转场动画&#xff0c;常用于首页搜索框点击进入搜索页场景。 效果图预览 使用说明 点击首页搜索框跳转到搜索页面显式一镜到底转场动画 实现思路 通过点击首页搜索框改变bindContentCover全屏模态…

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象&#xff08;数据倾斜&#xff09;是怎么产生的&#xff0c;以及解决办法有哪些HBase rowkey的设计原则HBase 的列…

[Qt学习笔记]QGraphicsView实现背景的绘制和前景图像的绘制

1、介绍 Qt中使用QGraphicsScene重写drawBackGround绘制背景&#xff0c;就是使用自定义的Scene类来重写drawBackGround的函数来重新绘制背景&#xff0c;这里需要注意的是自定义的Scene类要继承QGraphicsScene类&#xff0c;因为drawBackGround是一个虚函数&#xff0c;相当于…

【鸿蒙系统】 ---Harmony 鸿蒙编译构建指导(一)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

Qt笔记 信号和槽

在Qt中&#xff0c;如何将两个对象进行关联&#xff0c;让一个对象发出信号&#xff0c;然后另外一个对象接收到信号后&#xff0c;执行该对象的一个方法&#xff0c;要实现这种方式&#xff0c;则需要使用到信号和槽机制。 信号&#xff1a; 信号一定是一个没有返回值的函数…

【CSS练习】万年历 html+css+js

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>bod…

Linux之线程同步

目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口&#xff1a; 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码&#xff1a;这次我们让一个线程抢完票之后不去做任何事。 #include <iostream> #include <unistd.h> #inc…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

【C语言】结构体类型名、变量名以及typedef

文章目录 分类判断结构体成员的使用typedef 分类判断 struct tag {char m;int i; }p;假设定义了上面这一个结构体&#xff0c;tag 就是类型名&#xff0c; p 就是变量名&#xff0c; m 和 i 就是结构体成员列表。 可以这么记&#xff0c;括号前面的是类型名&#xff0c;括号后…