Low power RTL 设计优化,同等工艺下让你的设计功耗更低!
会议推荐
不容错过的物联网芯片及通信技术研讨会!
来源:EETOP BBS 作者:yaya126
原文:http://bbs.eetop.cn/thread-636337-1-1.html
论坛里面讨论low power RTL前端设计的帖子好像不多,许多大牛的书上来就谈工艺,半导体结构,让我高山仰止,但也只能心向往之(实在有些看不懂)。
工艺的提升带来的收益可能远比RTL深度优化高,如TSMC 40LP vs TSMC 28HPC+, 后者基本上比前者面积小一半,速度快一倍,dynamic power小40~50%,
代价是leakage高3~4倍。在老工艺上如何绞尽脑汁优化设计,可能也很难达到这种效果。
但作为前端RTL designer, 一旦工艺选定,我们只能在自己的一亩三分地里面做到最好,本帖就此抛砖迎玉,结合自己的工作经验讨论下low power RTLdesign, 挖个坑,希望坛子里的大牛一起帮忙填坑。
刚入行做design时,考虑的是Area 和 speed,近些年来,power变成了越来越重要的指标,有时候更是牺牲Area和speed来换取power的收益,毕竟有些领域, 电池容量是很难增大的。
有人做过大体统计,降低功耗的方法和收益大体如下,对于前端RTL 设计,最好用的还是clock gating, 收益最显巨,代价最小,其他方法也能有可观的收益,具体还的依靠具体应用场景分析。
Power 主要消耗在:
1) combinational logic
2) sequential logic
3) memory
4) clock network
下面我将就下面几个方面展开讨论:
1.Improve clock gating efficiency.
a.Block level clock gating.
b.RTL clock gating. (重点)
2.Reduce data toggle rate.
a.FIFO vs PIPE
b.FSM coding style
c.Unnecessary reset.
3.Refine Memory Selection.
a.Area power balance
b.I/F bitwidth selection.
c.Depth selection.
4.Reduce memory accessing
a.Address caching.
5.Reduce logic size
a.Logic sharing.
b.Logic balancing
c.Divider optimization.
d.Reduce pipe line length
e.Hardmacro vs Register
f. Reduce bitwidth
g. Async reset vs non-async-reset.
6. Misunderstanding
1.Improve clock gating efficiency
a. block level clock gating
如果某个模块或者功能可以打开或关闭,且logic相对独立,则可以在这部分logic的时钟上加手动插入一个ICG,用模块是能控制ICG的开关,这样能最大限度的提升gating效率。
1. ICG最好选取驱动能力较大的,以便于驱动足够多的DFF。
2. ICG建议加一个wrapper,这样当需要替换其他工艺时,只需要将wrapper里的instance 换掉。
3. 综合时对此类ICG设置don’t touch
b. RTL clock gating.
Lowpower RTL综合的精髓就是把本该综合在D端的enable信号,综合到CLK端,这样只有enable有效才能释放一个clk使得D端数据传递到Q端。当D超过一定bit数,通常认定>=4bit能节省power, 为了达到这种效果,寄存器的赋值一定是条件赋值,示范代码和电路如下,
Mentor有power_pro能够帮助分析RTL,提取有效的enable,并完成代码的优化,但就我看下来,它优化过的代码可读性非常差,条件有时候也有冗余,导致过多的使能ICG,而且后续如果需要ECO,还需要购买它的formal工具,不然很难再改它的code.
此处我提供一个自己写代码分析的perl脚本,可以用来查所有代码中不符合low power RTL 代码规范的code, designer可以根据它的报告来优化赋值使能条件,已经过实际项目测试。
欢迎大家使用并提意见。(后面会解释为毛要查2d arry, initial和乘法器)
power_check.pl –v –f [filelist] –d [directory] -filter [N]–b –2d –init -mul [top.v]
-v or –verbose :print verbose log for debug.
-f or –file : input file list.
-d or –dir : set searching directory, script will findVerilog file under this directory.
-b or bak : back up previous result.
-filter [N] : filter <= N bits register error.
-2d or 2d_array :report2D register array.
-initial or init :report initial block
-mul :report multiplier info
Verfilog file : input Verilog file
产生结果文件,最重要的power_check.v。
运行时报告:
power check perl script: (登录论坛可下载)
power_check.rar (7.87 KB)
Low power RTL 理想代码结构:
1 always@(posedge clk or negedge rstn) begin
2 if(!rstn)begin
3 Q<= 'h0;
4 end
5 else if (condition_1)begin
6 Q<= D_1;
7 //other condition 2, 3, 4 …
8 else begin
9 Q<= Q; //better to remove this assignment, then data willbe kept.
10 end
11 end
错误代码的示例, 如果不管在什么情况下,总有D值需要打到Q, 使得即使综合出来ICG, 该ICG也不能关断。错误远不止下面几种,if/else if/else, case/default 等等
1. 没有赋值条件
1 always@(posedge clk) begin //”if-else”hierarchy 0, default is “else” block
2 Q <= D; //Error: no condition for Dataassignment.
3 end
2 . else 赋值
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else begin //hier1 “else” block
5 Q<=D; //Error: no condition for Dataassignment.
6 end
7 end
3. 多级条件中的else
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else if(condition1)begin //hier1 “else if” block
5 If(condition1_1)begin //hier2“if”block
6 Q<=D1_1;
7 end else begin //hier2“else” block
8 Q<=D1_2; //not report error, as it is in “else if”block.
9 end
10 end else begin //hier1 “else” block
11 If(conditon2_1) begin //hier2“if” block
12 Q<=D2_1;
13 end else begin //hier2“else” block, in hier1 “else” block
14 Q<=D2_2; //Error: no condition for Data assignment.
15 end
16 end
17 end
4. 下面这个例子不会报错。
1 always@(posedge clk or negedge rstn)begin //hier0
2 If(!rstn)begin //hier1 “if” block
3 Q <=’h0;
4 end else if(condition1) begin //hire1 “else if” block
5 Q<=Q; //”Q<=Q”ensure ICG insertion
6 end else begin //hier1 “else” block
7 Q<=D; //Not reportERROR as “Q<=Q” in “else if”.
8 end
9 end
会议推荐
不容错过的物联网芯片及通信技术研讨会!
(免费,10月17日,上海)
2. Reduce data toggle rate
a. FIFO vs PIPE
当数据需要穿过N拍delay后再使用时,我们通常有两种方法来实现, 1是讲数据打N级pipe,一级一级往传。 2是将数据存入FIFO, 到后级需要使用时直接读出来。 两种方式VLD都需要单独传递。
对比PIPE的方式,FIFO的方式有额外地址计算比较的开销,但每个数据只需要读写各一次,不像PIPE,数据需要在整个PIPE中shift一轮,FIFO 方式每个寄存器的toggle rate将大幅下降。 假设数据的toggle rate 位Tr, N级pipe的 toggle 为N*Tr, FIFO 为 Tr。
如果由于FIFO输出数据+后续计算timing不满足,可以考虑缩短一级FIFO,最后一级仍由PIPE输出。
根据我在TSMC 40nm和28nm下PTPX仿真结果分析。(具体数据可以单独找我要)
结论:
FIFOreplace PIPE for power reduction:
when ADDR >=2 bit , DATA should be >=4 bit, DATA 越宽,级数越深,FIFO power 收益越高,但有额外的面积开销。
上面脚本提供命令 power_check.pl -2d -d . 来把代码中所有的 2D array 找出来,有些同学喜欢把PIPE 赋值写成下面的样子
for( i= 1 ; i< N; i ++) begin
if(VLD[N-1])
Array[N] <= Array[N-1] ; //这个代码虽然是有条件赋值,但如果符合上面的条件,可以考虑换成FIFO.
end
b. FSM code style:
状态机常用编码有3种:
1. one-hot: 如 3'b001->3'b010->3'h100, 状态个数 = 比特位宽一样, 每次状态变化,最多只有两个bit变化。
2. 2进制编码, 如 3'b000->3'b001->3'b010->..., Nbit 能支持 2exp(N)中状态。
3. 格雷码, 3'b000->3b001->3'b011-> 3'b010-> ... 如果按照顺序变化,每次只有一个bit跳变。
总体来说,one-hot使用bit数较多,power最差,如果状态跳变有一定顺序,采用格雷码编码能降低toggle rate.
40LP下4 bit FSM, 16个状态,从4‘h0 跳转到4'hf’’的状态机, 功耗面积对比结果如下。
即使状态机不能完全按照格雷码编码,把频繁跳转的状态用格雷码编码,也能获得举手之劳的power收益。尽量少用one-hot编码。
FSM
power
area
Gray code
8.697e-06
110.95(best)
One-hot
1.023e-05
166.69
binary
9.984e-06
108.48
c. Unnecessary reset:
对于控制寄存器,清理掉残余状态很多情况下是必要的, 但对于data寄存器,数据残余可以不要复位。
如果只在read_en的条件下把有效的数据写入rdata, 完全没有必要在!read_en的时候复位寄存器,这个做只是白白增加toggle rate.
If(read_en) rdata <= read_data
Elseif(!read_en) rdata <= ‘h0; //Don’t reset rdata to all 0.
如果写了这种语句,即使用power优化工具,或者上面那个脚本,都是没有办法来优化的, 总的来说,寄存器使能调件越精确(打开ICG几率越少), 越有利于power 优化。
会议推荐
不容错过的物联网芯片及通信技术研讨会!
(免费,10月17日,上海)
3. Memory Selection
SRAM的选择有很多讲究,我们需要看throughput, size, width 来决定到底是选1p, 2p, spra 和 1prf,通常情况下,在满足速度要求的情况下,挑选面积小的。 在这里我提一种新的挑选方法,即在速度达到要求的前提下,挑选power, area 性价比最高的。
当我们选的面积最小的为基准时,看面积增加的百分比和power减少的百分比的差值,假设area 和power对性价比评估各占50%的权重,如面积增大10%, 但power 下降20%,则认为性价比变好了,如果只换来5%的power下降,则认为性价比变差了。
当然我们可以调整area/power的权重来改变挑选规则,极端情况下,把area权重设置为100%就是通常下挑面积最小的那种方法。
那么,我们只需要用memory生成工具,将满足尺寸的sram按照不同的rf/sram segment_option ,MUX,Width, Bits 用脚本全部生成一遍, 用上叙规则挑选最优,有些面积相差不大的sram,power差20~30%.
除了同样存储大小的sram, 位宽扩大一倍,深度减小一半的也可以考虑,如256x10,可以考虑生成128x20,位宽大一倍,不意味着每次读写power大一倍,但读写次数如果减少一半,这样也能带来可观的收益。
另外同样位宽,深度减半的也可以考虑,(这个从我做的实验看,收益不如double位宽的)
总之,挑sram不光考虑面积,可以尝试不同的选择,更多的考虑性价比。
Sram面积可以直接从生成文件里读出,但power需要手工计算:假设standby power 不考虑,只考虑read/write power, 我们可以从生成文件中得到每次读写所需要的power,Pwr, Prd, 然后根据sram使用的特性,比如在一定时间内(周期内),是多少写多少读,乘上单次读写的对应的power,就可以大体估计sram的power.
另外强烈建议在生成的sram 外面加个wrapper, 并手动插入一个ICG,只有在RD或者WR的时候才打开ICG,通常情况下,sram的clock是被gating掉的。
4. Memory Address Caching
Address caching:
当sram使用场景需要对同一地址多次查表时,可以考虑将上一轮读地址存下来,于新地址比较,如果在上次读之后没有对该地址的写操作,且新地址等于寄存的地址,则可以省略该轮读访问。
5. Reduce Logic size
Area大通常意味着power大,站在save power的角度,减少面积,减少逻辑单元,和降低功耗的方向是一致的。
Logic share:
有些逻辑的throughput要求不高,一份逻辑分时进行N次计算,等效于N份逻辑在一定时间内计算一次。复用之后计算总量一样,但静态功耗会降低。当然需要考虑1份逻辑N次计算带来的副作用,计算latency加长是否可以接受。
Multiplier:
乘法器,在这特指变量乘变量,如果是变量乘以常数,综合工具都是综合成加法器,不在考虑范围内。
同等bit数,乘法器比加法器大许多,对于每个乘法器,我们都
1) 需要仔细review它的使用是否必须,
2) 使用的时候位宽是不是可以降低,乘法器位宽严重影响综合面积和timing, 在计算的时候,即使是signed的数,也不要轻易添加N bit 最高位(符号位),建议使用verilog 2001 语法, 用 $signed(A[dw-1:0])* $signed(B[dw-1:0]), 千万别写成 {{(dw){A[dw-1]}}, A[dw-1:0]}*{{(dw){B[dw-1]}}, B[dw-1:0]}, 虽然输出位宽为 2dw。
上面提供脚本 power_check.pl –mul -d . 可以抓代码中所有的乘法器来集中review)
3)乘法器是不是前后组合逻辑很多,造成综合工具为了meet timing而产生一个超级并行(巨大)的组合逻辑(这个在logic balance也会提到),
4)“乘加”逻辑是不是可以转变成“加乘”逻辑, 这里“乘加”指的是A*mul 和B *mul 乘完后寄存后再加,还是(A+B)*mul 后再寄存, 如果在同一拍内,即使写成A*mul+B*mul, 综合工具也会优化成(A+B)*mul, 但建议在代码上体现先加后乘。
下面是4bit与15bbit “乘加” ,“加乘”面积比较, “乘加”面积几乎大一倍
ADD_before_Mul or Mul_before_ADD
Area(um2)
Multiplier number
ADD_MUL =bit4*(bit15+bit15)
543
1
MUL_ADD =bit4*bit15+bit4*bit15
919
2
Divider optimization(N/M):
乘法器通常1拍内完成,但除法器少有能1拍完成的。乘法我们可以直接在代码里面写“*”号,综合工具通常能给我们满意的结果,但除法器,极少数情况下我们直接写“/”,大部分情况我们需要单独inst 除法module.
标准除法器(N和M 都是变量):
基本的设计思路是移位减,如果每个cycle计算被除数1bit, N/M, 我们需要N拍,如果每个cycle 2bit则需要(N+1)/2 拍,这样的除法器面积都不大,但计算latency长。同时EDA公司也提供的design-ware除法器,速度更快,面积也更大。当然还有一种查LUT表的除法器,但我没用过,不好评价
特殊除法器:
1)除数是2的幂次,如2, 4, 8,很多人会想到直接移位,对于被除数是正数来说移位绝对正确,但如果被除数是负数,除法结果收敛到0,移位结果收敛到-1,
如 -5/64=0, -5 == 5B'1-1011, 右移后,变成5b'1-1111,= -1,两者结果不同。
判断高位是都全为1,如A[m,0]>>n, 需要确认A[m,n]的情况
|A[n-1:0] !=1'b0? A[m,n] + 1'b1 : A[m,n];
2)除数是常数,最好为 (2的幂次+/-1), 如5,,7,可以考虑泰勒展开,用2的幂次和来近似。
如下 用最近的2的幂去近似的除,将余数和商迭代知道其和小于除数。 Div/(2^X - K)
step1 Div/2^X = M0 ... R0 if K*M0 + R0 >=2^X - K, to step 2, else M= M0,R=R0+K*M0
step 2 (K*M0+R0)/2 …
如下
100/7 =14 ...2
step 1 100/8 = 12 .. 4 if (12+4)>= 7, to step 2
step 2 (12+4)/8 = 2 ...0 if (2 +0 )<7 . result = 12 +2 ...2.
3)除数是常数,是不是可以用近似的乘法来代替,比如先计算X= 1024/M, 再用
X*N/1024来还原成N/M. 当然这个除法会有精度损失需要考虑。
网上还有相关文档针对特殊除法器的优化,这个需要具体应用具体分析。
正因为除法器在面积和latency上的差异非常大,特别是长latency的除法器,很容易成为计算逻辑中的瓶颈,别的逻辑都在等着它的结果才能开始后面的计算。因此在选择不同除法器时,需要考虑整个data-path的开销,减少1个cycle的除法计算,是不是能缩短整个path 1 拍,可以节约多少寄存器。
当data-path不关心除法latency的时候,直接选1bit移位减的除法器area和power最优,如果能结果逻辑复用效果更佳。
Attend Mentor low power RTL design and HLS seminar
上午是powerpro 的AE讲它们如何省power,如何评估power, 稍后和大家分享。
就我看来:
Automatic power reduction: RTL is very hard to understand after modification.
power estimation: to get real data, prefer PTPX with fsdb, (saif is not accurate, especially when estimate memory)
Guilded Power estimation: 基本就毛估估了。
不过这可能是我的偏见,看看今年他们有什么更新。
hls_bluebook.pdf (14.29 MB)
mentorpaper_98423.pdf (2.42 MB)
mentorpaper_102112.pdf (1.35 MB)
mentorpaper_94085.pdf (589.09 KB)
(登录论坛可下载)
今天mentor seminar分享的一些资料, 部分资料还没收到,low power RTL design, 工具虽然能帮你查漏,但save power还的有自己基本的理解,并在设计中灵活运用,如果代码写的好,它是没有水平来优化你的code的。
powerpro 虽然功能强大,3大功能,但在我看来,
1. power estimation 不如PTPX, power sign-off还是要ptpx,也许他便宜点。总之power 估计这东西,garbage in garbage out, 要想估的准,输入就的准,前期毛估估,与最终结果随便差30%
2. automatic RTL power optimizaiton: 我是不会让他来改我的code,改了看不懂,做ECO后还要买他的formal工具slec.
3. guiilded RTL power optimization: 可以看看他的手册,白皮书,学习下理念,他提到的"shift register vs circular buffer"理念 和我的“ pipe vs FIFO ”不谋而合,具体操作中,大家还是在自己的工艺下用脚本跑一下比较,看看到底在什么深度和data-width下fifo才有收益。 一般应用,我上面提供的脚本已经能解决大部分问题。
HLS: 如果是low power RTL design, 建议还是不要用,这东西就是给软件人员写硬件code用的,估计很多情况下,你一句下去都不知道底层实现的是什么。 他举例也是 nv 的 tergra 1, 当年这个不就是高功耗的代表,发热感人吗。
如果是为了拉风投,做demo,快速出产品,可以考虑HLS, 这比写code 还是快多了。
会议推荐
不容错过的物联网芯片及通信技术研讨会!
(免费,10月17日,上海)
Reduce pipe-line length:
在写RTL前,我们应该知道最基本的计算单元(*,+,>= 等)的延时和面积,这个数据可以通过对基本计算单元在SDC中约束紧和松的综合得到。在tight的情况下,我们能看到综合工具把逻辑并行展开,面积非常大,也许还不能meet timing。在loose的情况下,逻辑串行都能满足timing要求。两者面积相差3~6倍都不稀奇。
Reduce pipe-line, 要求对基本的组合逻辑delay有基本的认识,合理的排列pipe-line,同时注意关注data-path converge点,看看data-path长短的瓶颈在哪条分支上,压缩关键分支是否能带来整个path的缩短,以及这样带来的好处。
当然预估datapath的延时和面积的影响,这个要求非常高,我自己也难做的很好,一般为了timing容易meet,大家可能都会在设计是留足余量,导致path比理想状态下长不少。但我有一个想法,也许可以帮大家找到最合理的pipe-line length,我准备整个脚本来帮忙实现这个功能。(仅针对算法模块,控制少,计算多)
1.先直接照搬C code, 不考虑timing,把中间计算逻辑RTL写出来,最后输出用寄存器,建议写出参数化的方式,方面后续re-timing.
2.进行tight/loose两轮综合,这样我们得到组合逻辑的最大面积(最小delay)和最小面积(最大delay)。
3.通过最大delay/clock_period, 得到最小的pipe-line length。通过最小delay/clock_peroid,得到最大的pipe-line length
4.用re-timing的方式,从最小pipe-line length开始,调整pipe-line重新综合,不停找面积的拐点,我期待看到的结果是,中间有个面积最小的拐点,或者直到pipe-line length 最大,面积单调递减。
5.面积最小的pipe-length就是理想的结果。
如上图,纵轴Z是面积,X轴是频率, Y轴是PIPE length, 在不同的频率下(不同的截面),不同的pipe面积曲线是图上离散的点,我们求的就是面级最小解。
我们可以用这个结果来指导实践RTL design, 达不到最好可以采用次好,但总比没有准备直接上手要好。
如果脚本准备妥当,只是花几轮综合的时间,我觉得可行性还是有的,反正都是机器跑,不然这种设计全凭经验,没有benchmark来check quality.
我还想是不是还可以用HLS的综合结果来当benchmark,算法c code 去综合,看看catapuls给出来的建议是多少级,再和上叙re-timing循环综合的最优结果比,差多少,如果两者接近,证明HLS的建议可
Reducebit width:
最简单的比如 4 个10 bits数相加,也许就会有人得出需要13bit的结论
C code: F= A+B+C+D
Wire [10:0] F_pre1 = A[9:0] + B[9:0];
Wire [11:0] F_pre2 = F_pre1 + C[9:0];
Wire [12:0]F = F_pre2 + D[9:0]; //sum of four10bit only need 12bit result.
特别是有些计算,如果能够通过简单推导或者合并降低位宽,那会既省面积又省power.
Hardmacrovs Register:
Tsmc 40 nm工艺下面,简单对比单个寄存器和sram的大小,
SDFCNQD1BWP 5.2u2 (Min size )
SDFCNQD2BWP 5.9 u2
For 1prf128x36=5458u2, each bit is 1.18u2
Forsparm576x32=12884, each bit is 0.69u2
Forspram 896x48=23515u2, each bit is 0.546u2
通过查手册,知道单次读写的power, 以便在大量数据需要寄存时,分析到底是用hardmaco 还是 DFF.
Logicbalancing:综合工具在时序紧的时候更多的用并行逻辑来减少计算delay, 在时序松的时候用串行逻辑来减少面积,如果我们在写code的时候能把一些不在关键路径上的逻辑拆开,这样能优化面积,同时减少power.
如下图,非关键路径第一拍逻辑多,第2拍逻辑少。
balance后的结构如下:
一个具体实例如下:两个时序很紧的加法器balance后area power的变换。 area power都有下降
Style
Power
area
No-balance
6.491e-06
729.06
Balance
5.618e-06
373.08
当然,如果为了balance 逻辑需要寄存大量的中间结果也是不合适的,上面power没降这么多是因为增加寄存器hold中间结果,这个最好能有工具提供优化提示。
会议推荐
不容错过的物联网芯片及通信技术研讨会!
(免费,10月17日,上海)