–不积跬步无以至千里
记录Verilog电路设计中的点点滴滴
对ASIC流程而言,功耗一直是一个重点关注的问题,时钟树的功耗消耗达到芯片动态功耗的30%~60%,因此,电路不工作时关断时钟是目前降低动态功耗最常用和最成熟的手段之一。
下面分享从RTL实现角度来降低动态功耗的一些“投机取巧”。
1、模块级时钟门控
对于一些功能较独立,通常用于处理某一特定命令流或数据流的模块,可以在其外部手动例化一个单独的时钟门控单元,用于实现模块级的动态时钟门控;当有新命令或数据到来时,自动打开时钟,模块正常工作;当命令或数据处理完成后,通过模块送出的idle或empty等指示信号,再整体关闭当前模块的时钟。
CLK_ICG_WRAP U_DMA_CLK_ICG(
.clk (sys_clk),
.gt_en (dma_idle),
.dft_gt_se (dft_glb_gt_se),
.clk_gt (sys_clk_gt)
);
DMA U_DMA(
.clk (sys_clk_gt),
.reset (sys_rst_n),
.idle (dma_idle)
);
可以看到DMA模块在dma_idle有效的时候代表DMA模块没有向AXI总线发起读取或写入即空闲状态,此时时钟门控ICG模块gt_en使能,输出时钟sys_clk_gt门控,关闭DMA模块的输入时钟。
2、寄存器级时钟门控
在RTL设计中,如果寄存器有翻转条件,那么这些寄存器在综合时便会被自动加上时钟门控。如下代码中cnt_add_en成为门控条件,只有其值为1时,寄存器时钟才打开。
always@(posedge clk or negedge rst_n) begin
if(rst_n)
cnt <= 5'd0;
else if(cnt_add_en)
cnt <= cnt + 1'd1;
end
需要注意的是,综合脚本里会有自动插入时钟门控的相关设置,会对时钟门控的自动插入造成影响:
-minimum_bitwidth minimum_bitwidth_value
该选项设定了自动触发clock gating插入的寄存器下限值,意思就是说只有当需要被门控的寄存器位宽至少为3bit时,才有可能为其插入时钟门控单元。由于门控单元自身也有功耗,所以当寄存器位宽过小的时候,再为其插入门控单元,有可能整体功耗反而会增大。
工具在综合时会对寄存器门控率进行分析,建议整体的寄存器门控率在90%以上。
以上就是有关功耗优化的分享内容,欢迎关注我的公众号:深入浅出玩转FPGA