您的位置:首页 > 其它

数字逻辑综合工具实践-DC-10——CDC约束

2020-01-11 14:50 155 查看



【分频时钟input delay】


(找短的间隔)

【多时钟output delay】

记得要用add_delay

也是找短的

【时钟之间的uncertainty】

模仿两个时钟之间的偏移量
要用-from -to指定两个clock(注意是get_clocks而不是ports)

(千万不要在模块内部写分频时钟!
在SOC系统里面,会有一个模块叫CRM(clock reset manager)(或者CRC clock reset controller)时钟复位管理电路,所有的时钟、复位都由它产生。PLL经过分频之后给这个模块,外部复位电路接进来给这个模块之后,由它统一产生时钟和复位。)


指定创建一个分频时钟:create_generated_clock

-source:分频时钟的源是什么
注意这里要用到get_pins。问题:
这里的get_pins是如何知道名字的?
在我们的unmapped目录下保存的.ddc文件里面有!

对于Designware网表格式里面器件的命名方式是有一些规则的。
生成的寄存器往往是RTL代码里写的加上后缀”_reg”,寄存器的输出为Q

【逻辑互斥时钟】

DC不知道这两条交叉的路径从逻辑上是不存在的,这时候就要人为地设置伪路径:
set_false_path -from [get_clocks ####] -to [get_clocks ####]

或者使用逻辑互斥时钟命令:
set_clock_groups -logically_exclusive -group #### -grpi[ ####


如果不同时钟的信号在design内部有交互,就不能再用set_false_path命令了
希望DC:前面的优化还是要做的,后面的优化不必要做。
——约束得更紧一些,限定一个范围,-though。

【多时钟可选的寄存器】

对DC来说,有两个clock,默认情况下,DC会假设几种情况:
1、 CLK1发,CLK1采
2、 CLK1发,CLK2采
3、 CLK2发,CLK1采
4、 CLK2发,CLK2采
但实际只有1、4两种情况

还是通过上面那条命令:set_clock_groups -logically_exclusive -group #### -group ####

这里有个细节:set_app_var timing_enable_multiple_clocks_per_reg true——允许多个时钟。
DC默认寄存器只有是一个时钟。

【异步时钟】

两个时钟没有什么相位关系。
异步时钟如何去约束?

如果不做任何约束,DC会对跨时钟域的组合逻辑做优化(DC会做最悲观的预计),但是这样的优化是没有什么意义的。
通过异步设置:set_clock_groups -asynchronous -group #### -group ####(DC你别做,我自己来搞)
set_false_path 也可以
在设置-from -to的时候,如果异步时钟比较多,就不要去一个个地敲了,用foreach_in_collection函数。

【多周期路径】



通过设置一个多周期路径set_multicycle_path -setup 6 -from … -to …
(过六个周期再做setup time的检查)
一条语句是不够的,默认会在50的时候做hold time violation的检查,也就是说,组合逻辑的延迟必须在50到60之间,如果不够的话,会插入很多的Buffer(有可能是一个很复杂的逻辑),这其实是不必要的。


-hold 5表示从后往前数5个

仅仅通过约束来做holdtime violation是不够的。原因:

一定要在代码中用相应的控制信号。不然Y会采到很多的没用的信号。
需要一个使能信号,经过一个移位寄存器。
下面的移位寄存器的作用是产生这个使能信号。
另一个例子:

【一个很重要的命令:report_timing_requirements -ignored】

设置了逻辑伪路径、multicycle_path等等,都属于异常路径,要通过这个命令查看异常的路径(timing exception)是不是你想要的,否则的话有可能约束会加错。

【【实践演示】】
false path
multicyclepath

report_timing_requirements

  • 点赞
  • 收藏
  • 分享
  • 文章举报
万里独行田伯光大侠 发布了18 篇原创文章 · 获赞 4 · 访问量 650 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: