ic基础|功耗篇03:ic设计人员如何在代码中降低功耗?一文带你了解行为级以及RTL级低功耗技术

大家好,我是数字小熊饼干,一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结,并通过汇总成文章的形式进行输出,相信无论你是在职的还是已经还准备入行,看过之后都会有有一些收获,如果看完后喜欢的话就请关注我吧~谢谢~

本篇文章主要来聊聊数字前端设计师需要关注的行为级和RTL级低功耗技术。首先来聊聊行为级低功耗技术。

一、行为级低功耗技术

行为级低功耗技术主要讨论的是流水线和并行两种电路结构。

1.1 并行结构

并行结构是将原本一条数据路径的工作拆分至多条数据路径上完成,通过采样并行话结构,使得完成工作的效率变高,数据路径运行的延时变多,因此可以将原本的工作电压和系统时钟频率降低,进而实现了功耗的降低。

下图就是一个并行化实现乘法器的例子,通过使用两个乘法器来取代原本设计中的一个乘法器,使得时钟频率可以降低,进而系统的功耗也会降低:
在这里插入图片描述

1.2 流水线结构

流水线结构就是通过将原本的一条路径,通过插入寄存器的方式分割成多份,例如如果是分割成N级流水线的话,这样路径长度就会缩短为原本路径的1/N,这就使得一个周期内的充/放电容可以变为原本的C/N。因此,在相同的速度要求下,可以通过较低的电源电压来驱动系统,进而降低系统的功耗。

流水线的示意图如下图所示:
在这里插入图片描述
并行结构和流水结构都可以降低功耗,但是同时也会带来面积上的增加,需要按照实际需求使用。

二、RTL级低功耗技术

接下来是我们在写代码时可以使用的一些低功耗方法~

2.1 门控时钟:

在前面的系统级低功耗技术中,我们提到了高级门控时钟,这种方法是通过直接在时钟树的源头加入时钟门控单元,因为在时钟源后面分布着大量的缓冲器buffer和触发器,直接在源头关断时钟,可以停止后续器件的活动,以达到大大节省动态功耗的目的。

在这里,我们接着从RTL的角度来讨论门控时钟,我们可以通过满足某种RTL编码风格的方式,使EDA工具在不改变逻辑功能的情况下自动插入时钟门控,例如下面的verilog代码:

always @(posedge clock or negedge reset_n) beginif (!reset_n) begintest_ff <= 32'b0;end else if (load_cond) begin  //生成门控时钟test_ff <= test_data;endend

通过以上的verilog代码确保只有在load_cond有效时,test_ff才会翻转,EDA工具可以根据此自动推出门控时钟。如下面的电路所示:

在这里插入图片描述
在我们使用这种方式生成门控时钟时,最好做到:

  • 寻找现有的信号做为en,没必要生成新的逻辑信号,这反而有可能造成更多的损失。
    -减小en信号的逻辑规模,例如设计输入端数据位用于指示数据有变化。
  • 需要门控的数据位数越多越划算,如果位数太少,反而会浪费面积。例如我看的一篇文章里建议至少在位宽大于3bit以上寄存器才有必要使用门控时钟。

2.2 操作数隔离:

如果在某一段时间内,数据通路的输出未被真正采样,那么它就是无用的,因此我们可以将它的输入置成个固定值,这样,数据通路部分没有翻转,功耗就会降低。我们将这种低功耗方法称为操作数隔离。

对于一些算术逻辑单元(ALU),如加法器、乘法器等,只有当这些算术逻辑单元的输入是有效数据时,它的输出才是有意义的。而算术逻辑单元中有许多的组合逻辑,组合电路的内部工作状态完全是由其输入信号决定,每当输入信号翻转时,都会引起组合电路输出信号的改变,这期间组合电路内部会有很多器件工作,从而产生许多的无效功耗。

因此我们可以使用操作数隔离的方法,降低组合电路模块输入信号的无效翻转,以此降低这部分电路的功耗。

举个例子:
在这里插入图片描述
上面的电路图中,Add_0是两个多bit的数据进行相加操作的加法器。每当输入数据发生改变时,加法器就会开始计算,并且改变输出值,输出至后续的选择器。但是当SEL_0≠1,或SEL_1≠0时,加法器Add_0的计算结果并不能到达寄存器reg_0的输入端口,也就是说此时对于reg_0来说,Add_0的计算结果是它所不关心的,我们需要的是只是SEL_0=1且SEL_1=0时计算的结果,而非其余情形下的中间值,这些中间值对于我们来说就是造成了多余的功耗。因此,处于节省功耗的考虑,我们可以使用操作数分离的方法,使加法器Add_0不工作,如下图所示:
在这里插入图片描述
可知,基于SEL_0和SEL_Q信号来对输入到加法器的数据进行线与操作,当当SEL_0≠1,或SEL_1≠0时,输入到加法器的信号就会是固定的0,不会引起后续加法器和选择器的输入输出翻转,进而降低了功耗。

在这里插入图片描述
再举个栗子~上面是两个32bit的数据进行相加操作的加法器,64bit数据中不同的bit可以通过不同的组合逻辑到达,或者通过不同的路径到达。每当输入数据的某一bit发生改变时,加法器就会开始计算,并且改变输出值。如果A和B两个输入数据不能同时到达加法器的输入端口,就会出现许多中间值,但是我们只需要A和B都有效时计算的结果,因此为了节省功耗,我们可以使用寄存器锁存输入,然后直接通过寄存器输出确保它们同时达到加法器的输入端:
在这里插入图片描述
通过上面的例子可以发现,操作数隔离通过避免了后续电路的无效翻转来降低功耗,但是代价就是面积的增加,因此需要在设计时权衡考虑。

2.3 资源共享:

对于设计较多算术运算的逻辑,我们要尽量共用相同的逻辑,避免重复生成相同功能的电路,例如下图:
在这里插入图片描述
我们只使用一个比较器“==”,和一个算术比较器“>"就可以实现相同的功能。
在这里插入图片描述

通过资源共享我们可以节省大量的面积以及功耗。

2.4 状态机编码:

使用格雷码而非二进制来编码有限状态机,由于二进制编码状态机在状态转换时,很有可能有多个触发器发生翻转,例如,从状态A(3‘b011)到状态B(3’b100),有3bit数据发生了翻转。而对于格雷码来说,状态机按顺序跳变的情况下,只会有一位数据翻转。这样就可以降低这部分的功耗消耗。

而且由于格雷码的特点,也会降低出现毛刺的风险。
在这里插入图片描述

如上图所示,使用格雷码的状态机,其状态编码翻转频率明显降低。在我们实际应用时,尽量将跳转最频繁的几个状态设为相邻编码(即汉明距离近的编码),这样状态机每次跳转只会有一位或者几位数据发生变化,就能够降低状态机的寄存器和组合逻辑部分的功耗。

2.5 比较器优化

当有较大位宽数据需要进行比较时,最好避免一次性比较所有位。由于比较器是组合逻辑,如果比较器的输入发生变化时,其最终输出可能保持不变。然而,可能仍然存在许多中间计算过程导致了功耗。这部分的功耗完全是浪费的,因为这些转换对最终功能没有贡献。因此,我们需要避免出现此类的功耗浪费。对于比较器来说,从统计角度来看,仅比较MSB就能够在50%的情况下给出结果。因此只有当MSB比较不出大小时,较低的比特才应该进行比较。下图显示了两个32位数据的比较器:
在这里插入图片描述
第一幅图是一个典型的比较器,第二幅图是一个改进的比较器,在这种比较器中,首先进行MSB比较。如果仅比较MSB就能够得到比较结果,则阻止其他位参与比较。只有当MSB无法得到比较结果时,才允许较低的比特进入异或门进行比较。

应该注意的是,只有在MSB已经参与比较之后,总线的较低bit位才应该到达异或门。否则,如果较低的bit位数据先达到相应的XOR,它们无论如何都会造成功耗的浪费,并且预计算MSB对节约功耗上没有任何好处。同样的概念可以进一步递归应用在比较较低的31位数据中。

此外,使用这种方法也会给面积和时序带来一定的影响,例如:

•实施此类优先级比较器需要更多的资源,例如上图中的或门。

•为路径的时序带来影响:

-对于低位,现在引入了一个额外的或门。如果这些数据已经位于关键路径上,它们将有大的时序违例风险。-对于MSB,异或门上有一个额外的负载,这将使该路径上的时序恶化。如果这个比特在关键路径上,它将进一步恶化时序。

2.6 行波计数器:

行波计数器的特点是:使用级联寄存器,使用上一级触发器的输出驱动下一级触发器的时钟输入端。
在这里插入图片描述
行波计数器的优点在于其使用的逻辑资源相比普通的同步计数器更少,并且能够大量减少功耗。

不过由于行波计数器在各个阶段都会创造一个新的时钟,所以会给静态时序分析STA和综合工具带来麻烦,增加后端的工作量。并且行波计数器的使用也会为扫描链的插入增加难度。因此,在使用行波计数器时,需要结合设计需求多加考虑。

2.7 独热码多路选择器:

在verilog中,有很多方式实现多路选择器,一般来说,我们使用的选择信号通常是多比特的二进制编码,多位数据就设计到一个多位不能同时变化的问题,进行出现伪转换,导致选择器输入输出错误翻转进而造成功耗。

因此,如果我们使用独热码编码的选择信号,输出就会更快更加稳定,且会在初期就将没有选择到的总线掩藏掉,进而节约了功耗。
在这里插入图片描述

2.8 算数逻辑单元优化

芯片中的算数逻辑单元,比如说乘法器或除法器,都有着不小的面积,而更多的逻辑单元也会导致更多的功耗,因此如果能使用其他的逻辑代替乘法器和除法器,可以大大节约面积与功耗。比如:

对于某些特殊的乘法,比如说某一个乘数是2的n次方时,我们就可以使用右移代替乘法,

对于某些特殊的除法,比如说除数是2的n次方时,我们就可以使用截位来代替除法。

在进行这类型的优化时,需要和算法人员进行讨论,是否能在不影响芯片性能的基础上进行优化。

3. 总结

以上就是我们设计人员可以在平时的代码设计之中可以考虑的一些低功耗方法了,对于其中的许多低功耗方法,会带来更多的资源和时序压力,因此,芯片设计实际上是在面积功耗和性能上寻求平衡,在满足需求上的基础上寻求最优解。我们需要根据实际情况采用合适的设计方法~

如果你喜欢这篇文章的话,请关注我的公众号-熊熊的ic车间,里面还有ic设计和ic验证的学习资料和书籍等着你呢~欢迎您的关注!

在这里插入图片描述

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

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

相关文章

TI毫米波雷达可以用串口调试助理来获取原始数据吗?

摘要&#xff1a;本文介绍一下如何使用普通的串口调试助理来读取到AWR1843毫米波雷达的数据的。 使用的硬件如下图所示。 软件就是普通的串口助理&#xff0c;我用的是SSCOM&#xff0c;其他串口助理也是可以的&#xff0c;核心作用其实就是发送一行行的指令而已。 操作方法&am…

20240623(26.0) 重要财经新闻

财经关注 ► 券商中国&#xff1a;北交所于6月21日晚间受理了3家企业的IPO申请。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请。这也意味着&#xff0c;三大交易所IPO受理全部恢复。与此同时&#xff0c;三大交易所IPO上市委会议也已经全部重启。 ► 全球多地近期遭遇…

微信小程序学习(六):常用原生 API

&#x1f517;API官方文档 1、网络请求 wx.request({// 接口地址&#xff0c;仅为示例&#xff0c;并非真实的接口地址url: example.php,// 请求的参数data: { x: },// 请求方式 GET|POST|PUT|DELETEmethod: GET,success (res) {console.log(res.data)},fail(err) {console.…

msvcp140.dll丢失的解决方法,msvcp140.dll丢失下载办法

一、msvcp140.dll丢失或损坏的影响 系统更新影响 系统更新是导致msvcp140.dll丢失或损坏的常见原因之一。在自动更新过程中&#xff0c;可能会引入与现有应用程序不兼容的DLL版本&#xff0c;从而引发错误。根据用户反馈和技术支持数据&#xff0c;大约15%的msvcp140.dll问题…

2-3KW户储、家储逆变器设计资料

储能电源方案双向逆变器板资料&#xff0c;原理文件&#xff0c;PCB文件&#xff0c;源代码&#xff0c;bom清单。 bom表&#xff1a; PCB&#xff1a; 变压器电感 2-3KW户储、家储逆变器设计通常需要考虑以下几个方面&#xff1a; 输入电压范围&#xff1a;逆变器需要能够适应…

接口性能优化方法总结

接口性能优化是后端开发人员经常碰到的一道面试题&#xff0c;因为它是一个跟开发语言无关的公共问题。 这个问题既可以很简单&#xff0c;也可以相当复杂。 导致接口性能问题的原因多种多样&#xff0c;不同项目的不同接口&#xff0c;其原因可能各不相同。 下面列举几种常…

2024-6-18(沉默Spring,Springboot)

1.Spring小结 我们最后再来体会一下用 Spring 创建对象的过程&#xff1a; 通过 ApplicationContext 这个 IoC 容器的入口&#xff0c;用它的两个具体的实现子类&#xff0c;从 class path 或者 file path 中读取数据&#xff0c;用 getBean() 获取具体的 bean instance。 那…

oracle发送https请求

参照 https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_http.htm#i1025869 https://docs.oracle.com/cd/E11882_01/network.112/e40393/asowalet.htm#ASOAG160 https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_networkacl_adm.htm#ARPLS148 https://d…

Tailwindcss 提取组件

背景 随着项目的发展&#xff0c;您不可避免地会发现自己需要重复使用常用样式&#xff0c;以便在许多不同的地方重新创建相同的组件。这在小组件&#xff08;如按钮、表单元素、徽章等&#xff09;中最为明显。在我的项目中是图表标题样式如下&#xff1a; <div class&qu…

基于Openmv的色块识别代码及注意事项

在给出代码之前我先说注意事项以及需要用到的函数 1、白平衡和自动增益的关闭 打开白平衡和自动增益会影响颜色识别的效果&#xff0c;具体影响体现在可能使你颜色阈值发生改变 关闭代码如下 sensor.set_auto_gain(False) #关闭自动增益 sensor.set_whitebal(False) …

喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”

近日&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司&#xff08;简称&#xff1a;极限科技&#xff09;新获得一项国家发明专利授权&#xff0c;专利名为 “搜索数据库的正排索引处理方法、装置、介质和设备”&#xff0c;专利号&#xff1a;ZL 2024 1 0479400…

Node.js版Selenium WebDriver教程

目录 介绍 导言 Selenium基础 环境设置 使用npm安装selenium-webdriver模块 配置和管理浏览器驱动器 下载火狐 下载安装 webDriver 第一个WebDriver脚本 介绍 导言 在当今数字化时代&#xff0c;Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性&#xf…

我国人工智能核心产业规模近6000亿元

以下文章来源&#xff1a;中国证券报 2024世界智能产业博览会6月20日至6月23日在天津举行。会上发布的《中国新一代人工智能科技产业发展报告2024》显示&#xff0c;我国人工智能企业数量已经超过4000家&#xff0c;人工智能已成为新一轮科技革命和产业变革的重要驱动力量和战略…

【数据结构】链表的大概认识及单链表的实现

目录 一、链表的概念及结构 二、链表的分类 三、单链表的实现 建立链表的节点&#xff1a; 尾插——尾删&#xff1a; 头插——头删&#xff1a; 查找&#xff1a; 指定位置之后删除——插入&#xff1a; 指定位置之前插入——删除指定位置&#xff1a; 销毁链表&am…

【GD32】从零开始学兆易创新32位微处理器——RTC实时时钟+日历例程

1 简介 RTC实时时钟顾名思义作用和墙上挂的时钟差不多&#xff0c;都是用于记录时间和日历&#xff0c;同时也有闹钟的功能。从硬件实现上来说&#xff0c;其实它就是一个特殊的计时器&#xff0c;它内部有一个32位的寄存器用于计时。RTC在低功耗应用中可以说相当重要&#xf…

stm32学习笔记---OLED调试工具(理论部分和代码部分)

目录 理论部分 三种常用的程序调试方法 第一种是串口调试 第二种是显示屏调试 第三种是Keil调试模式 其他调试方式 OLED显示屏的介绍 OLED的硬件电路 OLED驱动程序中所包含的驱动函数 OLED_Init(); OLED_Clear(); OLED的显示函数 OLED_ShowChar(1, 1, A); OLED_S…

【教学类-36-09】20240622钓鱼(通义万相)-A4各种大小的鱼

背景需求&#xff1a; 用通义万相获得大量的简笔画鱼的图片&#xff0c;制作成不同大小&#xff0c;幼儿用吸铁石钓鱼的纸片&#xff08;回形针&#xff09;&#xff0c;涂色、排序等 补一张通义万相的鱼图 素材准备 &#xff08;一&#xff09;优质的鱼图片 &#xff08;二&a…

獭崎酱酒:传承百年酱香,品味经典之选

在中国白酒文化中&#xff0c;酱香型白酒以其独特的风味和精湛的酿造工艺&#xff0c;一直受到广大酒友的青睐。而在众多酱香型白酒品牌中&#xff0c;獭崎酱酒以其传承百年的酱香工艺和高品质的产品&#xff0c;成为了众多酒友心中的经典之选。    | | | |–|–| | | | 百…

英伟达能保住全球市值第一的桂冠吗?

内容提要 《巴伦周刊》认为&#xff0c;英伟达市值的迅速上涨是该公司可能难以保持市值第一桂冠的关键原因。另一个担忧是&#xff0c;英伟达的崛起主要基于一项单一技术——为人工智能应用提供动力的芯片和平台。一些人担心&#xff0c;如果购买英伟达产品的公司无法从投资中…

《机器学习》读书笔记:总结“第3章线性模型”中的概念

&#x1f4a0;线性模型(linear model) 线性模型(linear model) 试图学得一个通过属性的线性组合来进行预测的函数&#xff0c;即&#xff1a; f ( x ) w 1 x 1 w 2 x 2 . . . w d x d b f(\bold{x})w_1x_1w_2x_2...w_dx_db f(x)w1​x1​w2​x2​...wd​xd​b 向量形式写…