数字IC设计学习笔记_低功耗设计2_门控电路

数字IC设计学习笔记

门控电路

1 作用
2 门控时钟的结构
3 门控时钟的选择
4 门控时钟电路的RTL

1 作用

  • 时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗40%。加入门控时钟电路后,减少了时钟树的翻转,节省翻转功耗。同时,由于减少了寄存器时钟引脚的翻转行为,寄存器的内部功耗也减少了。可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。

2 门控时钟的结构

(1). 与门门控

1). 原理图
在这里插入图片描述

2). 波形图

在这里插入图片描述

3). 缺点

  • EN=0,正常;EN=1,产生毛刺
  • 原因:EN是不受控的,随时可能跳变,输出易产生毛刺
  • 解决方法:(EN在CLK的高低电平间保持不变)
    1>. 触发器: EN用CLK寄存,输出以CLK为基准
    2>. 锁存器:EN用锁存器所存的输出,以CLK为基准

(2). 锁存器门控

1). 原理图
在这里插入图片描述

2). 波形图

在这里插入图片描述

3). 缺点

  • 1>. 锁存器与与门相隔远:到达与门的时钟与到达锁存器的时钟延迟差别大毛刺‘
    2>. 锁存器与与门相隔太近:可能不满足锁存器的建立时间锁存器亚稳态

  • 原因:
    1>. A点的时钟早于B点:skew>delay毛刺
    解决办法:控制clock skew,clock skew < latch delay(锁存器CLK-Q的延时);
    2>. B点时钟早于A点:|skew|>EN setup
    (D-Q) 毛刺
    解决办法:控制clock skew, clock skew < EN setup(D-Q的延时)在这里插入图片描述

锁存器门控更适用于ASIC,原因:1. FPGA内部没有锁存器资源,需要利用其他的组合逻辑外加寄存器实现,不经济;2. 锁存器本身的特性无法进行时序分析,不易排查错误。

(3). 寄存器门控

1). 原理图
在这里插入图片描述

2). 波形图

在这里插入图片描述

3). 缺点

  • A早于B:无毛刺
    B早于A:若时间差很多,约半个周期:有毛刺;(DFF输出会delay一个周期,故很难发生)
    若DFF1不满足setup 亚稳态

适用于FPGA,只有FPGA工程需要大量的降低工号是,才有必要引进门控时钟。

3 门控时钟的选择

  • 结论:SoC内使用最多的是锁存器门控电路。
    原因
    1>. 实际SOC芯片中,门控时钟会由工艺厂商制作成一个标准单元锁存器结构的线延时问题不存在,且可控,不变。可以通过挑选锁存器和增加延时,满足锁存器的建立时间。
    2>. 面积问题:DFF=2* D-Latch
    注:若在FPGA,寄存器+setup约束更加稳妥

4 门控时钟电路的RTL

1). 综合工具可自动插入门控时钟;

在这里插入图片描述

  • 注:
    1>. 插入CG,不再需要MUX,若D为多比特面积减小;
    2>. 插入CG,D为单比特,节省的功耗比较小,面积可能比MUX大;若D为32bit,节省的功耗比较多
    3>. DC默认D的最小位宽是3.若>3,插入CG就会有收益
    4>. DC命令:set_clock_gating_style -minimum_bitwidth 3

2). 代码: (锁存器门控电路)

	always@(posedge clk_s or negedge rst_n)
		if(!rst_n)
			dout <= 1'b0;
		else if(en)
			dout <= din;
	always@(posedge clk_s or negedge rst_n)
		if(!rst_n)
			dout <= 1'b0;
		else if(en)
			dout <= din;
		else
			dout <= 1'b0;
  • 第一个RTL代码能够在综合时自动插入CG电路;

  • 第二个代码RTL不能综合成插入CG的电路;
    原因:en=0时:dout也会一直变化,无真正的数据有效只是信号,门口空始终的意义在于,当数据无效时,保存寄存器的值,所以无法综合出CG电路。
    :在不用时将数据设置为0并不能减少功耗,保持不变才能减少变化,降低功耗。

  • FPGA代码实现:(寄存器门控电路)

module clockgating_r0(
   input clk_s,
   input rst_n,
   input en,
   
   output wire clk_en
);
   reg en1;
   
   always@(posedge clk_s or negedge rst_n)
   	if(!rst_n)
   		en1 <= 1'b0;
   	else 
   		en1 <= en;
   		
   assign clk_en = en1 &  clk_s;
   
endmodule

在这里插入图片描述

学习内容源于: https://mp.weixin.qq.com/s/sFpjTx1kVhxzhdWFfbioaQ

【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~

猜你喜欢

转载自blog.csdn.net/weixin_50722839/article/details/108823499
今日推荐