版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bb2hh.blogbus.com/logs/22268175.html
注明:如需转载,请注明作者出处,谢谢~,Author:pythonlong
以下根据资料和个人体会整理,如果错误,疑问欢迎请指正,讨论!!
上图是一个典型的门控时钟电路。但是这种门控时钟无法避免的要受到gate的影响,容易产生毛刺,除非你严格限制gate的输入。
一般常用的门控时钟是下面这种形式
为了得到稳定的gclk高电平,我们使用clk的高电平来锁存gate的值,如果gate是低电平,那么gclk保持低电平,如果gate为高电平,锁存后,gate_out为高电平,与clk运算后,可以得到稳定的gclk高电平。
考虑上图中的各种延迟,分析门控时钟的建立时间检查和保持时间检查。
对于门控单元建立时间的检查路径:
门控的建立时间检查的路径中,因为clk_latch为低电平,所以理想化的可以认为,gate直接传输到gate_out,但是实际要考虑点点延迟。可以简化成图一
考虑到延迟的时序图:
由时序图可以知道gate的上升沿或者下降沿到clk_and的时间应该长些比较好。
对于门控单元保持时间的检查路径:
考虑到延迟的保持时间检查:
由上图可以知道clk_latch的延迟如果比clk_and延迟大点,那么电路会更稳定些。
门控时钟综合:
综合工具内置时钟故障分析,但是有时候会产生不正确的分析。虽然如此,由于优化算法比较强大,仍然可以得到理想的结果。
1.
首先要开启时钟故障分析
set_clock_gating_check –setup
$setup_time -hold $hold_time
$setup_time 和$hold_time如上图的时序图所示
2.
建立时间分析
如上图所示,综合工具会认出门控时钟里的锁存器,同时标识这条路径为锁存路径,分析的时候会将这条路径分为2部分。
第一条,
上级输出到锁存器的输入端d
第二条,
锁存器输出端q到门控逻辑的输入单
综合工具会实现分析第一条路径,因为这个锁存器的缘故。所以会发生前级向锁存器borrow time的情况,出现这种情况的时候,即使第一条路径满足时序,可能的violations还是会产生在第二条path上。
这里介绍下latch-base设计中的borrow time
上图是基于latch的设计,黑色时钟线代表没有borrow time的时序图,
粉红和红色部分代表borrow
time。
对于latch2进行建立关系检查。由于logic的8.9ns的延迟,latch1输出至少要经过8.9ns的时间才能到达latch2。但是根据时序图可以知道clk1,和clk2的关系,当latch2 capture 数据的时候,latch1的数据还没有到。这样就会产生逻辑故障。
为了修正这个逻辑故障,综合工具会borrow time,以满足建立时间关系,如上图中的红色和粉红色部分。综合工具会使clk1的低电平持续的时间够长,那么就要使clk2的低电平够端,只要满足setup
relation就可以。
如果latch2还有下级,那么我们可以知道,由于上级的borrow time,下级有可能会产生一些time violations。
这个时候我们就要用set_max_time_borrow
限制综合工具借入更多的时序,为了满足setup relation,综合工具会最大优化logic部分。
如果将上图放入到门控电路中,如下:
结合borrow time的时序图,我们分析下门控时钟里面可以设置的最大borrow time:
上图是borrow time之后时序图,由时序图我们可以知道:
必须满足的时序关系:
T2-T1>Tcq_latch+Tcell_delay+clock_uncertainty
如下图红色路径所示
所以borrowTime<Tphase
– Tcq_latch –Tcell_delay –Tuncertainty
其中Tphase为clk的低电平时间
如果综合过程中gclk上insert buffer或者insert delay,这些延迟也要考虑进去,以及后端过程中可能引入的buffer delay。
看一例:
module gate(clk, gate, din, qout);
input clk,gate;
input
[7:0] din;
output [7:0] qout;
reg
[7:0] qout;
wire
gclk;
//assign gclk = clk & gate;
always@(posedge gclk)
qout <= din;
reg
gate_out;
always@(clk)
if(!clk)
gate_out <= gate;
assign gclk = clk & gate_out;
endmodule
DC综合脚本:
set lib $env(DC_LIB)
set target_library "slow.db"
set link_library "*
$target_library"
set search_path ". ../src ../scripts
$lib"
analyze -format verilog gate.v
elaborate gate
uniquify
link
check_design
create_clock -period 100 [get_ports clk]
set input_exp_clk [remove_from_collection
[all_inputs] [get_ports clk]]
set_input_delay 60 -clock [get_clocks clk]
$input_exp_clk
set_output_delay 30 -clock [get_clocks clk]
[all_outputs ]
set_clock_gating_check
-setup 3 -hold 0
compile
综合结束后,setup时序分析:
1.
门控逻辑AND2的setup分析:
report_timing -delay max -nets -from gate_out
上图中可以看到到达时间是从clk的下降沿计算的,
以及要求时间是从上升沿开始,同事考虑到clock_gating_check中的setup设置
1.
setup的borrow time 分析
report_timing -delay max -nets -to
gate_out_reg/D
有dc综合脚本的设置,以及上图report:
到达时间是60,由于clk脉冲宽度是50,为了保证输入端建立时间满足,需要向ednpoint borrow time,上图中可以看出,time borrowed from endpoint为10,使要求时间变成60,从而slack为0,满足时序要求。
现在综合脚本中加入
set_max_time_borrow 7 [get_clock clk]
从新查看setup 的borrow time分析:
report_timing -delay max -nets -to
gate_out_reg/D
文章评论(0条评论)
登录后参与讨论