数字IC设计技能篇之如何在RTL级降低功耗?

该文章已生成可运行项目,

数字IC设计技能篇之如何在RTL级降低功耗?

芯片前端后端过程中都会有对应的手段和工具做功耗的优化,本文目前只讨论前端在电路设计阶段如何降低功耗。

本文主要总结博主最近一个实际的芯片项目上,RTL级如何改变coding方式降低功耗。

数字IC设计技能篇主要总结了工作中遇到的实际问题及解决方案,欢迎一起交流共同进步;

PS:本文将持续更新。


问题背景

博主在一个实际芯片项目中,整体芯片功率偏高,需要在RTL级降低功耗,在此过程中发现了很多自己的问题。
RTL级虽然语法简单,但是想要符合符合低功耗设计的代码规范,还有需要注意的地方。
很多都是很细节很微不足道的地方,越简单和细节的地方在工程中越容易被忽略。


一、模块级的clk gating的加入

模块级的clk gating是第一选择,如果某个模块在某些情况下不会被用到,可以使用合适的控制信号做门控时钟;
比如SRAM中的bist模块,可以将SRAM中的clk一路直接给sram中的存储体用,一路使用bist_en信号做好gating后给bist模块用。
再比如一些debug模块,只在debug的时候才会使用,那么就可以使用一个debug_en做clk gating。

GCKHBQX1AS6 u_icg ( .Q(Q),  .CK(clk), .E(clk_gate_enable), .TE(TE))

GCKHBQXAS6是标准单元库中的一个clk gating单元,其中Q为输出的门控时钟,CK为原始时钟,E为门控时钟控制信号,TE是做SCAN时用的使能信号。
注意使能信号clk_gate_enable有时候和clk不是同一时钟域,要先经过cdc cell的同步。

二、模块中寄存器变量clk gating的加入

首先代码中如果是多bit的reg类型数据,一定要使用可以插入clk gating的编码风格;
下段代码是不能插入clk gating的代码:

  always @(posedge i_clk or negedge i_rst_n) begin
    if (!i_rst_n)
      a_cnt <= 4'b0;
    else if (a_cnt_clr)
      a_cnt <= 4'b0;
    else if (a_cnt == 4'd10) 
      a_cnt <= 4'd10;
    else if (a_cnt_flag)
      a_cnt <= a_cnt + 1'b1;
    else
      a_cnt <= 4'b0;
  end

上段代码不可插入clk gating的代码风格,因为有else;

   always @(posedge i_clk or negedge i_rst_n) beg
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这里不是麦当劳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值