数字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

最低0.47元/天 解锁文章
2769

被折叠的 条评论
为什么被折叠?



