深度解析Create_clock与Create_generated_clock的区别
文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点。点击进去后出现任何损失与社区无关。
最近朋友需要几位稍微资深点的数字后端工程师,如果刚好你想换工作,可以联系小编。据说薪资待遇非常丰厚 (据说可以开到年薪 80w),说的小编都有点心动,可惜小编今年已经给自己定了个目标——写公众号,分享数字 IC 后端设计实现方面的技术干货,至少写 100 篇技术类原创文章。So,机会就留给更需要的人吧。小编打算靠各位的打赏来实现年薪百万,是不是又在做白日梦了,呵呵!希望大家多多转发,多多打赏(确实很久没吃上鸡腿了)。好了下面进入今天的主题。
create_generated_clock
在数字 IC 设计中,芯片中各个模块的工作频率可能都不太一样。因此有了时钟产生电路(clock generation)。这个电路含有时钟切换电路,时钟分频,倍频电路以及 clock reset 电路。通常我们通过 create_generated_clock 来定义时钟分频和倍频电路后的时钟。
create_generated_clock 是用来说明 generated clock 与 source clock 的相位(边沿)关系。同时根据 source clock 找到 master clock 以及 source clock 和 master clock 的关系, 最终会确定 generated clock 和 master clock 的相位(边沿)关系。
在 genereated clock 的时候一定要明确 generated clock 与 master clock 的相位关系(rise->rise or rise->fall or fall->rise or fall->fall), 这些关系由桥梁 source clock 嫁接,所以有了 generated clock 和 source clock,以及 source clock 和 master clock 的关系。
如果根据声明找到的 generated clock 和 master clock 的关系和实际的关系不一致,则会造成一些分析错误。 比如静态时序分析 STA 的时候找不到 generated clock 和 source clock 相位关系,会将 generated clock 的 source latency 设置为 0。
如下图为一个简单的数字电路及其波形图。
create_clock -period 10 CLK
create_generated_clock -name CLKdiv2 \
-divide_by 2 \
-source CLK \
[get_pins Udiv/Q]
根据上面定义,generated_clock 是定义在二分频的输出端 Q 上,其 source 为 CLK。但是我们知道 Udiv 这个寄存器的时钟端 CK 与 CLK 是反相的(即相位差 180 度)。
根据声明,generated 和 master clock 的关系如下(工具会根据 source clock 找到 master clock,并确定 source clock 和 master clock 的关系,当前 source clock 即 master clock)。但实际电路是 source clock 和 master clock 是存在 180 相位差的,因此以上定义的 generated_clock 是不正确的。
正确的波形图应该如下图所示:
所以 UFF1 到 UFF2 的 setup 检查为 launch clock edge 为 T=5ns 时刻,capture clock edge 为 T=15ns 时刻 (默认为 single cycle path)。
因此,我们可以通过以下两种方法来定义分频后的时钟
1. 改变 generated clock 的 source,即让 generated clock 和 source clock 的路径唯一且单一(单一是指,声明的相位边沿关系和实际的相位边沿关系一致)。
一般做法就是将 source clock 设置在触发器的 clock 端。如下:
create_generated_clock -name CLKdiv2 \
-divide_by 2 \
-source [get_pins Udiv/CLK] \
[get_pins Udiv/Q]
这样 generated clock 和 source clock 的关系和声明的一致。 工具会根据声明的 source clock 找到它的 master clock,同时确定 source clock 和 master clock 相位相反的关系, 由此就确定了 generated clock 和 master clock 的关系。
2. 直接声明 generated clock 和 master clock 的相位边沿关系。如下:
create_generated_clock
-name CLKdiv2 \
-edges {2 4 6} \
-source CLK \
[get_pins Udiv/Q]
虽然这两种方法都可以用来定义 generated_clock,但是考虑到后期 review constraint 的便利性,强烈建议使用第二种方式来实现(实际项目中都是采用这种方法)。
create_generated_clock 有多个 master_clock 的情况
上文讲到了 create_generated_clock 的作用,提到工具会根据声明找到 generated clock 和 source clock 的相位(边沿)关系,同时根据 source clock 找到 master clock 顺便确定 source clock 和 master clock 的关系,最终确定 generated clock 的关系。但是如果有时候虽然确定了 master clock 和 generated 的相位(边沿)关系,但是 master clock 到 generated clock 的路径有很多的时候,也会导致 STA 分析问题。
create_clock -period 10 CLK
create_generated_clock -name CLKdiv2 -divide_by 2 -source FFdiv2/CLK UMUX/Y -master CLK -add
create_generated_clock -name CLKdiv4 -divide_by 4 -source FFdiv4/CLK UMUX/Y -master CLK -add
set_clock_groups -physically_exclusive -group {CLK} -group {CLKdiv2} -group {CLKdiv4}
此时,PT 时序分析报告如下:
可以知道 source latency 选择了不同路径
所以在声明 generated clock 的时候不仅要保证 generated clock 和 master clock 相位边沿关系和实际的一致,还要保证 generated clock 和 master clock 的路径一。
如下图,列出了可以声明唯一 generated clock 点。
同时考虑到选择器之前各个时钟间有 crosstalk,选择器之后没有 crosstalk,所以声明如下:
Create_clock -period 10 CLK
#####define divide_by_2,divide_by_4 clocks
Create_generated_clock -name CLKdiv2 -divide_by_2 FFdiv2/Q -source FFdiv2/CK
Create_generated_clock -name CLKdiv4 -divide_by_4 FFdiv4/Q -source FFdiv4/CK
#####create clocks arriving at MUX inputs
Create_generated_clock -name CLK_mux -combinational UMUX/A -source UMUX/A
Create_generated_clock -name CLKdiv2_mux -combinational UMUX/B -source UMUX/B
Create_generated_clock -name CLKdiv4_mux -combinational UMUX/C -source UMUX/C
#####define clock at FFdiv3
Create_generated_clock -name CLK_mux_div3 -divide_by 3 -source FFdiv3/CK -master CLK_mux -add
Create_generated_clock -name CLKdiv2_mux_div3 -divide_by 3 -source FFdiv3/CK -master CLKdiv2_mux -add
Create_generated_clock -name CLKdiv4_mux_div3 -divide_by 3 -source FFdiv3/CK -master CLKdiv4_mux -add
####apply physical exclusivity
Set_clock_groups -physically_exclusive
-group {CLK_mux CLK_mux_div3} \
-group {CLKdiv2_mux CLKdiv2_mux_div3} \
-group {CLKdiv4_mux CLKdiv4_mux_div3}
若直接将 CLKmux, clkdiv2_mux, clkdiv4_mux 省略,然后分别在 MUX/Y 端定义三个 generated clock,其 source 设定为 CLK, CLKdiv2, CLKdiv4,也是可以的。
思考题(2018 年某 SOC 公司校园招聘数字后端笔试题)
对于这道题,如果你还不会做,请给自己敲个警钟。
芯片 A 端口 OUT1/OUT2 分别接到芯片 B 的 D/CLK。芯片 A 端口约束如下:
create_clock -name CLK -period 10 -waveform {0 5} [get_pins U1/Y]
create_generate_clock -name GCLK -source [get_pins U1/Y] -edge {1 3 7} -master_clock CLK [get_pins U2/Y]
create_generate_clock -name OUTCLK -source [get_pins U2/Y] -master_clock GCLK -divide_by 1 [get_ports OUT2]
set_output_delay -max 8 -clock OUTCLK [get_ports OUT1]
set_output_delay -min 1 -clock OUTCLK [get_ports OUT1]
Q1: 请问对于芯片 B, D 到 CLK 的 setup/hold check 要求分别是什么?
Q2: 画出 CLK 和 GLCK 的波形?
Q3:如果要求从时钟源到 OUT1/OUT2 delay 等长,请问 constraint 怎么写?
小编知识星球简介:
在这里,目前已经规划并正着手做的事情:
-
ICC/ICC2 lab 的编写
-
基于 ARM CPU 的后端实现流程
-
利用 ICC 中 CCD(Concurrent Clock Data)实现高性能模块的设计实现(下周在知识星球上 release)
-
其他内容待定
在这里,各位可以提问(支持匿名提问,提问从此不再害羞),小编会在 24 小时内给予解答(也可以发表你对数字后端设计实现中某个知识点的看法,项目中遇到的难点,困惑或者职业发展规划等)。
反正它是一个缩减版的论坛,增强了大家的互动性。更为重要的是,微信有知识星球的小程序入口。星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有十四位星球成员,感谢这十四位童鞋的支持!欢迎各位铁杆粉丝加入!
相关文章推荐(不看保证后悔)
clock jitter 是否对 hold time 有影响?(文末有福利)
为什么时钟树上要用 clock inverter(min pulse width check)
PBA(Path Base Analysis)想说爱你不容易(静态时序分析基础篇)
【惊呆了!】你居然还在用 flatten 方式进行 timing signoff
合理的时钟结构能够加速 Timing 收敛(时钟树综合中级篇)
【机密】从此没有难做的 floorplan(数字后端设计实现 floorplan 篇)
听说 Latch 可以高效修 hold 违例(Timing borrowing 及其应用)
秒杀数字后端实现中 clock gating 使能端 setup violation 问题
教你轻松调 DCT 和 ICC 之间 Timing 与 Congestion 的一致性
Scan chain reordering 怎么用你知道吗?
数字后端实现时 congestion 比较严重,你 hold 得住吗?
Final netlist release 前,你应该做好哪些工作?
深入浅出讲透 set_multicycle_path,从此彻底掌握它
数字后端实现时 congestion 比较严重,你 hold 得住吗?
时钟树综合(clock tree synthesis)基础篇
好了,今天的码字就到这里了,原创不容易,喜欢的可以帮忙转发和赞赏,你的转发和赞赏是我不断更新文章的动力。小编在此先谢过!与此同时,吾爱 IC 社区(52-ic.com)也正式上线了。吾爱 IC 社区(52-ic.com)是一个专业交流和分享数字 IC 设计与实现技术与经验的 IC 社区。如果大家在学习和工作中有碰到技术问题,欢迎在微信公众号给小编留言或者添加以下几种联系方式进行提问交流。
打赏的朋友,请长按下方二维码,识别小程序进行打赏,欢迎砸钱过来!小编晚饭能不能加个鸡腿,全靠它了,呵呵!
作者微信: