低功耗设计——门控时钟
1. 前言
芯片功耗组成中,有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。而且这些功耗主要是动态功耗。
那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。(电路图中看到的CG cell就是门控时钟了)。
2. 门控时钟的结构
2.1 与门门控
如果让我们设计一个门控时钟的电路,我们会怎么设计呢?最直接的方法,不需要时钟的时候关掉时钟,这就是与操作,我们只需要把enable和CLK进行“与”操作不就行了么,电路图如下:


这种直接将控制EN信号和时钟CLK进行与操作完成门控的方式,可以完成EN为0时,时钟被关掉。但是同时带来另外一个很大的问题:毛刺。
如上图所示,EN是不受控制的,随时可能跳变,这样纯组合输出GCLK就完全可能会有毛刺产生。时钟信号上产生毛刺是很危险的。实际中,这种直接与门的方式基本不会被采样。所以我们需要改进电路,为了使门控时钟不产生毛刺,我们必须对EN信号进行处理,使其在CLK的高低电平期间保持不变,或者说EN的变化就是以CLK为基准的。
- 很自然的我们会想到触发器,只要把EN用CLK寄存一下,那么输出就是以CLK为基准的;
- 其实还有一种办法是锁存器,把EN用锁存器锁存的输出,也是以CLK为基准的。
2.2 锁存门控
我们先看一下第二种电路,增加锁存器的电路和对应的时序如下:


该方法的原理在于:锁存器在CLK为低时透明。这样,EN 信号上的毛刺仅出现在CLK的低电平处,EN1与CLK进行与操作,可以将这部分毛刺消除掉。这样,GCLK上就没有毛刺了。
虽然达到了我们消除毛刺的目的,但是这个电路还有两个缺点:
- 如果在电路中,锁存器与与门相隔很远,到达锁存器的时钟与到达与门的时钟有较大的延迟差别,则仍会出现毛刺。
- 如果在电路中,时钟使能信号距离锁存器很近,可能会不满足锁存器的建立时间,会造成锁存器输出出现亚稳态。
如下图分析所示:

上述的右上图中,B点的时钟比A时钟迟到,并且Skew > delay,这种情况下,产生了毛刺。为了消除毛刺,要控制Clock Skew,使它满足Skew >Latch delay(也就是锁存器的clk-q的延时)。上述的右下图中,B点的时钟比A时钟早到,并且|Skew| > ENsetup 一 (D->Q),这种情况下,也产生了毛刺。为了消除毛刺,要控制Clock Skew,使它满足|Skew|< ENsetup一(D->Q)。
常见的是第一种毛刺,不过我们可以将这个逻辑做成一个单元,这样就基本上能消除上面的那两种毛刺了,因为这个门控单元是对Skew作了控制,不存在前面描述的毛刺问题,即:

2.3 寄存门控
如2.1中提到的,我们还有另外的解决办法,就是用寄存器来寄存EN信号再与上CLK得到GCLK,电路图和时序如下所示:


由于DFF输出会delay一个周期,所以除非CLKB上升沿提前CLKA很多,快半个周期,才会出现毛刺,而这种情况一般很难发生。但是,这种情况CLKB比CLKA迟到,是不会出现毛刺的。当然,如果第一个D触发器不能满足setup时间,还是有可能产生亚稳态。
2.4 门控时钟结构选择
那么到底采用哪一种门控时钟的结构呢?是锁存结构还是寄存结构呢?通过分析,我们大概会选择寄存器结构的门控时钟,这种结构比锁存器结构的问题要少,只需要满足寄存器的建立时间就不会出现问题。那么实际中是这样么?答案恰恰相反,SOC芯片设计中使用最多的却是锁存结构的门控时钟。
原因是:在实际的SOC芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。
那么用寄存器结构也可以达到这种效果,为什么不用寄存器结构呢?那是因为面积!一个DFF是由两个D锁存器组成的,采样D锁存器组成门控时钟单元,可以节省一个锁存器的面积。当大量的门控时钟插入到SOC芯片中时,这个节省的面积就相当可观了。所以,我们在工艺库中看到的标准门控时钟单元就是锁存结构了:

当然,这里说的是SOC芯片中使用的标准库单元。如果是FPGA或者用RTL实现,个人认为还是用寄存器门控加上setup约束来实现比较稳妥。
2.5 门控优缺点
2.5.1 优点
通常情况下,时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗30%。加入门控时钟电路后,由于减少了时钟树的开关行为,节省了开关功耗。同时,由于减少了时钟引脚的开关行为,寄存器的内部功耗也减少了。采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。
此外,由于门控时钟不需要用到MUX单元,加入门控时钟电路后,设计的面积也减少了。门控时钟电路的扇出越大,减低功耗和面积的效能越好。当然,扇出太大了,又会产生时序等的问题。
门控时钟电路非常容易实现,用工具自动插入门控时钟,不需要修改RTL代码,门控时钟与工艺无关。
2.5.2 缺点
那么完成了clk-gating结构后我们需要分析一下,clk-gating的收益是什么呢?功耗收益,能够在EN端不使能时关断时钟降低寄存器的动态功耗。那么对应的额外消耗支出有哪些呢?
- 面积增加,与门、或门和latch都是会增加面积的,因此工具不会无脑的插入gating,一般只有在EN控制的寄存器超过4bit时才会插入,这个值是可以设置的;
- EN路径的时序更加紧张,为了保证时钟及时被开启,EN端必须更早的实现时序收敛(或者理解为EN路径是相对clk的,D路径是相对gating clk的)。关于这一点综合完的clk timing.rpt和clk gating timing.rpt对比下就会发现gating的timing路径中一般会减去一个时间比如-100ps;
3. RTL中的门控时钟
通常情况下,时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗40%。加入门控时钟电路后,由于减少了时钟树的翻转,节省了翻转功耗。同时,由于减少了寄存器时钟引脚的翻转行为,寄存器的内部功耗也减少了。采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。
3.1 门控实现
那么RTL中怎么才能实现门控时钟呢?答案是不用实现。现在的综合工具比如DC会自动插入门控时钟。如下图所示:

上图的典型综合结果中(即不使用门控时钟的情况),在每个受EN使能控制的寄存器之前加入了一个MUX,当EN信号有效时,寄存器锁存输入信号D;否则保持原值。这种方法也能减少寄存器上的翻转,因而节省翻转功耗。然而,这种“载入一使能”结构中,每个寄存器都有一个MUX,假设MUX面积为4,则8位寄存器需要增加的面积为32。面积越大,意味着芯片成本越高,而且整体的功耗也会增加。另外,这种方式不能消除时钟树上的功耗。
对于右下角的门控时钟形式的综合电路,假设一个门控逻辑的面积为10,一个门控时钟信号可以驱动8位寄存器,则在门控时钟电路中,对每8个寄存器需增加一个门控逻辑,增加的面积为10。由此可以看到,门控时钟的电路比普通综合结果的面积更小、功耗更低。
这里有两点需要注意:
- 插入门控时钟单元后,上面电路中的MUX就不需要了,如果数据D是多bit的(一般都是如此),插入CG后的面积可能反而会减少;
- 如果D是单bit信号,节省的功耗就比较少,但是如果D是一个32bit的信号,那么插入CG后节省的功耗就比较多了。
这里的决定因素就是D的位宽了,如果D的位宽很小,那么可能插入的CG面积比原来的MUX大很多,而且节省的功耗又很少,这样得不偿失。只有D位宽超过了一定的bit数后,插入CG的收益就比较大。
那么这个临界值是多少呢?不同的工艺可能不一样,但是DC给的默认值是3.也就是说,如果D的位宽超过了3bit,那么DC就会默认插入CG,这样综合考虑就会有收益。我们可以通过DC命令来控制芯片中,对不同位宽的寄存器是否自动插入CG。一般情况都不会去修改它:
set_clock_gating_style -minimum_bitwidth 4
鉴于门控时钟的优点,我们需要把普通的综合结果“转换”为门控时钟的结果,我们主要是通过DC的power compiler来自动实现的。我们主要通过命令来设置门控时钟的风格和通过命令“启动”插入门控时钟。综合工具根据我们所设置的时钟门控的风格,插入相应的门控逻辑。因此,门控时钟的实现主要有两步,一步是设置门控时钟的风格,通过命令set_clock_gating_stale 及其选项来实现;另一步就是在网表中加入门控时钟,通过命令insert_clock_gating来实现。
3.2 RTL 门控时钟编码风格
虽然现在综合工具可以自动插入门控时钟,但是如果编码风格不好,也不能达到自动插入CG的目的。比较下面两种RTL写法:

左边的RTL代码能够成功的综合成自动插入CG的电路;右边的不能综合成插入CG的电路;右边电路在d_valid为低时,d_out也会一直变化,其实没有真正的数据有效的指示信号,所以综合不出来插入CG的电路。
需要注意的是,有的前端设计人员,为了仿真的时候看的比较清楚,很容易会写成右边的代码,这样不仅不能在综合的时候自动插入CG来减少功耗;而且增加了d_out的翻转率,进一步增加了功耗。
在不用的时候把数据设成0并不能减少功耗,保持数据不变化才能减少toggle,降低功耗!所以我们在RTL编写的时候一定要注意。作为前端设计者,了解这些知识就足够了,如果想深入了解综合的控制,可以去了解set_clock_gating_style 这个核心控制命令。
相关文章:
低功耗设计——门控时钟
1. 前言 芯片功耗组成中,有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外&…...
《凤凰架构》-本地事务章节 读书笔记
1、写锁又名排它锁,写锁禁止其他事务施加读锁和写锁,而不禁止其他事务读取数据(如果遇到了个不加任何锁的另一个事务2,写锁是无法阻止事务2读取数据的),这就是读未提交隔离级别中的脏读问题产生的根因。 2…...
ruby对比python,30分钟教程
会python还需要搞会ruby吗? web方面:ruby有rails,python有flask,django,rails远超django Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘…...
C语言——oj刷题——判断闰年
当我们谈到判断闰年时,我们通常会遵循以下规则:闰年是指能被4整除但不能被100整除的年份,或者能被400整除的年份。在C语言中,我们可以通过编写一个简单的程序来实现这一功能。下面是一个示例代码,用于判断一个给定年份…...
Git笔记——3
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、合并模式和分支策略 二、bug分支 三、强制删除分支 四、创建远程仓库 五、克隆远程仓库_HTTPS和_SSH 克隆远程仓库_HTTPS 克隆远程仓库_SSH 六、向远程仓库…...
C++面试 -操作系统-安全能力:死锁的危害、出现原因、解决方法
目录 死锁的危害 死锁出现的原因 死锁的解决方法 死锁是计算机科学中一个非常重要的概念,特别是在多线程、并发编程以及数据库管理系统等领域中。下面是关于死锁的危害、出现原因和解决方法的基础概述: 死锁的危害 资源浪费:死锁导致系统…...
台湾香港澳门媒体宣发稿报道有哪些平台资源,跨境出海推广新闻营销公司告诉你
【本篇由言同数字科技有限公司原创】随着全球化的快速发展和互联网的普及,品牌越来越重视海外市场的开拓。作为亚洲地区的重要经济中心,香港、台湾和澳门不仅具有独特的地理位置和文化背景,还拥有丰富的媒体资源。在本文中,我们将…...
Python分支和循环结构及其应用(文末送书)
一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…...
机器学习——线性代数中矩阵和向量的基本介绍
矩阵和向量的基本概念 矩阵的基本概念(这里不多说,应该都知道) 而向量就是一个特殊的矩阵,即向量只有一列,是个n*1的矩阵 注:一般矩阵用大写字母表示,向量用小写字母表示 矩阵的加减运算 两个…...
基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用
Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...
蜘蛛蜂优化算法SWO求解不闭合MD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)
1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为,具有搜索速度快,求解精度高的优势。VRPTW&#x…...
Java架构师之路六、高并发与性能优化:高并发编程、性能调优、线程池、NIO、Netty、高性能数据库等。
目录 高并发编程: 性能调优: 线程池: NIO: Netty: 高性能数据库: 上篇:Java架构师之路五、微服务:微服务架构、服务注册与发现、服务治理、服务监控、容器化等。-CSDN博客 下篇…...
MySQL-行转列,链接查询
1. 行转列 1.1 示例数据准备 create table test_9(id int,name varchar(22),course varchar(22),score decimal(18,2) ); insert into test_9 (id,name,course,score)values(1,小王,java,99); insert into test_9 (id,name,course,score)values(2,小张,java,89.2); inse…...
Linux之安装jdk,tomcat,mysql,部署项目
目录 一、操作流程 1.1安装jdk 1.2安装tomcat(加创建自启动脚本) 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器,…...
HTMLElement.click()的回调触发踩坑
先看看以下代码 const el document.getElementById("btn") el.addEventListener("click", () > {Promise.resolve().then(() > console.log("microtask 1"));console.log("1"); }); el.addEventListener("click", (…...
mysql锁-这条sql加了哪些锁
文章目录 1、 InnoDB的三种行锁2、常见的加锁语句2.1、常见隐式加锁语句2.1、常见显示加锁语句 3、加锁的2条规则4、案例4.1、唯一索引等值查询4.2、唯一索引范围查询4.3、非唯一索引等值查询4.4、非唯一索引范围查询 InnoDB 存储引擎中的行锁的加锁规则。 1、 InnoDB的三种行锁…...
Docusaurus框架——快速搭建markdown文档站点介绍sora
文章目录 ⭐前言⭐初始化项目💖 创建项目(react-js)💖 运行项目💖 目录文件💖 创建一个jsx页面💖 创建一个md文档💖 创建一个介绍sora的文档 ⭐总结⭐结束 ⭐前言 大家好࿰…...
Prompt 编程的优化技巧
一、为什么要优化 一)上下文限制 目前 GPT-3.5 以及 GPT-4最大支持 16K 上下文,比如你输入超过 16k 的长文本,ChatGPT 会提示文本过大,为了避免 GPT 无法回复,需要限制 上下文在16k 以内 上下文对于 GPT 来说是非常重…...
React PureComponent 和 React.memo()区别
1 注意 ● PureComponent和memo仅作为性能优化的方式存在 ● 不要依赖它来阻止渲染,会产生BUG ● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。 2 PureComponent 和React.memo() 区别 PureComponent 和React.memo()都是React优化…...
CentOS 7全系列免费
CentOS 7 全系列免费:桌面版、工作站版、服务器版等等………… 上文,关于CentOS 7这句话,被忽略了。 注意版本:知识产权、网络安全。...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
